Sentence-BERT:Sentence Embeddings using Siamese BERT-Networks 使用连体BERT网络的句子嵌入
BERT和RoBERTa在诸如语义文本相似性(STS)的句子对回归任务上创造了新的最优的性能。然而,它要求将两个句子都输入网络,这导致了巨大的运算开销:在10,000个句子的集合中寻找最相似的一对,使用BERT需要大约5000万次推理计算(约65小时)。BERT的结构使它不适合语义相似性搜索以及像聚类这样的无监督任务。
本文提出了Sentence-BERT(SBERT),这是一种对预训练的BERT网络的修改,它使用连体和三连体网络结构来推导出语义上有意义的句子嵌入,可以使用余弦相似性进行比较。 这减少了寻找最相似对的努力,从BERT/RoBERTa的65小时减少到SBERT的约5秒,同时保持了BERT的准确度。
我们在常见的STS任务和迁移学习任务中评估了SBERT和SRoBERTa,它超过了其他先进的句子嵌入方法。
1.简介
Sentence-BERT(SBERT)是一个使用连体和三连体BERT网络的修改,能够得出有语义的句子嵌入。这使得BERT能够用于某些目前为止还不适用于BERT的新任务。这些任务包括大规模的语义相似性比较、聚类和通过语义搜索的信息检索。
BERT在各种句子分类和句子对回归任务上创造了新的最先进的性能。BERT使用交叉编码器:两个句子被传递给transformer网络并预测目标值。 然而由于可能的组合太多,这种设置不适合各种配对回归任务。在一个n=10000个句子的集合中找到相似度最高的一对,BERT需要进行n*(n-1)/2=49995000次推理计算。在现代的V100 GPU上,这需要大约65个小时。类似地,在Quora超过4000万个现有的问题中,哪一个与一个新的问题最相似,可以用BERT建模为一对一的比较,然而,回答一个单独的查询需要50多个小时。
解决聚类和语义搜索的常见方法是将每个句子映射到一个向量空间,使语义相似的句子接近。研究人员已经开始将单个句子输入BERT,并得出固定大小的句子嵌入。 最常用的方法是对BERT输出层进行平均化(称为BERT嵌入),或者使用第一个标记([CLS]标记)的输出。正如我们将显示的,这种常见的做法产生了相当糟糕的句子嵌入,往往比平均化的GloVe嵌入更糟糕。
为了缓解这个问题,我们开发了SBERT。连体网络结构使输入句子的固定大小的向量可以被设计出来。使用相似性度量,如余弦相似度或曼哈顿/欧几里得距离,可以找到语义相似的句子。这些相似性度量可以在现代硬件上非常有效地执行,使SBERT可以用于语义相似性搜索和聚类。在10000个句子的集合中寻找最相似的句子对的复杂性从BERT的65小时减少到计算10000个句子嵌入(SBERT约5秒)和计算余弦相似度(约0.01秒)。通过使用优化的索引结构,寻找最相似的Quora问题可以从50小时减少到几毫秒。
我们在NLI数据上对SBERT进行了微调,它所创建的句子嵌入方法明显优于其他最先进的句子嵌入方法,如InferSent和Universal Sentence Encoder。在七个语义文本相似性(STS)任务上,SBERT比InferSent提高了11.7分,比Universal Sentence Encoder提高了5.5分。在句子嵌入的评估工具包SentEval上,我们分别实现了2.1分和2.6分的提高。
SBERT可适用于特定任务。它在一个复杂的论证相似性数据集和一个三元组数据集上取得了新的最先进性能,以区分维基百科文章的不同部分的句子。
本文结构如下:第3节介绍了SBERT,第4节评估了SBERT在常见的STS任务上的表现以及在棘手的论据面相似性(AFS)语料库。第5节在SentEval上对SBERT进行了评估。在第6节中,我们进行了一项消融研究,以测试SBERT的一些设计方面。在第7节中,我们比较了SBERT句子嵌入的计算效率与其他最先进的句子嵌入方法。
2.相关工作
我们首先介绍BERT,然后讨论最先进的句子嵌入方法。BERT是一个预训练的transformer网络,它为各种NLP任务取得了新的最先进的结果,包括问答、句子分类和句子对回归。BERT用于句子对回归的输入包括两个句子,由一个特殊的[SEP]标记分开。 在12层(基础模型)或24层(大型模型)上应用多头注意力,并将结果传递给一个简单的回归函数,以获得最终的标签。使用这种设置,BERT在语义文本相似度(STS)基准上创造了新的最先进的性能。RoBERTa表明,通过对预训练过程的小调整,BERT的性能可以进一步提高。我们还测试了XLNet,但它的结果一般比BERT差。
BERT网络结构的一个很大的缺点是没有计算独立的句子嵌入,这使得从BERT中获得句子嵌入很困难。为了绕过这个限制,研究人员通过BERT传递单一的句子,然后通过平均输出(类似于平均词嵌入)或使用特殊CLS标记的输出来获得一个固定大小的向量。据我们所知,到目前为止,还没有评估这些方法是否导致有用的句子嵌入。
句子嵌入是一个研究得很好的领域,有几十种拟议的方法。Skip-Thought训练一个编码器-解码器架构来预测周围的句子。InferSent使用斯坦福自然语言推理数据集的标记数据和多流派NLI数据集来训练一个连体BiLSTM网络,并对输出进行最大池化。Conneau等人表明,InferSent始终优于SkipThought等无监督方法。Universal Sentence Encoder训练了一个transformer网络,并通过SNLI的训练增强了无监督学习。句子嵌入的训练任务对句子的质量有显著影响。SNLI数据集适用于训练句子嵌入。2018 Yang等人提出了一种使用连体DAN和连体transformer 网络对Reddit的对话进行训练的方法,在STS基准数据集上产生了良好的结果。
Humeau等人解决了BERT的交叉编码器的运行时间开销,并提出了一种方法(poly编码器)来计算候选嵌入物之间的分数。使用注意力计算m上下文向量和预先计算的候选嵌入之间的得分。这个想法可以在更大的集合中找到得分最高的句子。然而,poly编码器有一个缺点,即分数函数不是对称的,而且计算开销对于聚类等使用情况来说太大,这需要O(n2)分数计算。
以前的神经句子嵌入方法从随机初始化开始训练。本文使用预先训练好的BERT和RoBERTa网络,只对其进行微调,以产生有用的句子嵌入。这大大减少了所需的训练时间:SBERT可以在不到20分钟内调整,同时产生比同类句子嵌入方法更好的结果。
3.模型
SBERT在BERT/RoBERTa的输出中添加了一个池化操作,以得出一个固定大小的句子嵌入。我们尝试了三种池化策略:使用CLS-标记的输出(原始Bert做分类的方法,取句子的第一个token的向量),计算所有输出向量的平均值(MEAN策略),以及计算输出向量的最大时间(MAX策略)。默认配置是MEAN。
为了微调BERT /RoBERTa,我们创建了连体和三连体网络来更新权重,以便产生的句子嵌入是有语义的,并且可以用余弦相似性进行比较。
网络结构取决于可用的训练数据。我们试验了以下结构和目标函数。
分类目标函数:我们将句子嵌入u和v的元素之差|u-v|进行分类,并与可训练权重Wt∈R3n×k相乘:
o =softmax(Wt(u,v,|u-v|))
其中n是句子嵌入的维度,k是标签的数量。我们优化交叉熵损失。该结构如图1所示。
图1:带有分类目标函数的SBERT架构,例如,用于对SNLI数据集进行微调。两个BERT网络的权重是相同的(连体网络结构)。
图2:SBERT架构在推理中,例如,计算相似性分数。这个架构也用于回归目标函数。
回归目标函数: 计算两个句子嵌入u和v之间的余弦相似度(图2)。我们使用均方误差损失作为目标函数。
三重目标函数:给定一个锚定句子a,一个正面句子p和一个负面句子n,三重损失调整网络,使a和p之间的距离小于a和n之间的距离。数学上,我们将以下损失函数最小化:
句子嵌入sx为a/n/p,||·||是一个距离度量和差额∈。差额∈确保sp至少比sn更接近sa。作为度量,我们使用欧氏距离,并在我们的实验中设置∈=∈1。
3.1 训练细节
我们在SNLI和多流派NLI数据集的组合上训练SBERT。 SNLI是由570,000个句子对组成的,并标有矛盾、缩略语和中性标签。MultiNLI包含430,000个句子对,涵盖了一系列的口语和书面文本体裁。 我们用一个3-way softmax分类器的目标函数对SBERT进行了微调,我们使用了16的批处理量,学习率为2e-5的Adam优化器,以及10%的训练数据的线性学习率预热。采用平均池化策略。
4.评估-语义文本相似性
我们评估了SBERT在语义文本相似性(STS)任务中的表现。最先进的方法通常会学习一个(复杂的)回归函数,将句子嵌入点映射到相似性分数上。然而,这些回归函数是成对工作的,并且由于组合爆炸,如果句子集合达到一定规模,这些函数往往不能扩展。 相反,我们总是使用余弦相似度来比较两个句子嵌入点之间的相似度。我们还用负的曼哈顿距离和负的欧氏距离作为相似度衡量标准进行了实验,但所有方法的结果都大致相同。
4.1无监督的STS
我们在不使用任何STS特定训练数据的情况下评估了SBERT的STS性能。我们使用2012-2016年STS任务、STS基准,以及SICK-Relatedness数据集。这些数据集对句子对的语义相关度提供了0到5的标签。我们表明,皮尔逊相关度不适合STS。相反,我们计算了句子嵌入和黄金标签的余弦相似度之间的斯皮尔曼等级相关性。其他句子嵌入方法的设置是相同的,相似度是通过余弦相似度计算的。结果如表1所示。
表1:各种文本相似性(STS)任务的句子表征和黄金标签的余弦相似性之间的斯皮尔曼等级相关ρ。性能按惯例报告为ρ×100。STS12-STS16:SemEval 2012-2016,STSb:STSbenchmark,SICK-R:SICK相关度数据集。
结果显示,直接使用BERT的输出会导致相当差的性能。平均计算BERT的嵌入只实现了54.81的平均相关度,而使用CLS标记输出只实现了29.19的平均相关度。两者都比计算GloVe的平均嵌入要差。
使用所描述的连体网络结构和微调机制大大改善了相关性,大大超过了InferSent和Universal Sentence Encoder.唯一一个SBERT表现比Universal Sentence Encoder差的数据集是SICK-R。 Universal Sentence Encoder是在各种数据集上训练的,包括新闻、问答页和讨论论坛,这似乎更适合SICK-R的数据。相反,SBERT只在维基百科(通过BERT)和NNLI数据上进行了预训练。虽然RoBERTa能够提高几个监督任务的性能,但我们只观察到SBERT和SRoBERTa在生成句子嵌入方面的微小差异。
4.2有监督的STS
STS基准(STSb)提供了一个流行的数据集来评估有监督的STS系统。该数据包括来自标题、新闻和论坛三个类别的8,628个句子对,它被分为训练集(5,749)、验证集(1,500)和测试集(1,379)。BERT通过将两个句子传递给网络并使用简单的回归方法进行输出,在这个数据集上创造了新的最先进的性能。
我们使用训练集,利用回归目标函数对SBERT进行微调。在预测时,我们计算句子嵌入之间的余弦相似度。所有系统都用10个随机种子进行训练,以抵消变异。
结果见表2。我们对两种设置进行了试验:只在STSb上进行训练,以及先在NLI上进行训练,然后再在STSb上进行训练。我们观察到,后面的策略导致了1-2个点的轻微改善。这种两步法对BERT交叉编码器的影响特别大,它将性能提高了3-4个点。我们没有观察到BERT和RoBERTa之间的显著差异。
表2:对STS基准测试集的评估。BERT系统用10个随机种子和4个epochs进行训练。SBERT在STSb数据集上进行了微调,SBERT-NLI在NLI数据集上进行预训练,然后在STSb数据集上进行微调。
4.3论据面相似性
我们在论据面相似性(AFS)语料库上评估SBERT。AFS语料库注释了来自社交媒体对话的6000个句子论据对,涉及三个有争议的话题:枪支管制、同性恋婚姻和死刑。数据被注释为从0(“不同主题”)到5(“完全相同”)。AFS语料库中的相似性概念与SemEval的STS数据集中的相似性概念相当不同。STS数据通常是描述性的,而AFS数据是来自于对话的论证性例子。要被认为是相似的,论证不仅要提出相似的主张,还要提供相似的推理。此外,AFS中的句子之间的词汇差距要大得多。因此,简单的无监督方法和最先进的STS系统在这个数据集上表现很差。
我们在两种情况下对SBERT进行评估:1)正如Misra等人提出的,我们使用10倍交叉验证来评估SBERT。这种评估设置的缺点是,不清楚方法对不同主题的概括性如何。因此,2)我们在跨主题设置中评估SBERT。两个主题用于训练,方法是在遗漏的主题上评估的。我们对所有三个主题进行重复,并对结果进行平均。
SBERT使用回归目标函数进行微调。相似性分数是使用基于句子嵌入的余弦相似性计算的。我们还提供了皮尔逊相关性r,以使结果与Misra等人的结果相比较。然而,我们发现皮尔逊相关性有一些严重的缺陷,应避免用于比较STS系统。结果如表3所示。
表3:论据面相似性(AFS)语料库的平均皮尔逊相关性r和平均斯皮尔曼等级相关性ρ。Misra等人提出了10倍交叉验证,我们还在跨主题的情况下进行了评估:方法在两个主题上训练,在第三个主题上评估。
像tf-idf、平均GloVe嵌入或InferSent这样的无监督方法在这个数据集上的表现相当糟糕,得分很低。在10倍交叉验证设置中训练SBERT,其性能几乎与BERT持平。
然而,在跨主题评估中,我们发现SBERT的性能下降了约7分Spearman相关性。为了被认为是相似的,论点应针对相同的主张并提供相同的推理。BERT能够使用注意力来直接比较两个句子(例如,逐字比较),而SBERT必须将单个句子从一个未见过的主题映射到一个向量空间,从而使具有类似主张和推理的论点接近。这是一个更具挑战性的任务,似乎需要超过两个主题的训练才能与BERT持平。
4.4维基百科的章节区分
Dor等人使用维基百科为句子嵌入方法创建了一个主题细粒度的训练、验证和测试集。维基百科的文章被分成不同的部分,专注于某些方面。Dor 等人假设同一部分中的句子在主题上比不同部分中的句子更接近。他们利用这一点创建了一个弱标记句子三联体的大型数据集:锚和正面的例子来自同一章节,而负面的例子来自同一文章的不同章节。例如,来自Alice Arnold的文章:锚:Arnold于1988年加入BBC广播剧公司。 正面:阿诺德于2012年5月获得媒体关注。负面:鲍丁和阿诺德都是业余高尔夫球手。
我们使用Dor等人的数据集。我们使用Triplet Objective,在大约180万个训练三联句上训练SBERT一个epoch,并在222,957个测试三联句上评估它。测试三元组来自一组不同的维基百科文章。作为评估指标,我们使用准确度:正面的例子是否比负面的例子更接近锚?
表4:对维基百科部分三联体数据集的评估。SBERT用三联体损失训练了一个epoch。
结果见表4。Dor等人微调了一个具有三重损失的BiLSTM架构,以得出该数据集的句子嵌入。如表所示,SBERT明显优于Dor等人的BiLSTM方法。
5.评估-SentEval
SentEval是一个流行的工具包,用于评估句子嵌入的质量。句子嵌入被用作逻辑回归分类器的特征。逻辑回归分类器在10倍交叉验证设置中对各种任务进行训练,并计算测试倍数的预测精度。
SBERT句子嵌入的目的不是用于其他任务的迁移学习。在这里,我们认为Devlin等人描述的针对新任务的微调BERT是更合适的方法,因为它更新了BERT网络的所有层,但是,SentEval仍然可以给我们的句子嵌入在各种任务中的质量留下印象。
我们比较了 SBERT 句子嵌入和其他句子嵌入方法在以下七个SentEval迁移任务中的应用:
MR:电影评论片段的情绪预测,以五级为起点。
CR:客户产品评论的情绪预测。
SUBJ:电影评论和情节摘要中句子的主观性预测。
MPQA:来自新闻专线的短语级观点极性分类。
SST:斯坦福情感树库中的二进制标签。
TREC:来自TREC的细粒度问题类型分类。
MRPC:来自平行新闻源的微软研究院转述库。
结果可以在表5中找到。SBERT在7个任务中的5个任务中能够达到最好的性能。与InferSent以及Universal Sentence Encoder相比,平均性能提高了约2个百分点。即使迁移学习不是SBERT的目的,它在这个任务上也超过了其他最先进的句子嵌入方法。
表5:使用SentEval工具包对SBERT句子嵌入进行评估。SentEval通过训练使用句子嵌入作为特征的逻辑回归分类器,在不同的句子分类任务中评估句子嵌入。
看起来SBERT的句子嵌入很好地捕捉了情感信息:与InferSent和Universal Sentence Encoder相比,我们观察到SentEval对所有情感任务(MR、CR和SST)都有很大的改进。
唯一一个SBERT明显比Universal Sentence Encoder差的数据集是TREC数据集。Universal Sentence Encoder是在问答数据上预训练的,这似乎对TREC数据集的问题类型分类任务有好处。
平均BERT嵌入或使用BERT网络的CLS标记输出在各种STS任务中取得了不好的结果(表1),比平均GloVe嵌入更差。然而,对于Sent Eval,平均BERT嵌入和BERT CLS标记输出取得了不错的结果(表5),超过了平均GloVe嵌入。原因是不同的设置。对于STS任务,我们使用余弦相似度来评估句子嵌入的相似性。余弦相似度对所有维度都是平等对待的。相比之下,Senteval将逻辑回归分类器拟合到句子嵌入。这允许某些维度可以对分类结果产生较高或更低的影响。
我们的结论是,BERT的平均嵌入/CLS-token输出返回的句子嵌入不可能与余弦相似性或Manhatten/Euclidean距离一起使用。对于迁移学习,它们产生的结果比InferSent或Universal Sentence Encoder略差。然而,在NLI数据集上使用所述的微调设置与连体网络结构,产生的句子嵌入达到了SentEval工具包的新的先进水平。
6.消融研究
我们已经证明了SBERT句子嵌入质量的强大经验结果。在本节中,我们对SBERT的不同方面进行了消融研究,以便更好地了解其相对重要性。
我们评估了不同的池化策略(MEAN,MAX和CLS)。对于分类目标函数,我们评估了不同的连接方法。对于每个可能的配置,我们用10个不同的随机种子训练SBERT,并对其性能进行平均。
目标函数(分类与回归)依赖于带注释的数据集。对于分类目标函数,我们在SNLI和Multi-NLI数据集的基础上训练SBERT。对于回归目标函数,我们在STS基准数据集的训练集上进行训练。性能在STS基准数据集的开发分割上进行测量。结果如表6所示。
表6:用分类目标函数在NLI数据上训练的,用回归目标函数在STS基准(STSb)上训练的SBERT。配置在STSb的开发集上用余弦相似度和斯皮尔曼等级相关性进行评估。 对于连接方法,我们只报告了使用MEAN池化策略的得分。
当用分类目标函数对NLI数据进行训练时,池化策略的影响相当小,而连接模式的影响则大得多。InferSent和Universal Sentence Encoder都使用(u,v,|u -v|,u ∗v)作为softmax分类器的输入。然而,在我们的架构中,添加元素方式的u∗v会降低性能。
最重要的部分是元素方式的差异|u -v|。注意,连接模式只与训练softmax分类器有关。在推理中,当预测STS基准数据集的相似度时,只有句子嵌入u和v与余弦相似度结合使用。元素方式的差异衡量两个句子嵌入尺寸的距离,确保相似的对更接近,不相似的对相距更远。
当用回归目标函数训练时,我们观察到池化策略有很大影响。在这里,MAX 策略的性能明显低于 MEAN 或 CLS 令牌策略。这与Conneau等人相反,他们发现使用 MAX 而不是 MEAN 池化有利于InferSent的 BiLSTM 层。
7.计算效率
句子嵌入可能需要对数百万个句子进行计算,因此需要较高的计算速度。在这一部分,我们将SBERT与平均GloVe嵌入、InferSent和Universal Sentence Encoder进行比较。
为了进行比较,我们使用了 STS 基准测试中的句子。我们使用python字典查询和NumPy的简单for循环来计算GloVe的平均嵌入。为了改进句子嵌入的计算,我们实施了一个智能批处理策略:长度相近的句子被分成一组,并且在一个小批处理中只填充最长的元素,这大大减少了填充标记的计算开销。
在一台配备英特尔i7-5820K CPU @3.30GHz、Nvidia Tesla V100 GPU、CUDA 9.2和cuDNN的服务器上测量了性能,结果如表7所示。
表7:句子嵌入方法的计算速度(每秒句子数),越高越好。
在CPU上,InferSent比SBERT快65%左右,这是因为InferSent使用一个BiLSTM层,而BERT使用12个堆叠的transformer层。但是,transformer网络的优势是GPU的计算效率。在这里,带有智能批处理的SBERT比InferSent快9%,比Universal Sentence Encoder快55%。智能批处理在CPU上实现了89%的加速,在GPU上实现了48%的加速。平均 GloVe 嵌入显然是计算句子嵌入最快的方法。
8.结论
BERT开箱即用,将句子映射到一个矢量空间中,而这个矢量空间相当不适合于像余弦相似性这样的普通相似性措施。7项STS任务的性能低于GloVe平均嵌入的性能。为了克服这一缺陷,本文提出了Sentence-BERT(SBERT)。SBERT在一个连体/三体网络结构中对BERT进行了微调。我们在各种常见基准上评估了其质量,它可以比最先进的句子嵌入法取得明显的改进。在我们的实验中,用RoBERTa代替BERT并没有产生明显的改善。
SBERT的计算效率很高,在GPU上,它比InferSent快9%左右,比Universal Sentence Encoder快55%左右,SBERT可以用于那些用BERT建模在计算上不可行的任务。 例如,用BERT对10,000个句子进行分层聚类,需要65个小时,因为必须计算大约5千万个句子组合。有了 SBERT,我们可以把减少到5秒左右。