Sentence Embeddings using Siamese BERT-Networks
使用孪生BERT网络结构的句子嵌入
Nils Reimers, Iryna Gurevych
EMNLP 2019
论文下载地址:https://arxiv.org/abs/1908.10084
该论文的相关代码已开源,github链接:sentence-transformers,sentenc-tansformers文档:官方文档
sentenc-tansformers非常好用,封装的很好,使用简单
虽然BERT和RoBERTa在很多句子对形式的回归任务(例如文本语义相似度)上达到了SOTA效果,但是它们还存在一些缺点:在这些任务中,它们均需要将比较的两个句子都传入到模型中计算,计算开销过大。BERT模型在一个1W句子集合中,找出最相近的一个句子对,需要5千万次推断计算(约65小时)才能完成,所以BERT并不适合语义相似度搜索等任务。
在该论文中,作者提出了一个新的模型,Sentence-BERT(简称SBERT)。SBERT采用双重或三重BERT网络结构,具体结构介绍会在后文中详细介绍。如果使用的是基于RoBERTa模型,则改造后的模型简称为SRoBERTa。
通过SBERT模型获取到的句子embedding,可以直接通过cos相似度计算两个句子的相似度,这样就大大减少了计算量。因为在使用BERT模型进行句子间相似度的判断时,需要从句子集合中,选出两个句子进行组合,传入BERT中进行计算,而使用SBERT模型,只需要将集合中每个句子单独传入到模型中,得到每个句子的embeding,计算相似度只需要使用cos函数计算两两embeding的cos距离即可。因此,使用BERT/RoBERTa模型需要65h才能完成的寻找最相似句子对任务,SBERT模型完成仅需5s。
作者在一些STS任务和迁移学习任务上评估SBERT模型,该模型达到了新的SOTA水平。
SBERT模型可以很好的从语义上表征一个句子,这使得语义越相似的句子在向量空间中的embeding向量距离越近。
这使得SBERT模型可以很好的完成一些BERT不适合完成的任务,例如:大规模语义相似度比较、聚类、通过语义搜索的信息检索等任务。
我们上面提到过,BERT判断两个句子语义是否相似,需要将两个句子拼起来传入到model里,不适合多句子相似度判断。如果从句子数量为n的集合中,找出最近似的两个句子,则需要n*(n-1)/2次比较,并且每次比较均需要传入到BERT模型中进行计算,这个开销是很大的。
目前的一个通用的方法是将语义相近的句子,映射到同一向量空间中相近的位置,通过一个向量来表征整个句子。
BERT惯用的表征一个句子的方式是取第一个[CLS] token的输出或所有输出取平均来表示一个句子,经过试验证明,这些方式经常会产生质量很差的embedding。
为了解决问题,作者提出了SBERT模型,SBERT模型输出的sentence embedding,可直接通过cos距离、欧式距离或曼哈顿距离就可计算出句子间相似度。
与其他的句子表征模型相比,SBERT在很多任务上都取得了SOTA。
首先介绍了BERT,然后讨论了一些其他的句子表征模型,例如InferSent、 SkipThought、Universal Sentence
Encoder等,在后面的实验部分,也会与这些模型进行比较。
SBERT基于预训练的BERT改进后的模型,大大减少了训练所需的时间,SBERT经过不到20分钟的微调后,就已超越了很多其他的sentence embedding模型。
SBERT模型采用三种pooling策略:CLS
、MEAN
、MAX
,默认SBERT采用MEAN pooling 。
采用双重或三重网络结构对BERT/RoBERTa进行微调,更新模型参数,使得调整后的模型,产生的句子embedding可直接通过cos计算相似度。
实验的结构和目标函数:
使用cos函数计算两个句子embeding的相似度,使用均方误差作为损失函数。
结构如图2所示:
使用SNLI
和Multi-Genre NLI
数据集训练SBERT。
训练参数设置:
在一些文本语义相似度任务(STS)评估SBERT表现。
使用cos相似度评估两个句子embeding的相似度,作者也尝试换成曼哈顿方式和欧式距离,实验结果表明,效果几乎相同。
使用的数据集:STS tasks 2012 - 2016
、STS benchmark
、SICK-Relatedness
。
这些训练集均提供0-5的标签,0表示两个句完全无关,5表示两个句子完全相同。
经过实验证明,Pearson相关性很不适合于评估STS任务。因此,使用Spearman相关性来评估。
实验结果如表1所示:
实验分析:
SICK-R
这个数据集上的表现不如Universal Sentence Encoder模型。这必须要自圆其说一波,作者解释如下:Universal Sentence Encoder模型在很多数据集上进行了训练,包括新闻,问答对等等,这些数据集内容更适合SICK-R
,然而,SBERT仅在Wikipedia和NLI数据集上进行了预训练。使用的数据集:STS benchmark (STSb)
实验结果如表2所示:
实验设置了两种不同的训练策略来比较结果:
1.只在STSb训练集上训练
2.现在NLI训练集上训练,再在STSb数据集上训练
实验分析:
使用的数据集:Argument Facet Similarity (AFS)
该数据集与STS数据集相比差异较大,STS数据通常是描述性的数据,而AFS数据是来自对话中的论据节选。
由于 Argument数据集的特殊性,很多方法在该数据集上表现很多差。
使用训练集:Wikipedia
我们通过经验认为,来自同一章节或段落的句子间是比来自不同段落的句子更接近的,相似度更高。
因此,Wikipedia训练集将来自同一段的句子作为正例,来自不同段的句子作为负例。
使用数据集: SentEval
SentEval是一个用来评估句子embeding质量的工具。
SBERT设计的目的不是用于迁移学习任务,但是Sbert 在SentEval上数据集上表现也很出色,证明了Sbert在迁移学习任务上的性能。
作者在七种SentEval迁移任务上与其他的sentence embeding模型进行了比较:
实验结果如表5所示:
实验分析:
消融实验,其实可以简单的理解为就是控制变量法,探寻模型各种设置的相对重要性。
作者主要进行了两个实验的探索,第一个为不同pooling策略的影响,第二个为对于分类目标函数,对两个句子向量的不同拼接方法的影响。
采用不同的随机种子测试10次并求得平均结果。
分类目标函数使用SNLI数据集训练,回归目标函数使用STS数据集训练,使用STS数据集作为验证测试。Concatenation拼接消融实验均采用mean pooling策略。
实验分析:
在该部分,作者测试了SBERT的计算效率,并与其他模型就行了比较,所有模型统一使用STS数据集进行测试。
作者使用了一个减少padding tokens的计算开销策略:把长度相近的句子,放在一个mini-batch中,这样只需要按照所在mini-batch中最长句子长度进行填充,减少所需总填充token的个数与次数。
略