0. 前言
SimCSE是通过对比学习的方式缓解预训练模型的各向异性问题,各向异性的产生原因在上一篇文章中已有介绍。SimCSE是2021年出的,后面出的 embedding 模型几乎都使用了对比学习来缓解预训练语言模型的各向异性问题。前面介绍的几篇文章无一例外使用了对比学习。
1. 介绍
SimCSE(simple contrastive sentence embedding framework),意为简单的对比句向量表征框架。SimCSE的核心就是使用了对比学习的方法,从而提升对句子的表征能力。如今的预训练语言模型都会存在各向异性的问题,所以需要通过对比学习来加以缓解。下文主要介绍对比学习,SimCSE如何使用对比学习,以及为什么对比学习可以缓解各向异性的问题。
2. 对比学习背景
定义
对比学习就是以拉近相似数据,推开不相似数据为目标,有效地学习数据表征。给定一个pair对样本集合
D
=
{
(
x
i
,
x
i
+
)
}
i
=
1
m
D=\{(x_i,x^+_i)\}^m_{i=1}
D={(xi,xi+)}i=1m,其中
x
i
x_i
xi和
x
i
+
x^+_i
xi+为相似样本,优化目标一般采用通过in-batch negatives交叉熵损失函数,如下:
其中,
h
i
h_i
hi和
h
i
+
h^+_i
hi+为
x
i
x_i
xi和
x
i
+
x^+_i
xi+的句向量表示,
N
N
N 为训练过程中batch的大小,
s
i
m
(
h
i
,
h
i
+
)
sim(h_i, h^+_i)
sim(hi,hi+)为向量
h
i
h_i
hi和
h
i
+
h^+_i
hi+余弦相似度,
τ
\tau
τ为温度系数。
在SimCSE论文中,采用BERT模型对句子进行句向量表征,即 h = f θ ( x ) h=f_{\theta}(x) h=fθ(x),其中, f θ f_{\theta} fθ为BERT模型参数,并通过对比学习损失优化网络全部参数。
构造正样本
对比学习中的一个关键问题是如何构建 ( x i , x i + ) (x_i, x^+_i) (xi,xi+)数据对。在计算机视觉中,通过对一张图片进行简单地裁剪,翻转,扭曲和旋转就可以获取质量很高的 x i + x^+_i xi+;而在自然语言处理中,构造 x i + x^+_i xi+的方法与图像类似,一般对原始句子进行转译、重排,或对部分词语删除、插入、替换等;但是由于离散性,导致NLP中的数据扩充往往会引入大量的负面噪声,使得 x i + x^+_i xi+的质量难以保证。
在SimCSE论文中,提出使用标准dropout操作构造高质量,并达到比上述数据扩充更好的效果。
对齐性和均匀性
在对比学习中,通常使用alignment(对齐性)和uniformity(均匀性)来衡量表征质量的好坏。
alignment是计算
(
x
i
,
x
i
+
)
(x_i, x^+_i)
(xi,xi+)数据对向量表征之间的距离,表示数据之前的紧密程度:
uniformity是计算向量
x
i
x_i
xi表征在整体特征分布上的均匀程度:
其中,
p
d
a
t
a
p_{data}
pdata 表示数据分布。
这两个指标与对比学习的目标是一致的:正例之间应该保持紧密,而任意向量的语义特征应该尽可能地分散在超球体上。
3. SimCSE的思路
上面已说对比学习中的一个关键问题是如何构建 ( x i , x i + ) (x_i, x^+_i) (xi,xi+)数据对。论文提供了两种方法,第一种是无监督的SimCSE,第二种是有监督的SimCSE。第一种就是在原本没有 ( x i , x i + ) (x_i, x^+_i) (xi,xi+)数据对的数据上通过dropout的方式构造出来,这种方法是一种在没有理想数据的情况下拖鞋的做法,有一定效果;第二种是直接找一些有 ( x i , x i + ) (x_i, x^+_i) (xi,xi+)数据对的数据,这样的数据更真实且自然一些,效果肯定会更好,就是费数据。
4. 无监督SimCSE
方法描述
无监督SimCSE的思想非常简单,给定一个句子集合 { x i } i = 1 m \{x_i\}_{i=1}^m {xi}i=1m,将 x i x_i xi 分别输入到编码器中两次,分别得到向量 z i z_i zi 和 z i + z_i^+ zi+,由于随机dropout masks机制存在于模型的fully-connected layers和attention probabilities上,因此相同的输入,经过模型后会得到不同的结果;训练的时候 z i + z_i^+ zi+ 即为 z i z_i zi 的正例,其他的 z j + ( j ≠ i ) z_j^+(j\neq i) zj+(j=i) 为 z i z_i zi 的负例。SimCSE的训练目标变成:
l i = − l o g e s i m ( h i z i , h i z i + ) / τ ∑ j = 1 N e s i m ( h i z i , h j z j + ) / τ l_i=-log\frac{e^{sim(h_i^{z_i},h_i^{z_i^+})/\tau}}{\sum_{j=1}^Ne^{sim(h_i^{z_i}, h_j^{z_j^+})/\tau}} li=−log∑j=1Nesim(hizi,hjzj+)/τesim(hizi,hizi+)/τ
注意: z z z 为Transformers中的标准dropout mask,在无监督SimCSE没有额外增加任何dropout。
为什么要用Dropout进行数据增强
除了Dropout还有裁剪,删除和替换等数据增强方法,但是效果均不如Dropout好。这一点是可以想见的,拿删除来说,图像均匀地少一半像素我们还是可以看出图片中的物体是什么,要是句子均匀地少一半字意思可能完全不一样;同样的一个句子裁剪一部分语义也会完全不同,替换也是一样的。
究其原因是自然语言的单个 item 所包含的信息量太大了,如果将其转换到高维空间里每一个 item 所包含的信息量就会大大减少,而且形式上跟图像用多维数字来表示就很像了。此时再用Dropout就能极大程度保留原来的语义了。
这是文章中做的实验,可以看到无监督的SimCSE在STS-B数据集上的得分为82.3,裁剪(crop)10%分数会直接降到77.8,裁剪越多分数越低;删除单词(Word deletion)也是一样的;即使只删除1个单词(Delete one word)模型的性能也会比较差;如果不用dropout,就相当于
z
i
=
z
i
+
z_i=z_i^+
zi=zi+,这样的模型只有74.2分;同义词替换(Synonym replacement)效果稍好,能拿77.4分;MLM 替换15%的单词结果也很差。
为什么这种方法有效
为了进一步理解dropout噪声在无监督SimCSE中的作用,论文尝试了不同的dropout率,如下表所示:
这里做的实验是使用不同的dropout率在STS-B开发集上做效果比较,可以看到dropout率为0.1时效果最好,同时Fixed 0.1是使用dropout率为0.1且生成
z
i
z_i
zi 和
z
i
+
z_i^+
zi+ 时用相同的dropout mask,效果会很差(正确的方法是使用不同的dropout mask)
在训练过程中,每隔10步检查一次模型,并可视化alignment和uniformity在训练过程中的变化,如下图所示:
可以发现,在训练过程中,所有模型的均匀性都在提高,但是对于no-dropout和fixed-0.1模型来说对齐性急剧下降,而无监督SimCSE和delete-one-word模型进本持平。虽然delete-one-word模型的对齐性好于无监督SimCSE,但是均匀性相差较多,因此在整体效果上,无监督SimCSE更胜一筹。
5. 有监督SimCSE
对比学习的关键是如何构建 ( x i , x i + ) (x_i, x_i^+) (xi,xi+)数据对,在无监督SimCSE中,借助dropout mask机制,构造高质量数据,已经获得了较好的句向量表征;在有监督SimCSE中,则是收集高质量的有监督数据构造成 ( x i , x i + ) (x_i, x_i^+) (xi,xi+)数据对。
监督数据的选择
使用了四种数据集,适合构造对比学习 ( x i , x i + ) (x_i, x_i^+) (xi,xi+)数据对,分别是:
- QQP:Quora问题对;
- Flickr30k:每个图像都有5个人进行描述,可以认为同一图像的任意两个描述为一对 ( x i , x i + ) (x_i, x_i^+) (xi,xi+)数据对;
- ParaNMT:大规模的回译数据集;
- NLI datasets:自然语言推理数据集,包括:SNLI和MNLI
在四种数据集上,直接使用 ( x i , x i + ) (x_i, x_i^+) (xi,xi+)数据对进行训练的结果如下表所示:
为了比较各数据集的效果,这里进行了实验,其中sample是对每种数据集采样134k个样本进行训练,full是值进行全量训练。可以看到SNLI+MNLI中的entailment(蕴含)数据集效果最好;用SNLI+MNLI中的entailment数据集再加上hard negative样本效果更好。并且统计发现,语义蕴含对(SNLI + MNLI)的词汇重叠仅占比39%,而QQP和ParaNMT数据集占比60%和55%。最终,选择NLI数据集进行监督学习。
难负例的使用(hard negative)
难负例是指看起来像是正例实际上是负例的样本,作用是提升模型的分辨能力。
NLI数据集中,一个前提假设文本,具有对应的蕴含文本和矛盾文本,将矛盾文本作为难负例;即, ( x i , x i + ) (x_i, x_i^+) (xi,xi+)数据对变成 ( x i , x i + , x i − ) (x_i, x_i^+,x_i^-) (xi,xi+,xi−)数据组,其中, x i + x_i^+ xi+为蕴含文本, x i − x_i^- xi−为矛盾文本也就是难负例;监督学习SimCSE的训练目标变成:
通过上表可以发现,增加矛盾文本作为难负例后,效果有所提高。 直观上,区分难负例(矛盾文本)和Batch内其他负例可能是有益的,将监督学习SimCSE的训练目标变成:
用不同的
α
\alpha
α 值训练SimCSE模型,并在STS-B开发集上对训练的模型进行评价,发现当
α
\alpha
α 为1时效果最优,并且中性数据不会带来更多的收益,如下表所示:
6. 各向异性问题
最近的研究发现了语言表征中的各向异性问题,即训练后的embeddings仅占据在向量空间中狭窄的部分,严重限制了向量的表现力。 缓解这个问题的一个简单方法是后处理,可以消除主要的主成分或将embeddings映射到各向同性分布。另一种常见的解决方案是在训练过程中添加正则项。 而对比学习的优化目标可以改善缓解各向异性问题,当负例数趋近于无穷大时,对比学习目标的渐近表示为:
其中,第一项使正例之间更相似,第二项使将负例之间分开。而第二项在优化过程中,会压平向量空间的奇异谱,因此对比学习有望缓解表征退化问题,提高句向量表征的均匀性。并通过下图,可以发现,
虽然预训练embeddings具有良好的对齐性,但其均匀性较差;
- 后处理方法,如BERT-flow和BERT-whitening,大大改善均匀性,但也使其对齐性变差;
- 无监督SimCSE有效地提高了预训练embeddings的均匀性,同时保持了良好的对齐性;
- 有监督SimCSE,可以进一步提高对齐性。
参考1:SimCSE论文精读
参考2:SimCSE: Simple Contrastive Learning of Sentence Embeddings论文解读
参考3:SVD-矩阵奇异值分解 —— 原理与几何意义
参考4:SimCSE: Simple Contrastive Learning of Sentence Embeddings
参考5:Understanding Contrastive Representation Learning through
Alignment and Uniformity on the Hypersphere(论文)
推理加速
ONNX
ONNX推理加速