在很多 NLP 任务中都会用到句子向量,例如文本检索、文本粗排、语义匹配等任务。现在有不少基于 Bert 的方式获取句子向量,例如 Bert-flow 和 Bert-whitening 等,这些方法会对预训练 Bert 的输出进行变换从而得到更好的句子向量。本文介绍 SimCSE,SimCSE 通过对比学习的方法训练模型,取得 SOTA 的效果,并且可以用于有监督和无监督学习。在无监督的过程中,对于一个句子,SimCSE 通过 Dropout 构造正例,而语料库里面的其他句子作为负例。
句子向量 (Embedding) 和句子语义匹配是 NLP 的重要任务,不少研究都将 Bert 用于这些任务中获取句子的向量,其中分为有监督和无监督的方式。
无监督获取句子向量的常见方式有以下几种,得到句子向量后可以通过余弦相似度计算两个句子的相似性:
使用预训练好的 Bert 直接获得句子向量,可以是 CLS 位的向量,也可以是不同 token 向量的平均值。
Bert-flow,Bert-flow 出自论文《On the Sentence Embeddings from Pre-trained Language Models》,主要是利用流模型校正 Bert 的向量。
Bert-whitening,用预训练 Bert 获得所有句子的向量,得到句子向量矩阵,然后通过一个线性变换把句子向量矩阵变为一个均值 0,协方差矩阵为单位阵的矩阵。
有监督的方式主要是 Sentence-Bert (SBERT),SBERT 出自《Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks》,通过 Bert 的孪生网络获得两个句子的向量,进行有监督学习,SBERT 的结构如下图所示。
本文介绍 SimCSE,出自论文《SimCSE: Simple Contrastive Learning of Sentence Embeddings》。SimCSE 通过对比学习的方法进行训练,并且可以用于无监督训练。在无监督的时候,SimCSE 会把通过不同的 Dropout 得到一个句子的两个向量,作为正样本对,而语料库里的其他句子向量可作为负样本。
用 D 表示我们的数据集,数据集里面包含多个正样本对,如下面所示,x 表示句子,x+ 表示与 x 语义相关的样本:
通过模型可以得到句子 x 的向量 h,并计算两个向量的余弦相似度,如下:
对比学习训练的目标函数如下:
2.1 构造正样本对
对比学习的一个重要问题是如何构造正样本对,即通过 x 构造出 x+,有点类似数据增强。在图像领域这相对容易,通过对图像进行翻转、裁剪、加噪音、缩放等方式即可构造,而文本相对会难一些。
常见的文本数据增强方式有删除词组、替换近义词、互译等方式。但是这些方式都是离散的,有时效果并不理想,因此 SimCSE 通过 Dropout 的方式构造正样本对。
2.2 对比学习评价指标
alignment 和 uniformity 是对比学习中比较重要的两种属性,可用于衡量对比学习的效果。
alignment 计算所有正样本对之间的距离,如果 alignment 越小,则正样本的向量越接近,对比学习效果越好,计算公式如下。
uniformity 表示所有句子向量分布的均匀程度,越小表示向量分布越均匀,对比学习效果越好,计算公式如下。
下图是 SimCSE 的结构图,左边是无监督的 SimCSE,右边是有监督的 SimCSE。
3.1 无监督 SimCSE
无监督 SimCSE 最主要是对于同一个句子采用两个不同 Dropout Mask,得到两个不同的句向量作为正样本,如下。
训练的目标函数如下:
作者对比了 Dropout 和其他数据增强方法的效果 (评价指标是 Spearman 相关系数),结果如下表所示,其中 None 表示 SimCSE 用到的 Dropout 方法,可以看到通过 Dropout 生成正样本的效果比其他数据增强方式好。
作者也通过 alignment 和 uniformity 这两个指标验证无监督 SimCSE 的效果,如下图所示。其中 "Fixed 0.1" 表示对于 x 和 x+ 使用相同的 Dropout (p=0.1),Unsup. SimCSE 表示无监督 SimCSE,箭头表示训练的变化过程。
可以看到 "Fixed 0.1" 和 "No dropout" 这两种方法随着训练的进行可以减小 uniformity 的值,但是 alignment 却会变大。而 "Unsup. SimCSE" 和 "Delete one word" 可以在 alignment 保持稳定的情况下,减小 uniformity 的值。
另外一方面,SimCSE 与 "Delete one word" 相比,SimCSE 的 alignment 相对大了一些,但是 uniformity 却小了很多,因此 SimCSE 效果比 "Delete one word" 更好。
3.2 有监督 SimCSE
SimCSE 也可用于有监督训练,例如可以使用自然语言推理数据集 (SNLI 和 MNLI) 进行有监督学习,自然语言推理数据集包含很多句子对,句子对有三种关系: 蕴含 (entailment), 中性 (neutral), 矛盾 (contradiction)。可以把蕴含和中性的句子对作为正样本,矛盾的句子对作为负样本进行训练。
下面是有监督 SimCSE 的实验效果,其中 Unsup. SimCSE (无监督 SimCSE) 是在 SNLI+MNLI+ANLI 数据上训练的,其效果比有监督的差。
下面是各种常见句子向量算法的对比,可以看到 SimCSE 的效果最好。
SimCSE: Simple Contrastive Learning of Sentence Embeddings
Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks