这是对白的第 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高层次创业人才引进计划。创业做过无人机、机器人和互联网教育,保研清华后退居股东。
我每周至少更新三篇原创,分享人工智能前沿算法、创业心得和人生感悟。