提纲
-
Bert句向量生成
-
Bert句向量问题
-
句向量生成方法
3.1 Sentence Bert
3.2 Bert-flow
3.3 Bert-whitening
3.4 TSDAE
3.5 Simcse
3.6 Consert
3.7 PairSupCon
3.8 PromptBert
4.总结
参考文献
1. Bert句向量生成
Bert句向量生成指的是通过Bert生成文本的句向量,生成的句向量能准确表征句子的语义。一个好的句向量应准确表征句子的信息,那么不同句子之间的相似度就可以用对应句向量的距离来表示。对于向量搜索任务而言,也就是给你一个query,你需要在N个候选的doc中找到最接近的doc(query,doc都是文本),句向量的生成至关重要。
有的人可能会觉得,把两个句子通过[CLS]拼到一起输入到Bert做一个二分类任务不也可以计算句子之间的相似度嘛。这当然是可以,但是在很多真实场景下,会涉及到一个向量搜索任务中。如果我把query跟每个doc都拼到一起输入到Bert,那需要运行N次Bert才能计算query跟所有doc之间的相似度,在N比较大时这个时间显然是不能被接受的。但是如果能事先把N个doc通过Bert线下编码成向量存储下来,每次线上推理时只需要把query输进Bert,然后在计算向量之间的距离(余弦相似度等)就可以了,这样线上只需要运行一次Bert就可以了。在问答系统,推荐系统等场景下经常会遇到这种问题,这其实也是cross模型跟双塔模型之间的差异了。
2. Bert句向量问题
对预训练模型Bert有过一定学习经历的人应该知道,Bert虽然当时在很多下游任务都达到SOTA的效果,但是原生的Bert生成的句向量效果(句子相似度等任务)并不好。直接用原生的Bert生成的不同文本之间的句向量去计算相似度的效果并不好,甚至不及使用Glove向量生成的。
造成这种现象的原因主要是是Bert句向量空间的各向异性,Bert生成的词向量在空间分布不均匀,受频率影响,高频词相对集中,更靠近远点,低频词由于训练不够充分相对分散,远离原点。所以词向量之间的距离不能很好的表示词之间的相关性,而句向量仅仅是词向量的平均池化,所以通过它计算出来的相似度是有问题的。至于为什么会有这种情况,个人认为是由于训练目标造成的,我们知道原生的Bert预训练的任务只有MLM跟NSP(next sentence prediction),在下游任务计算句子相似度时,也是把两个句子通过[CLS]拼接到一起输入Bert,将Bert输出的结果传入一个全连接层计算相应概率值做一个二分类任务,所以原生的Bert一开始就没有考虑到怎么去生成一个适合向量搜索或者相似度计算的句向量。
图1: Bert词向量分布
3. 句向量生成方法
既然知道原生的Bert不适合句向量生成,那么接下来就看下若干在Bert基础上做改进的句向量生成方法。
3.1 Sentence Bert
图2: Sentence Bert结构
Sentence Bert的想法也很直观,既然原生Bert的训练任务中没有句子相似度计算,那么在原生的Bert基础上做finetune,在finetune阶段把句向量生成相关的相似度任务加进去不就可以嘛,这样Bert就可以学到句向量生成的能力了。
具体训练过程见上图,对于分类任务见左图,借助于孪生网络,左右两个Bert共享权重,将sentence A生成的句向量u跟sentence B生成的句向量v以及两者之间的差值|u-v|拼接再一次,输入一个全连接层做一个二分类任务,使用交叉墒损失函数作为优化的目标函数。对于回归任务见右图,通过计算句向量u跟v之间的余弦相似度,作为句子相似度输出,利用均方损失函数作为优化的目标函数。
具体推理过程见右图,利用训练好Bert对句子进行编码,然后计算句向量之间的余弦相似度即可以得到句子之间的相似度。
效果:Sentence Bert的效果明显优于原生Bert和其他向量表征方法。
图3: Sentence Bert效果
结论:
1. 使用各个token的输出向量的平均值作为句向量效果最好。
2. 在分类任务训练上,向量差值|u-v|对效果影响最大。
3.2 Bert-flow
Bert-flow认为既然原生的Bert句向量效果不好是由于句向量分布不均匀不平滑,那么利用标准化流(Normalizing Flows)将Bert的句向量分布变换成一个光滑的各向同性的标准高斯分布就可以解决这个问题了。Bert-flow在Bert的基础上增加一个flow可逆变换,可以实现将一个标准的高斯分布转化成一个Bert的句向量embedding分布,那么它的逆变化就可以将一个Bert的句向量embedding分布转化成一个标准高斯分布了。
图4: Bert-flow的可逆变换
具体训练过程保持Bert的参数不变,学习一个用来模拟上述可逆变换的神经网络参数,该可逆反应变换可以实现将Bert的句向量映射到一个标准高斯分布,同时没有信息损失。推理过程就是在将Bert的句向量输出到这个训练好的可逆变换flow做转换,就可以得到分布均匀的句向量。
图5: Bert-flow训练目标
效果:作为一种无监督训练的方法,效果明显优于原生的bert和glove。
图6: Bert-flow效果
3.3 Bert-whitening
Bert-whitening跟Bert-flow一样也是想直接对Bert生成的句向量做转换,但是Bert-whiltening更加简单明了,直接对语料数据求特征值分解,将当前坐标系变换到标准正交基下,进而实现句向量空间的各向同性。
效果:Bert-whitening在效果上可以媲美Bert-flow。
图7: Bert-whitening效果
3.4 TSDAE
TSDAE的思想很直观,什么是好的句向量? 从Bert编码的到的句向量,应该可以还原句子本身的文本。所以TSDAE构建了一个encoder-decoder的结构,将文本编码成句向量,再从句向量解码到原始文本。
图8: TSDAE结构
具体训练过程是一个encoder-decoder结构,一个文本首先加入一定噪声(删除,添加,交换等操作),然后通过Bert作为encoder得到该噪声文本的句向量,再通过Bert作为decoder生成原始的不带噪声的文本。模型利用交叉墒损失函数作为优化函数。此处不同于平常的encoder-decoder的地方有两处,一处是这里的encoder跟decoder是同一个模型,另一处是decoder里计算self attention里key跟value都是encoder编码的到的句向量,没有一开始噪声文本词向量的信息。
图9: TSDAE的attention计算机制
具体推理过程就只用到上述encoder-decoder结果里面的encoder,将文本(不需要加入噪声)通过encoder编码的到句向量,可以直接用来计算句子相似度。
效果:TSDAE基本超过了其他无监督的方法,但离有监督的Sentence Bert,效果还有所差距。
图10: TADAE效果
结论:效果最佳的设置为使用随机删词加入噪声并且删词比例为0.6效果最佳,使用[CLS]位置输出向量作为句向量效果更好,训练过程绑定encoder跟decoder参数效果更好。
3.5 Simcse
Simcse的想法是将对比学习的方法引进Bert的句向量生成。它希望表征相同语义的句向量之间的距离足够靠近,表征不同语义的句向量距离尽可能疏远。
图11: Simcse训练方式
Simcse的训练方式分为无监督跟有监督两种。对于无监督训练,正样本是同一个文本输进去Bert两次得到的两个句向量(训练过程由于Bert中dropout层的随机性,Bert对同一个文本编码多次会得到不同的句向量)。负样本是一个文本跟同一个batch里的其他负样本得到的句向量。对于有监督训练,正样本跟负样本就是对应数据集中的正负例句子对。优化的目标函数就是对比学习基本的损失函数,简单理解就是希望正样本之间的距离尽可能接近,负样本之间的距离尽可能疏远。
图12: simcse对比函数
效果:无论是无监督还是有监督,在多个数据集上效果优于之前的方法,且有较大的提升。
图13: simcse效果
3.6 Consert
Consert的思路也是将对比学习引进Bert的句向量生成任务,不同与之前提到的simcse, simcse通过dropout层在transformer每一层都增加扰动,把差异性放大,提升任务难度,而Consert则聚焦在词嵌入层跟池化层的扰动,认为把扰动放在网络越前面的部分,扰动越会被放大。
图14: consert的数据增强方式
具体训练过程是对于同一个文本,通过对数据增强(见上图),得到两个不同增强版本的embedding,将得到的embedding输入到Bert得到相应的句向量,这里的正样本就是同一个文本不同增强版本的embedding对应句向量,负样本就是不同文本之间句向量。优化的目标函数就是对比学习基本的损失函数,简单理解就是希望正样本之间的距离尽可能接近,负样本之间的距离尽可能疏远。损失函数的分子部分是正样本之间的相似度,分母部分就是负样本之间的相似度之和。
图15: consert的对比损失函数
效果:跟simcse的想法比较类似,效果相比以往方法有明显提升,但是效果不及simcse。
图16: consert效果
3.7 PairSupCon
PairSupCon的想法也是基于对比学习的,它的不同点在于损失函数做了以下三点调整,
1.
之前的方法里面计算对比函数损失时,每个样本对只会拿其中一个跟同一个batch里其他样本都计算一次,但是PairSupCon把样本对里两个样本都分别拿出来计算一次。
2. 之前的方法里面所有负例损失权重都是一样的,PairSupCon则在计算对比损失时对负例损失做了加权。
图17: PairSupCon的加权损失函数
3. 新增了一项损失,用于区分矛盾跟蕴含。
图18: PairSupCon的新增损失计算
3.8 PromptBert
PromptBert是在simcse的基础上引进了最近在预训练模型中火热prompt。之前涉及到的方法的句向量要不是[CLS]位置的输出向量,要不就是所有位置的输出向量的平均值,但是PromptBert方法使用的句向量却设置prompt模版得到的。
具体训练过程跟其他对比学习方法相似,主要有2个区别。第一点是句向量的生成方式不同,PromptBert通过预先定义好的模版将文本填入[X]的位置然后输入到Bert,得到对应[MASK]位置的输出向量作为句向量。第二点是句子相似度计算过程加入了消除有关prompt模版影响的部分。
图19: PromptBert的模版
图20: PromptBert的损失函数
效果:效果明显优于其他方法包括simcse。
图21: PromptBert的效果
结论:prompt模版的选择对于最终效果的影响很大。
4.总结
可以看到上述的方法,都没有在Bert的结构上做调整,而是针对句向量的问题做了相应训练任务的补充。换言之,Bert其实功能还是很强大,并且具备学到句向量生成的能力的,只是需要针对性的训练,才能具备句向量生成的能力。同时可以看到,对比学习对于句向量生成的提升效果显著。
参考文献
1.(sentence bert,EMNLP2019) Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks
https://arxiv.org/abs/1908.10084
2.(bert_flow, EMNLP2020) On the Sentence Embeddings from Pre-trained Language Models
https://arxiv.org/pdf/2011.05864.pdf
3.(bert-whitening) Whitening Sentence Representations for Better Semantics and Faster Retrieval
https://arxiv.org/pdf/2103.15316.pdf
4.(TSDAE, EMNLP2021) Transformer-based Sequential Denoising Auto-Encoder
https://arxiv.org/abs/2104.06979v1
5.(simcse, EMNLP2021) Simple Contrastive Learning of Sentence Embeddings
https://arxiv.org/pdf/2104.08821.pdf
6.(美团consert,ACL2021) ConSERT: A Contrastive Framework for Self-Supervised Sentence Representation Transfer
https://arxiv.org/abs/2105.11741
7.(pairsupcon,EMNLP2021) Pairwise Supervised Contrastive Learning of Sentence Representations
https://arxiv.org/abs/2109.00542
8.(promptbert, ACL2022审稿)PromptBERT: Improving BERT Sentence Embeddings with Prompts