ACL2021 | 对比学习8篇论文一句话总结

2022-04-01 19:44:36 浏览数 (1)

这是对白的第 88 期分享

作者 l 不是大叔 出品 l 对白的算法屋

大家好,我是对白。

今天给大家总结了ACL2021中关于对比学习的论文,一共8篇,每篇都通过一句话进行了核心思想的介绍,希望对大家有所帮助。

1. CLINE: Contrastive Learning with Semantic Negative Examples for Natural Language Understanding

  • 用同/反义词构造正负例,三个损失:①MLM;②预测每个token是否被替换,0/1二分类;③对比损失,即正例拉近,反例远离。

2. Self-Guided Contrastive Learning for BERT Sentence Representations

  • 两个bert构造正负例:①一个参数不参与优化的Bert,对所有层的transformer隐藏层做maxpooling,即(batch,len,768)->(batch,1,768),再取均值作为句子的输出表征;②一个参数优化的bert,直接用最后一层[CLS]作为句子表征;来自同一句话的①②表征构成正例,不同句子的①②表征作为负例。

3. ConSERT: A Contrastive Framework for Self-Supervised Sentence Representation Transfer

  • 搞了四种数据增强构造正例:①token_embedding随机加一些噪声;②token_embedding索引变换;③随机让token_embedding的一些token失活(整行置0)④整个token_embedding随机失活。

4. DeCLUTR: Deep Contrastive Learning for Unsupervised Textual Representations

  • 同一篇文章两个句子是正例,不同文章两个句子是负例。

5. Contrastive Instance Learning Framework for Distantly Supervised Relation Extraction

  • 同一类别的句子都放到一个词袋里面,从这个类别词袋里面挑些不重要的词对这个句子做插入/替换作为正例,其它类别词袋全体作为这句话负例。

6. SimCLS: A Simple Framework for Contrastive Learning of Abstractive Summarization

  • 第一阶段直接生成文档,第二阶段用对比学习:拉近所有生成文档和原文距离,并且希望第二阶段的Loss能让所有候选文档按照第一阶段打的分进行排序;

D是原文档,s_hat是标签,h是打分函数,具体操作就是拿标签和生成文档的[cls]计算相似度,si···sj都是生成文档,按得分依次降低排序,所以sj分数一定小于si,按照上面的loss最小化的话,i到j的排序也必须是从大大小,希望模型在没有参考文档的情况下为候选文档进行排序。

7. Modeling Discriminative Representations for Out-of-Domain Detection with Supervised Contrastive Learning

  • 两个损失,①类别交叉熵损失预测句子类别;②对比学习损失——正例对来自同一个类别的数据 负例是不同类别的数据。

8. Contrastive Learning for Many-to-many Multilingual Neural Machine Translation

  • 同样一句话翻译成不同语言虽然表示不同,但是在人的意识里面实际的语义应该是相似的——用多语种来构建正负例。

补充前置知识:

SimCSE:本质上来说就是(自己,自己)作为正例、(自己,别人)作为负例来训练对比学习模型;(同一句话过两次encoder,经历过两次不同的随机dropout的输出作为正例)

损失函数:

其中:

① 因为是无监督,所以y_true为输入为None,代码块内的y_true是下面③人为构造的;

② 每个batch内,每一句话都重复了一次。句子a,b,c。编成一个batch就是:[a,a,b,b,c,c];

③ 若idxs_1是[[0,1,2,3,4,5]],则idxs_2是[[1],[0],[3],[2],[5],[4]],人为构造的y_true就是:

代码语言:javascript复制
y_pred = K.l2_normalize(y_pred, axis=1)
# L2正则,降低奇异值影响

similarities = K.dot(y_pred, K.transpose(y_pred)) 
# batch内每句话和其他句子的内积相似度

similarities = similarities - tf.eye(K.shape(y_pred)[0]) * 1e12 
# 自身的相似度置0

similarities = similarities * 20
# 将所有相似度乘以20,只是单纯扩大loss范围

loss = K.categorical_crossentropy(y_true, similarities, from_logits=True)
# 优化目标,普通的六分类问题

SimCSE有监督的话,正例是(正样本两次drop),负例包括:①(正样本drop,其它正样本drop)②(正样本drop,负样本drop)

R-Drop:用KL散度来计算两次drop值,期待不同drop输出的结果趋向于完全一致。

你好,我是对白,清华计算机硕士毕业,现美团算法工程师,拿过8家大厂算法岗SSP offer(含特殊计划),薪资40 W-80 W不等。

高中荣获全国数学和化学竞赛二等奖。

本科独立创业五年,两家公司创始人,拿过三百多万元融资(已到账),项目入选南京321高层次创业人才引进计划。创业做过无人机、机器人和互联网教育,保研清华后退居股东。

我每周至少更新三篇原创,分享人工智能前沿算法、创业心得和人生感悟。

0 人点赞