背景
句子表征一直是一个很卷的方向。从最开始的DSSM到现在的对比学习(如: SimCSE、CoSERT等),效果不断被刷新。但是在对比学习中,有个问题一直待解决: 假负例。 即一个batch内除了自身以外全部视为当前样本的负例,这样显然有些简单粗暴。如下图:
作者使用simcse训练好的模型在wikipedia的数据集上做了一个测试,当前一个样本和其在一个batch内的255个负例做了相似度计算,发现50%+的样本相似度都大于0.5,也就是有很多都是假负例。显然,这样的学习是有偏的。
针对这种问题,本文提出了一种负采样纠偏的对比学习方法。创新点主要有两个: (1)通过高斯分布产生随机噪声样本。(2)给同batch内的负例进行加权。下面我们看看具体的做法。
模型介绍
上述是本文的模型结构图,左边是输入部分。负样本是随机采样的负样本。正样本可以是dropout生成正例,或者通过增、删等数据增强的方式得到正例。右边分为两部分: Instance Weighting和Noise-based Negatives。即对负例加权,通过高斯分布产生噪声负样本。下面来看看这两种方式的具体实现:
通过高斯分布产生噪声负样本
给定一个样本xix_ixi,首先从高斯分布中采样出k个向量作为负样本。如下所示:
其中δ\deltaδ就是方差。
将这些向量用来和正例做对比学习。之前有一个模型GS_infoNCE就是这样做的。因为在对比学习领域,大家通常认为,负例越多,效果越好。当时GS_infoNCE确实也比它的base模型simcse效果好了一点。
但是本文为了进一步提高噪声负向量的质量,对这些向量进行了梯度更新,用来捕捉语义空间中的非均匀点。
假设原始的向量为hih_ihi, 对应的噪声向量集合为h^\hat hh^, 对应正例为hi+h_i^+hi+,则对比损失如下:
其中τ是温度超参数。sim(hi,hi+)sim(h_i, h_i^+)sim(hi,hi+)计算如下:
然后基于每个噪声负例hj∈h^h_j \in \hat hhj∈h^ 求导:
其中β\betaβ为学习率。
给同batch内的负样本加权
这一步作者借助了一个训练好的simcse模型,对同一batch内的样本两两打分。假设当前的一个样本就会和其他batch内的负样本计算相关性分数。然后给出一个阈值,将相关性打分映射成0或者1。如下所示:
其中的ϕ\phiϕ就是人为定的阈值。然后将α\alphaα引入到损失计算中,如下所示:
这样在某种程度上就防止了假负例的出现。最后看看实验结果。
实验结果
可以看出,这公开的数据集上,基本都有不同程度的提高。