译文:Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks

摘要

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,它们优于其他最好(获取)句向量的方法。

1 简介

本论文提出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句向量计算的高效性。

2 相关研究

我们首先介绍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分钟,同时生成比同类句向量方法更好的向量。

3 模型

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} W

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值