BERT (Devlin et al., 2018)和RoBERTa (Liuet al., 2019)已经在句子对回归任务上取得了最新最好的效果,比如语义文本相似任务(STS)。然而,这需要将两个句子的都喂给网络,这就引起大量的计算消耗:从你1万个句子中找相思对,就需要用BERT进行5千万推力计算(耗时约65小时)。BERT的结构不合适语义相似搜索,同样也不适用于类似聚类的无监督任务。
在本论文中,我将呈现预训练BERT的改进版–Sentence-BERT (SBERT),使用二元或者三元网络结构来获得有语义意义的句向量,该向量可用于预选相似度计算。这能使寻找相思对的工作从BERT/RoBERTa的65小时减少到SBERT的5秒,同时保证BERT的正确率。
我们在常见的STS任务和迁移学习任务上评估SBERT和RoBERTa,它们优于其他最好(获取)句向量的方法。
本论文提出Sentence-BERT(SBERT),使用二元或者三元网络结构的BERT改进版,可以生成有语义的句向量。这就使得BERT可以用于那些目前为止BERT还不适用的新任务。这些任务包括大规模语义相似比较、聚类以及语义信息检索。
BERT在各种句分类和句子对回归任务中创造了新的最优的成绩。BERT使用交叉编码器:将两个句子输入到transformer网络中,对目标值进行预测。然后这种不适合多对回归任务,因为有太多的可能组合。在n=10000个句子中找相似对,BERT最多需要 n·(n 1)/2 = 49995000次推力计算。在现代V100 GPU上操作,这需要大约65小时。类似的,在果壳网的4千万已存在问题中找到和新问题最相似的任务可以建模为用BERT成对比较,然而回答一个单一的问题则需要50个小时。
解决聚类和语义搜索常用的方法就是将句子映射到向量空间,这样语义相似的句子就会离的很近。研究人员已经开始将单个句子输入到BERT中,然后生成固定大小的句向量。最常见的方法就是将BERT的输出层(被认为是BERT的向量)平均化或者通过使用第一个token([CLS] token)作为句向量。我们即将展示,这种常见的方法会产生效果很差的句向量,通常比GloVe向量(Pennington et al., 2014)的平均更差。
为了解决这个问题,我们开发了SBERT。二元网络结构能够生成输入句子的固定长度向量。使用一个相似度量,比如预选相似度、曼哈度距离/欧式距离等,语义相似句子就能找到。在现代硬件基础上这些距离度量能被有效的使用,是的SBERT应用于语义相似搜索和聚类。在10000个句子集合中找最相似句子对的复杂性能从使用BERT的65小时减少到10000句子向量的计算量(SBERT用大约5秒)和计算预选相似度(大于0.01秒)。通过使用优化的索引结构,在果壳网中找最相似问题的任务从50小时减低到几毫秒(Johnson et al., 2017)。
我们在NLI数据集上做微调生成的句向量,显著优于其他方法生成的效果很好的句向量,比如InferSent(Conneau et al., 2017)和 通用句子编码器(Cer et al., 2018)。在7个STS任务上,SBERT取得了很大的提升,相较于InferSent提升11.7%,相较于通用句子编码器提升5.5%。(使用)句向量评价工具SentEval (Conneau and Kiela, 2018),我们分别取得了2.1%和2.6%的提升。
SBERT也适用于特定的任务。它在具有挑战性的论证相似数据集上(Misra et al.,2016)和区分维基百科文章中不同句子的三元数据集上(Dor et al., 2018)取得了最好的效果。
本文结构如下:第3小节介绍SBERT,第4小节在极具挑战的AFS语料集上评估SBERT,第5小节在SentEval上评估SBERT,第6小节进行消融研究来测试SBERT的一些设计问题,第7小节,我们与其他效果好的句向量方法对比SBERT句向量计算的高效性。
我们首先介绍BERT,然后,讨论当前效果好的句向量方法。
BERT (Devlin et al., 2018)是一个预训练的transformer网络(Vaswani et al., 2017),它在多种NLP任务中取到了最好的效果,包括问答系统、句子分类以及句子对回归。
句子对回归的BERT输入由两个句子组成,句子被特殊的[SEP]token分割。在12层上(BERTBASZE)或者14层(BERTLARGE)使用多头注意力,一个简单的回归函数作为输出来生成最终的标签。BERT使用这样的配置,在语义文本相似(STS)的基准集(Cer et al.,2017)上取得了新的最佳效果。RoBERTa模型(Liu et al., 2019)说明,可以通过与训练的小规模适应来大大提高BERT性能。我们也测试了XLNet (Yang et al., 2019),但是总体上逊色于BERT。
BERT网络结果的一大劣势就是不能计算独立的句向量,这就使得从BERT中很难生成句向量。为避开这个限制,研究人员将单个句子输入到BERT,然后通过平均化输出(类似于平均词向量)或者使用特殊CLS token(例如: May et al.(2019); Zhang et al. (2019); Qiao et al. (2019))的输出来生成固定大小的向量。著名的bert-as-a-service-repository提供了这两个选项。据我们所知,目前还不能评估这些方法是否对句向量有用。
句向量是个很好的研究领域,有几十种已提出的方法。Skip-Thought(Kiros et al., 2015)训练编码-解码器结构来预测上下文句子。InferSent (Conneau et al., 2017)使用斯坦福自然语言推理的标定数据集(Bowman et al., 2015)和多累NLI数据集(Williams et al., 2018)训练了一个双向LSTM网络,输出层使用最大池化层。Conneau等人的研究表明,InferSent一直犹豫像SkipThought的非监督方法。通用句子编码器(Cer et al., 2018)在SNLI上训练transformer网络,增强非监督学习。Hill等人研究表明,训练句向量的任务明显影响效果。先前的研究工作(Conneau et al., 2017; Cer et al., 2018)发现SNLI数据集是和训练句向量。Yang et al.提出一个在红迪网(Reddit)对话数据上训练,使用二元DAN和二元transformer网络的方法,在STS基准数据集上可以产生很好的效果。
Humeau等人的研究(2019)解决BERT交叉编码器的实时消耗问题,并提出了一个方法(poly编码器),该方法通过注意力计算m个上下文向量之间的分数以及预计算候选向量。这个思路在大规模数据集中找最高得分句子有效果。然而,poly编码器有一些缺陷:分数计算函数不对称;对于像聚类这种计算量复杂度O(n2)的用例,计算消耗太大。
先前的句向量方法都从训练随机初始化开始。本文中,我们使用预训练BERT和RoBERTa网络,并且只微调它来生成有用的句向量。这有效的减少了训练时间:SBERT微调小于20分钟,同时生成比同类句向量方法更好的向量。
SBERT在BERT、RoBERTa的输出层家里一个池化操作,来生成固定大小的句向量。我们实验用来三个池化策略:使用CLS token的输出;计算所有输出向量的均值(均值策略);计算输出向量的随时间变大最大值(最大值策略)。默认配置是均值策略。
为了微调BERT、RoBERTa,我们创建二元和三元的网络结构(Schroff et al.,2015)来更新权重,使得生成的句向量有语义并且可以用余弦相似度作比较。
网络结构依赖已得到的训练数据。我们用一下结构和目标函数进行实验。
分类目标函数。我们将句向量u,v和向量差|u-v|拼接起来,然后乘以可训练的权重 W t ∈ R 3 n k W_t\in\mathbb R^{3nk} Wt∈R3nk:
o = s o f t m a x ( W t ( u , v , ∣ u − v ∣ ) ) o=softmax(W_t(u,v,|u-v|)) o=softmax(Wt(u,v,∣u−v∣))
其中n是句向量维度,k是类别数。我们优化交叉熵损失函数。如图1结构所示。
回归目标函数。如图2所示,计算两个句向量u和v的余弦相似度。我们使用均方差损失函数作为目标函数。
三元(triplet)目标函数。给定一个锚点句子(anchor sentence)a,一个正例句子p和一个负例句子n,三元损失来调节网络,使得a和p的距离要小于a和n的距离。数学表达,我们要最小化以下损失函数:
m a x ( ∣ ∣ s a − s p ∣ ∣ − ∣ ∣ s a − s n ∣ ∣ + γ , 0 ) max(||s_a-s_p||-||s_a-s_n||+\gamma, 0 ) max(∣∣sa−sp∣∣−∣∣sa−sn∣∣+γ,0)
s x s_x sx是a/p/n的句向量,||.|| 距离度量和边界 γ \gamma γ,边界 γ \gamma γ保证比离更近。正如我们使用的欧氏距离度量,在我们的实验中,设置 γ \gamma γ=1。
我们在SNLI(Bowman et al., 2015)和多类别NLI(Williams et al., 2018)的联合数据集上训练SBERT。SNLI包含了57万句子对,这些句子对有对立,支持和中立的标记。MultiNLI包含了43万句子对,涵盖了各种口语和书面语。每一次迭代,我们使用3种softmax分类目标函数微调SBERT。我们使用的批大小为16,学习率为2e-5的Adam优化器,且线性学习率训练超过10%的训练数据。默认池化策略为均值策略。
我们评估SBERT对于常用语义文本相似任务的性能。当前比较好的方法常会学习一个负责的回归函数,将句向量对应到一个相似分数上。然而,这些回归函数用在句子对上会引起组合膨胀,当句子集合达到一定规模,句子对经常出现不可数(不可列)状态。反之我们使用余弦相似度来比较两个句向量之间的相似性。我们也是用负曼哈顿距离和负欧氏距离作为相似度量来做实验,但是所有方法的结果大体一致。
我们不使用任何STS特定的训练数据,来评估SBERT对于STS的性能。我们使用STS任务2012 - 2016 (Agirre et al., 2012, 2013, 2014, 2015, 2016),STS基准(Cer et al., 2017)以及SICK-Relatedness数据集(Marelli et al., 2014)。这些数据集提供表示句子对之间的语义关联标签,标签区间0到5。Reimers等人的研究(2016)说明皮尔森相关系数非常不适用于STS。取而代之,我们计算斯皮尔曼对句向量的余弦相似度和目标标签进行排序。其他句向量方法的的设置雷同,通过余弦相似度计算相似。结果如表1所示。
结果表明直接使用BERT输出层效果相当差。均值化BERT向量只能达到均值化相关系数54.18,使用CLStoken的输出只能达到29.19.这两结果都比均值化GloVe向量还差。
使用之前描述的二元(siamese)网络结构和微调机制能充分的提升相关系数,且明显优于InferSent和通用句子编码器。SBERT唯一逊色与通用句子编码器的数据集是SICK-R。通用句子编码器在多种数据集上训练,包括新闻、问答片段以及论坛讨论等,这些都和SICK-R数据集更匹配。相反,SBERT只在维基百科(通过BERT)和NLI数据集上做预训练。
虽然RoBERTa可以提升很多分监督任务的性能,但是我们在生成句向量方面只观察到SBERT和SRoBERTa的细微差别。
STS基准集(STSb)提供了一个通用的评价有监督STS系统的数据集。这里包含了8628对句子对,涉及三种类型:标题、新闻和讨论(形式)。分成了训练集(5749)、验证集(1500)和测试集(1379)。BERT在这个数据集上取得了最新的好成绩,通过将两个句子输入到网络,然后使用一个简单的回归方法来做输出。
我们使用训练集来微调SBERT用的回归目标函数。在预测时,我们计算两个句向量的余弦相似度。所有的系统使用10个随机种子进行训练来抵消方差(Reimers and Gurevych, 2018)。
结果如表2所示。我们尝试了两种方式:1.只在STSb上训练;2.先在NLI上训练,再在STSb上训练。我们观察到后一个策略会有1-2个百分点的稍微提升。分两步的策略特别对BERT交叉编码器有大的影响,提升了3-4个百分点。我们并没有发现BERT和RoBERTa之间有明显差别。
4.3 论证方面相似性(Argument Facet Similarity不确定这么翻译合适不)
我们在Misra等人2016年研究工作的论证方面相似性(AFS)语料集上评估SBERT。AFS语料库标定了6000句子论证对,它们来源于从社交媒体三个有争议性的主题对话:枪支管控、同性恋结婚以及死刑。这些数据标注范围从0(不同主题)到5(完全相同)。AFS语料集中相似的概念和SemEval的STS数据集中的相似概念完全不一样。STS数据一般是描述性的,而AFS数据则是从对话中摘出来的论证性的。为保证相似,论证性的语句对不仅要有相似的立场,还提供相似的论证。进一步的,AFS中句子之间的词汇差别很大一些。因此,简单地给监督方法和最佳的STS系统在这个数据集上表现都很差(Reimers et al., 2019)。
在这个数据集上我们用两种场景来评估SBERT:1)如Misra等人提出,我们用10折交叉验证来评估SBERT。这个评估方法的缺点:方法如何生存不同的主题不是很清晰。因此,2)在交叉主题上验证SBERT。两个主题用于训练,然后在剩下的主题上验证该方法。我们在三个主题上重复这个步骤,然后对结果取平均。
使用回归目标函数来微调SBERT。基于使用句向量的余弦距离来计算相似分数。我们也提供皮尔森相关系数来和Misra等人的结果作比较。然而,我们展示了(Reimers et al., 2016)皮尔森相关系数有一些严重的缺点,并且应该避免和STS系统作比较。结果如表3所示。
非监督方法,比如tf-idf、均值化GloVe向量或者InferSent,在这个数据集上得分都很低,表现很差。在10折交叉验证设置下训练的SBERT给出来和BERT相当的效果。
然而,在交叉主题验证中,我们发现SBERT掉了皮尔森相关系数7个百分点。为保证相似,论证句子应该有相同的观点和论据。BERT利用注意力可以直接比较句子(比如,一个词一个词的比较),然而,SBERT必须将未知主题的单个句子对应到向量空间,使得有相似观点和论据的论证句子距离很近。这是一个非常有挑战的工作,需要两个以上的主题做训练才能和BERT相当。
Dor等人于2018年使用维基百科针对句向量方法创建了一个细粒度主题训练、验证和测试集。维基百科的文章分布在不同的部分,每个部分的文章集中在某一领域。Dor等人假设同一部分下的句子比不同部分之间的句子在主题方面更接近。他们使用这个假设创建了一个弱标记的三元句子组的大数据集:主题和正样例来自同一个部分,而负样例来自同一篇文章的不同部分。例如,摘自Alice Arnold文章,主题:Arnold 1988年加入英国广播公司,正样例:Arnold 2012年5月获得媒体关注,负样例:Balding和Arnold都是业余高尔夫爱好者。
我们使用Dor等人的这个数据集。使用三元组目标,每次迭代在180万三元组训练集上训练SBERT,然后再222957三元组测试集上评估它。三元组测试集数据源自一组不同的维基百科文章。我们使用准确率来做评估:是不是正样例比负样例更接近主题?
结果如表4所示。Dor等人使用三元组损失函数来微调BiLSTM结构,从而生成这个数据集的句向量。如表所示,SBERT明显优于Dor等人的BiLSTM.
SentEval(Conneau and Kiela, 2018)是一个评估句向量质量的通用工具包。句向量用于逻辑回归分类器的特征。在10-折交叉验证的设置下,逻辑回归分类器在多个任务上进行训练,然后在测试集上计算预测准确率。
SBERT句向量的目标并不是用于其他任务做迁移学习。这里,我们认为正如Devlin等人2018年描述的微调BERT对于新任务是更合适的方法,因为它更新BERT网络的所有层。然而,SentEval仍然可以给出,在多个任务上我们句向量质量的效果。
我们使用以下7中SentEval迁移任务来比较SBERT句向量和其他句向量方法:
• MR: 针对影评片段的语义预测(Pang and Lee, 2005)
• CR: 针对顾客产品评价的语义预测(Hu and Liu, 2004)
• SUBJ: 影评和剧情总结句子的主题预测(Pang and Lee, 2004)
• MPQA: 新闻专线的段级别观点分类(Wiebe et al., 2005)
• SST: 二分类的斯坦福情感树图库(Socher et al., 2013)
• TREC: TREC的细粒度问题类型分类(Li and Roth, 2002)
• MRPC: 源于相似新闻的微软研究释义语料库(Dolan et al., 2004)
结果如表5所示。7个任务中,SBERT能在5个上达到最佳效果。相较于InferSent和通用句子编码器,平均效果提升2个百分点。即使迁移学习不是SBERT的目标,在这个任务上,它都优于其他效果好的句向量模型。
SBERT句向量能明显获取到语义信息情感信息:相较于InferSent和通用句子编码器,我们发现在SentEval上的所有情感任务都有很大的提升。
唯一一个SBERT效果显著地域通用句子编码器的数据集是TREC。通用句子编码器使用问答数据做预训练,这些数据对于TREC数据集的问题类别分类很有益。
均值化BERT向量或使用BERT的CLS token的输出,在多种STS任务上效果不好(如表1),都要逊色于均值化GloVe向量。然而对于SentEval,两个都取得了比较好的效果(如表5),且由于均值化GloVe向量。这是由于不同的设置。对于STS任务,我们使用余弦相似度来评估句向量之间的相似性。余弦相似度对于所有维度都是一样的。相反,SentEval将逻辑回归分类器适应于句向量。这就允许某些维度在分类结果上有或高或低的影响。
我们认为:均值化BERT向量/BERT的CLS-token输出返回的句向量,应用于余弦相似度或者曼哈顿距离/欧氏距离是不可行的。对于迁移学习,他们的效果比InferSent或者通用句子编码器稍微差些。然而,在NLI数据集上用二元网络结构微调,产生的句向量对于SentEval工具包达到了新的最佳效果。
对于SBERT向量的质量,我们有很强的实验论证结果。在本小节,为了更好的理解SBERT方面的相对重要性,我们对它们进行消融研究。
我们评估了不同的池化策略(均值、最大化以及CLS)。对于分类的目标函数,我们使用不同的拼接方法。对于每个可能的配置,我们用10随机种子训练SBERT,然后均值化结果。
目标函数(分类 vs. 回归)依赖于数据集。对于分类目标函数,我们基于SNLI和Multi-NLI数据集训练SBERT。对于回归目标函数,我们在STS基准的训练集上训练。在STS基准数据集的分割验证集上来度量效果。结果如表6所示。
当在NLI数据集上训练分类器目标函数时,池化策略影响很小。拼接模式的影响很大。InferSent(Conneau et al., 2017)和通用句子编码器(Cer et al., 2018)都使用(u, v, |u-v|, uv)作为softmax分类器的输入。然而,在我们的结构中增加uv反而减低了效果。
最重要的组成部分是|u-v|。注意,这种拼接模式之和训练softmax分类器相关。根据推断,预测STS基准数据集的相似性时,只有句向量u和v用于和余弦相似度联合。元素的差别度量两个句向量各维度之间的距离,确保相似对更近或者不相似的离得更远。
当训练回归目标函数时,我们观察到池化策略有很大影响。最大池化策略表现明显比均值池化策略或者CLS-token策略要差。这对比与2017年Conneau等人的研究,他们发现对于InferSent的BiLSTM层,最大值化要比均值池化策略更有益。
句向量需要潜在计算百万级别的句子,因此,需要较高的计算速度。在本小节,我们将SBERT与均值化GloVe、InferSent(Conneau et al., 2017)以及通用句子编码器(Cer et al., 2018)作比较。
我们使用STS基准数据集中的句子进行我们的比较。我们使用直接使用Python的lookups和NumPy实现的简单for循环来计算均值化GloVe。InferSent基于PyTorch实现。对于通用句子编码器,我们基于TensorFlow使用TensorFlow hub 版本来实现。SBERT基于PyTorch实现。为改进句向量计算速度,我们实现了一个只能的批策略:将长度差不多的句子作为一组处理,只在小组里填充到句子长度最长的。这样直接减少了填充token的计算量。
性能评估基于以下服务器配置:Intel i7-5820K CPU @ 3.30GHz, Nvidia Tesla V100 GPU, CUDA 9.2 and cuDNN。结果如表7所示。
在CPU机器上,InferSent比SBERT块65%,这是因为InferSent有更简单的网络结构。InferSent使用一个简单的BiLSTM层,而BERT使用了12个成堆的Transformer。然而,Transformer网络的优势就是在GPU上计算效率。因此,使用智能批处理的SBERT比InferSent快9%,比通用句子编码器快55%。智能批处理在CPU上提升速度89%,在GPU上提升48%。均值化Glove显然在计算句向量的方法中书读最快。
我们证明了BERT直接将句子映射到向量空间得到的向量,很不适合用于相似度量,比如余弦相似度。7个STS任务的结果均低于均值化GloVe。
为克服这一缺点,我们提出了SBERT。SBERT在二元、三元的网络结构上微调BERT。我们在多种通用基准数据机上评估SBERT效果,与最佳的句向量方法比较,它取得了显著的改进。用RoBERTa取代BERT,并不能在我们的试验中取得显著的提升。
SBERT计算高效,在GPU上,比InferSent快9%,比通用句子编码器快55%。 SBERT可用于计算上用BERT建模不可行的任务。比如,使用分层聚类需要BERT65小时的10000句子聚类,因为需要计算5千万句子组合。使用SBERT,我们能减少到5秒。
了解更多相关知识,欢迎关注“机器爱学习”公众号~
曼哈顿距离
BERT