EMNLP 2021SimCSE:句子嵌入的简单对比学习 && CVPR 2021理解对比学习损失函数及温度系数
Posted 小爷毛毛(卓寿杰)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EMNLP 2021SimCSE:句子嵌入的简单对比学习 && CVPR 2021理解对比学习损失函数及温度系数相关的知识,希望对你有一定的参考价值。
1. 介绍
SimCSE(Simple Contrastive Learning of Sentence Embeddings)是一种简单在没有监督训练数据的情况下训练句子向量的对比学习方法。
这个方法是对同一个句子进行两次编码。由于在 Transformer 模型中使用了 dropout,两个句子表征的位置将略有不同。这两个表征之间的距离将被最小化,而同一批中其他句子的其他表征的距离将被最大化(它们作为反例):
- 目标函数 Multiple Negatives Ranking Loss:
其中,z和z’ 是两个不同的dropout随机掩码。 h i z i , h i z i ′ h_i^z_i,h_i^z'_i hizi,hizi′ 是相同句子 x i x_i xi输入相同编码器,但使用两个不同的dropout随机掩码而得到的向量。
1.1 对比学习损失函数的性质
直观来说,上文对比学习的损失函数要求第i个样本和它的另一个augmentation的副本(即正样本)之间的相似度尽可能大,而与其他的实例(负样本)之间的相似度 尽可能小。然而,很多的损失可以达到这个要求,例如下面的最简单的形式 :
然而实际训练过程,采用上述的简单形式作为损失函数效果非常不好,下面给出了使用contrastive loss(Eq1)和简单损失(Eq2)的性能对比,温度系数采用0.07:
上面的结果显示,在所有数据集上Contrastive Loss要远远好于Simple Loss。不同于Simple Loss,Contrastive Loss是一个困难样本自发现的损失函数。我们可以上述公式看到,Simple Loss对所有的负样本相似度给予了相同权重的惩罚( 损失函数对所有的负样本相似度的梯度都是相同的)。而Contrastive Loss则更会自动的给距离更近相似度更高的负样本更多的惩罚。这一点可以通过对比损失对不同负样本的相似度的惩罚梯度的简单计算来观察:
对正样本的梯度:
对负样本的梯度:
其中:
对于所有的负样本比较来说,
P
i
j
P_ij
Pij的分母项都是相同的。那么
s
i
j
s_ij
sij 越大(也就是负样本越相似),则
P
i
j
P_ij
Pij 的分子项越大,梯度项也越大。也就是说,对比损失给予了更相似(困难)的负样本更大的远离该样本的梯度。 可以把不同的负样本想像成同极点电荷在不同距离处的受力情况,距离越近的点电荷受到的库伦斥力更大,而距离越远的点电荷受到的斥力越小。对比损失也是这样的。这种性质更有 利于形成在超球面均匀分布的特征。
为了验证上面表格中对比损失和简单损失的差距确实是因为对比损失具有困难样本自发现的特性,我们用一种显式的困难样本挖掘算法用于简单损失上。即选取最相似的4096个样本作为负样本,并用的简单损失作为损失函数,采用显式困难样本挖掘算法的简单损失函数效果大大提升,远远超过了温度系数取0.07时的对比损失。结果如下表所示:
1.2 对比学习温度系数的作用
除了上面介绍的困难样本自发现的性质之外,观察梯度公式,我们可以容易地发现,损失函数对正样本的梯度绝对值等于所有对负样本的梯度值绝对值的和,即
给予这个观察,作者定义了对第j个负样本的一个相对惩罚强度:
如果我们将负样本的相似度由大到小排序,形成一个顺序统计量,那么温度系数的大小将决定了分布的陡峭程度,如下图所示是负样本惩罚梯度在不同温度系数下与相似度的关系:
当温度系数很小时,例如蓝色线0.07,随着相似度的增大将惩罚梯度剧烈的增大。而当温度系数逐渐增大,概率分布逐渐接近均匀分布,例如图中的绿色线。那么对相似度大的负样本的关注度就变小很多了。
上面论证了温度系数的作用,即温度系数决定了对比损失对困难负样本的关注程度,越大的温度系数,往往一视同仁,不会太过关注更困难的负样本;而温度系数越小,则越关注与该样本相似度非常大的困难负样本,给予困难负样本更大的梯度与正样本分离。
2. 实验效果
发现效果会比我之前介绍的CT要好
3. 实现
sentence_transformers已经把SimCSE已经封装成pip包,完整的训练流程例子可以参考《Sentence-BERT》。我们在此基础上只用修改loss就能轻松的训练SimCSE了:
from sentence_transformers import SentenceTransformer, InputExample
from sentence_transformers import models, losses
from torch.utils.data import DataLoader
# ……
train_loss = losses.MultipleNegativesRankingLoss(model)
# 训练模型
model.fit(
train_objectives=[(train_dataloader, train_loss)],
epochs=1,
show_progress_bar=True
)
4. 有监督的训练
SimCSE也可以用于有监督的数据上训练。我们构造的有监督数据形式为
(
x
i
,
x
i
+
,
x
i
−
)
(x_i,x_i^+,x_i^-)
(xi,xi+,xi−)。简单来说,就是在训练时不只是把
x
i
−
x_i^-
xi−视为负例,且把同batch其他句子的正负例都视为句子i的负例:
目标函数为:
实验效果:
Why does it work?
知乎上有同学提问《为什么SimCSE的效果这么好呢?》
如题,为何通过两次dropout、"自己预测自己"的这种方法效果会这么好呢?通过dropout添加噪声不会改变原来句子的语义吗?
作者在论文中也尝试做了解答:
Table3 中尝试不同的dropout rate,并观察所有变体的表现都低于默认值Transformers 的 dropout rate p = 0.1。可以发现,当 p增加时,的确可能会添加过多的“噪声不会改变原来句子的语义”,导致表现变差。
此外,我们发现两个极端情况特别有趣:
“no dropout”(p = 0)和“fixed 0.1”(使用默认值 dropout p = 0.1,但该对的 dropout 掩码相同)
在这两种情况下,结果对的embedding完全相同,它导致性能急剧下降。我们在训练期间每 10 步检查一次这些模型的checkpoints,并可视化对齐和均匀性(alignment and uniformity)
Alignment:positive pairs Feature 之间的对齐性(紧密性)。相似的样本具有相似的特征
Uniformity:特征在归一化后在超平面上的均匀性。保留最大信息
这两个指标与对比学习的目标非常一致:正实例应该保持接近,随机实例的嵌入应该分散在超球面上。
如上图所示,清楚地表明,从预训练的checkpoint开始,所有
模型大大提高了均匀性。
然而两个特殊变体的对齐性也急剧下降,而无监督 SimCSE 保持稳定对齐性,这要归功于 dropout 的使用噪音。
它还表明,从预训练的checkpoint开始是至关重要的,因为它提供了良好的初始对齐性。最后,“删除一个词”改善了对齐方式但获得了较小的增益在均匀性指标上,最终表现不如无监督 SimCSE。
以上是关于EMNLP 2021SimCSE:句子嵌入的简单对比学习 && CVPR 2021理解对比学习损失函数及温度系数的主要内容,如果未能解决你的问题,请参考以下文章
搜索与问答——EMNLP 2021TSDAE:基于Transformer的顺序去噪自动编码器