1.N-Gram
N-Gram是一种基于统计语言模型的算法。它的基本思想是将文本里面的内容按照字节进行大小为N的滑动窗口操作,形成了长度是N的字节片段序列。每一个字节片段称为gram,对所有gram的出现频度进行统计,并且按照事先设定好的阈值进行过滤,形成关键gram列表,也就是这个文本的向量特征空间,列表中的每一种gram就是一个特征向量维度。
该模型基于这样一种假设,第N个词的出现只与前面N-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计N个词同时出现的次数得到。常用的是二元的Bi-Gram和三元的Tri-Gram。
N-gram的用途很广,比如搜索引擎或者输入法提示,词性标注,垃圾短信分类,分词,机器翻译,语音识别能等等等。
- 概率计算
假设我们有一个由n nn个词组成的句子,如何衡量它的概率呢?让我们假设,每一个单词
都要依赖于从第一个单词
到到它之前一个单词
的影响:
这个衡量方法有两个缺陷:
- 参数空间大: 概率
的参数有O(n)个。
- 数据稀疏,词同时出现的情况可能没有,组合阶数高时尤其明显。
为了解决第一个问题,引入马尔科夫假设(Markov Assumption):一个词的出现仅与它之前的若干个词有关。
如果一个词的出现仅依赖于它前面出现的一个词,那么我们就称之为 Bi-gram:
如果一个词的出现仅依赖于它前面出现的两个词,那么我们就称之为 Tri-gram:
N-gram的 N NN 可以取很高,然而现实中一般 bi-gram 和 tri-gram 就够用了.
用极大似然估计来计算每一项的条件概率,即频数:
具体地,以Bi-gram为例,我们有这样一个由三句话组成的语料库:
容易统计,“I”出现了3次,“I am”出现了2次,因此能计算概率:
同理,还能计算出如下概率:
等等
2.SimCSE
句向量表征技术一直都是NLP领域的热门话题,在BERT前时代,一般都采用word2vec训练出的word-embedding结合pooling策略进行句向量表征,或者在有训练数据情况下,采用TextCNN/BiLSTM结合Siamese network策略进行句向量表征。在BERT时代,人们借助预训练语言模型的固有优势,一般采用BERT模型的[CLS]向量(即句子的起始字符向量)作为句向量表征;SimCSE采用对比学习的方法,进行句向量表征,在BERT模型上获取更好的句向量表征,详细介绍如下:
2.1.介绍
SimCSE(simple contrastive
sentence embedding framework),即简单的对比句向量表征框架。SimCSE共包含了无监督和有监督的两种方法。无监督方法,采用 dropout技术,对原始文本进行数据增强,从而构造出正样本,用于后续对比学习训练;监督学习方法,借助于文本蕴含(自然语言推理)数据集,将蕴涵-pair作为正例,矛盾-pair作为难负例,用于后续对比学习训练。并且通过对比学习解决了预训练Embedding的各向异性问题,使其空间分布更均匀,当有监督数据可用时,可以使正样本直接更紧密。模型结构如下图所示:
其中,图a为无监督SimCSE,图b为有监督SimCSE,详细模型介绍见第3节和第4节。
下面将从对比学习背景、无监督SimCSE、有监督SimCSE、各向异性问题、实验细节五个方面进行详细介绍。
2.2.对比学习背景
2.2.1定义
对比学习就是以拉近相似数据,推开不相似数据为目标,有效地学习数据表征。给定一个pair对样本集合,其中KaTeX parse error: Expected group after '_' at position 2: x_̲和
为相似样本,优化目标一般采用通过批内负样本(in-batch negatives)交叉熵损失函数,如下,
其中,和
为
和
的句向量表示,
为训练过程中batch的大小,
为向量
和
余弦相似度,
为温度超参。
在SimCSE论文中,采用BERT模型对句子进行句向量表征,即,其中,
为BERT模型参数,并通过对比学习损失优化网络全部参数。
2.2.2构造正样本
对比学习中的一个关键问题是**如何构建数据对**。在计算机视觉中,通过对一张图片进行简单地裁剪,翻转,扭曲和旋转就可以获取质量很高的
;而在自然语言处理中,构造
的方法与图像类似,一般对原始句子进行转译、重排,或对部分词语删除、插入、替换等;但是由于离散性,导致NLP中的数据扩充往往会引入大量的负面噪声,使得
的质量难以保证。
在SimCSE论文中,提出使用标准dropout操作构造高质量,并达到比上述数据扩充更好的效果。
2.2.3对齐性和均匀性
在对比学习中,通常使用对齐性(alignment)和均匀性(uniformity)来衡量表征质量的好坏。
alignment是计算数据对向量表征之间的距离,表示数据之前的紧密程度,
uniformity是计算向量表征在整体特征分布上的均匀程度,
其中,表示数据分布。
这两个指标与对比学习的目标是一致的:正例之间应该保持紧密,而任意向量的语义特征应该尽可能地分散在超球体上。
2.3.无监督SimCSE
无监督SimCSE的思想非常简单,给定一个句子集合,将
分别输入到编码器中两次,分别得到向量
的正例和
;由于随机dropout masks机制存在于模型的fully-connected layers和attention probabilities上,因此相同的输入,经过模型后会得到不同的结果;将KaTeX parse error: Expected group after '_' at position 2: z_̲^{’}向量作为
的正例,其他向量作为负例,SimCSE的训练目标变成:
注意:为Transformers中的标准dropout mask,在无监督SimCSE没有额外增加任何dropout。
2.3.1Dropout数据增强与其他的比较
通过dropout masks机制进行数据增强构造正例的方法,可以视为一种最小形式的数据扩充,正例与原始样本之间采用完全相同的句子,只有在向量表征过程中的dropout mask有所不同。
在STS-B的开发集上,比较该方法与其他数据增强方法的差异。在英文维基上随机抽取个句子进行训练,学习速率=3e-5,批次大小为64。并训练过程中没有使用STS训练集。
- 裁剪,删除和替换等数据增强方法,效果均不如dropout masks机制,即使删除一个词也会损害性能,详细如下表所示,
- 使用下一句作为目标训练,或者采用两个独立的编码器进行编码的效果,不如采用一个编码器的dropout masks机制,详细如下表所示,
3.2为什么该方法可以work?
- 为了进一步理解dropout噪声在无监督SimCSE中的作用,论文尝试了不同的dropout率,如下表所示,
可以发现仅在默认dropout概率p=0.1时效果最优,并且当dropout概率p=0,或者相同输入有同样的dropout mask时,效果显著下降。
- 在训练过程中,每隔10步检查一次模型,并可视化alignment和uniformity在训练过程中的变化,如下图所示,
可以发现,在训练过程中,所有模型的均匀性都在提高,但是对于no-dropout和fixed-0.1模型来说对齐性急剧下降,而无监督SimCSE和delete-one-word模型进本持平。虽然delete-one-word模型的对齐性好于无监督SimCSE,但是均匀性相差较多,因此在整体效果上,无监督SimCSE更胜一筹。
2.4.有监督SimCSE
对比学习的关键是如何构建数据对,在无监督SimCSE中,借助dropout mask机制,构造高质量
数据,已经获得了较好的句向量表征;在有监督SimCSE中,如何通过监督数据,进一步提高句向量表征,具体如下:
2.4.1监督数据的选择
共存在四种数据集,适合构造对比学习数据对,分别是:
- QQP:Quora问题对;
相似的问题对为正样本,如下:
不相似的问题对为负样本,如下:
- Flickr30k:每个图像都有5个人进行描述,可以认为同一图像的任意两个描述为一对
数据对;
以下图为例:
对图片中的人物的5段描述,如下:
- ParaNMT:大规模的回译数据集;
针对原数据进行机器翻译,获得回译数据,如下:
- NLI datasets:自然语言推理数据集,包括:SNLI和MNLI。
自然语言推理数据集,包含蕴含、矛盾和中立;蕴含表示第二句话可以推理出第一句话;矛盾表示第二句话不能推理出第一句话;中立表示两句话无关;举例如下:
在四种数据集上,直接使用数据对进行训练的结果如下表所示,
可以发现,NLI数据集上,采用语义蕴含对作为数据对的效果最好;并且统计发现,语义蕴含对(SNLI + MNLI)的词汇重叠仅占比39%,而QQP和ParaNMT数据集占比60%和55%。最终,选择NLI数据集进行监督学习。
2.4.2难负例的使用
NLI数据集中,一个前提假设文本,具有对应的蕴含文本和矛盾文本,将矛盾文本作为难负例;即,数据对变成
数据组,其中,
为蕴含文本,
为矛盾文本;监督学习SimCSE的训练目标变成:
通过上表可以发现,增加矛盾文本作为难负例后,效果有所提高。
直观上,区分难负例(矛盾文本)和Batch内其他负例可能是有益的,将监督学习SimCSE的训练目标变成:
用不同的α值训练SimCSE模型,并在STS-B开发集上对训练的模型进行评价,发现当α为1时效果最优,并且中性数据不会带来更多的收益,如下表所示,
2.5.各向异性问题
最近的研究发现了语言表征中的各向异性问题,即训练后的embeddings仅占据在向量空间中狭窄的部分,严重限制了向量的表现力。
缓解这个问题的一个简单方法是后处理,可以消除主要的主成分或将embeddings映射到各向同性分布。另一种常见的解决方案是在训练过程中添加正则项。
而对比学习的优化目标可以改善缓解各向异性问题,当负例数趋近于无穷大时,对比学习目标的渐近表示为:
KaTeX parse error: Undefined control sequence: \[ at position 77: …\\sim p\_{pos}}\̲[̲f(x){T}f(x+)\] …
其中,第一项使正例之间更相似,第二项使将负例之间分开。而第二项在优化过程中,会压平向量空间的奇异谱,因此对比学习有望缓解表征退化问题,提高句向量表征的均匀性。并通过下图,可以发现,
- 虽然预训练embeddings具有良好的对齐性,但其均匀性较差;
- 后处理方法,大大改善均匀性,但也使其对齐性变差;
- 无监督SimCSE有效地提高了预训练embeddings的均匀性,同时保持了良好的对齐性;
- 有监督SimCSE,可以进一步提高对齐性。
2.6.实验细节
对7个语义文本相似度(STS)任务进行了实验,将无监督和有监督的SimCSE与STS任务中的最先进的句子嵌入方法进行了比较,可以发现,无监督和有监督的SimCSE均取得了sota的效果,具体如下表所示,
2.6.1训练参数
对于有监督的SimCSE,对模型进行3个轮的训练,在STS-B的开发集上每训练250步进行一次模型验证,并保存测试集上最优效果的节点。对于无监督的SimCSE与有监督的SimCSE操作一致,但仅训练一个epoch。并对批次大小和学习率进行网格搜索,找寻最优参数,如下图所示,
实验发现,只要相应地调整学习速率,SimCSE对批量大小并不敏感,这与对比学习需要大批次的发现相矛盾。可能原因为所有SimCSE模型都是在原有预训练模型基础上继续训练的,已经提供了较好的初始化参数。
2.6.2MLP Layer
对于无监督和有监督的SimCSE,训练过程均采用在带有一个MLP层的[CLS]向量作为句向量表征。但,对于无监督的SimCSE,在测试中丢弃了MLP层,仅使用[CLS]向量作为句向量表征,详细实验如下表所示,
2.6.3MLM
在训练过程中引入masked language modeling变量,可以提到模型的迁移效果,如下表所示,
但值得注意的是,迁移性的提高,会造成原始任务上的效果下降。
2.6.4温度
温度主要用于调整softmax函数的平滑程度,在训练过程中,温度为0.05时,效果最佳。
SimCSE论文,在无监督句向量表征上,通过简单的dropout方式,构造了对比学习的正例,达到堪比监督学习效果,堪称大道至简。并且在监督学习上,对比学习框架效果也取得了SOTA。