Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks——使用孪生BERT网络的句子嵌入 一、研究背景与问题定义1.1 BERT 的强大与局限BERT 和 RoBERTa 在句子对回归任务如语义文本相似度 STS上达到了当时最先进的性能。但 BERT 采用的是交叉编码器cross-encoder结构将两个句子同时输入网络通过注意力机制直接比较它们。这种结构的致命缺陷是计算复杂度为 O(n²)在 10,000 个句子中找最相似的一对需要约 5,000 万次推理计算耗时约65 小时。因此 BERT无法直接用于语义搜索、聚类、大规模相似度比较等任务。1.2 简单池化 BERT 输出的效果很差已有研究者通过平均 BERT 输出层或使用[CLS]token 来获取句子向量。本文发现这些方法效果甚至不如平均 GloVe 向量在 STS 任务上表现糟糕平均相关度仅 46.35 和 29.19。二、核心贡献Sentence-BERT (SBERT)2.1 核心思想将 BERT 改造为孪生网络Siamese Network或三胞胎网络Triplet Network结构。让 BERT 为单个句子独立生成固定大小的句子嵌入sentence embeddings。相似度比较时直接使用余弦相似度等高效度量无需再成对输入。2.2 池化策略在 BERT 输出之上增加池化层实验了三种策略MEAN对所有 token 的输出向量取平均默认策略。MAX逐元素取最大值。CLS直接使用[CLS]token 的输出。2.3 三种训练目标函数目标函数适用场景结构描述分类目标NLI 数据SNLI MultiNLI将(u, v, |u-v|)拼接后通过 softmax 分类优化交叉熵损失回归目标STS 标注数据直接计算u和v的余弦相似度优化均方误差损失三胞胎目标三元组数据如维基百科章节区分最小化锚点与正例的距离同时最大化锚点与负例的距离带边距约束2.4 训练细节训练数据SNLI57万对 MultiNLI43万对总计约 100 万句子对。训练时长仅需不到 20 分钟微调一个 epoch。优化器Adam学习率 2e-5batch size 16线性预热 10%。三、核心成果与实验评估3.1 语义文本相似度STS任务无监督 STS不使用 STS 训练数据SBERT 在 7 个 STS 数据集上均大幅超越 InferSent 和 Universal Sentence Encoder。平均 Spearman 相关系数SBERT-base 达到77.03而 InferSent 仅 68.03Universal Sentence Encoder 为 74.92。有监督 STS使用 STSb 训练集SBERT-STSb-base 达到84.67与 BERT 交叉编码器84.30相当。先用 NLI 再在 STSb 上微调性能进一步提升至85.35。3.2 论点面相似度AFSAFS 数据来自社交媒体论证难度远高于常规 STS 数据。在 10 折交叉验证下SBERT 性能接近 BERT。在跨主题迁移场景下SBERT 性能下降约 7 点说明该任务对 SBERT 更具挑战性。3.3 维基百科章节区分使用三胞胎损失训练预测两个句子是否来自同一维基百科章节。SBERT 准确率约80.4%远超 Dor 等人 BiLSTM 方法的74%。3.4 SentEval 迁移学习评估SentEval 将句子嵌入作为特征训练逻辑回归分类器。SBERT 在 7 个任务中的 5 个上取得最优平均性能比 InferSent 和 Universal Sentence Encoder 高出约 2 个百分点。尤其在情感分析任务MR、CR、SST上提升显著。四、消融研究Ablation Study池化策略在分类目标下影响不大在回归目标下 MAX 策略显著差于 MEAN 和 CLS。连接模式(u, v, |u-v|)是最优组合加入u*v反而会降低性能。核心因素逐元素差值|u-v|对训练 softmax 分类器最为关键。五、计算效率对比方法CPU句/秒GPU句/秒平均 GloVe6,469—InferSent1,3761,876Universal Sentence Encoder671318SBERT-base无智能批处理441378SBERT-base智能批处理8322,042SBERT 在 GPU 上比 InferSent 快约9%比 Universal Sentence Encoder 快约55%。智能批处理按长度分组带来CPU 89%和GPU 48%的加速。10,000 句聚类的耗时从 BERT 的65 小时降至 SBERT 的约 5 秒。六、关键结论直接使用 BERT 输出做句子嵌入效果很差不适合余弦相似度比较。SBERT 通过孪生/三胞胎网络 NLI 微调能生成高质量的、可直接比较的句子嵌入。性能在 STS 和 SentEval 上均显著优于当时最先进的 InferSent 和 Universal Sentence Encoder。效率计算速度快适合实际大规模部署聚类、语义搜索、信息检索。RoBERTa 替代 BERT在句子嵌入任务上未见显著收益。七、研究意义与应用价值SBERT 填补了BERT 强大能力与高效率应用之间的鸿沟。使得 BERT 级别的语义理解能力可以落地于实际工程场景大规模语义搜索句子聚类问答匹配如 Quora 重复问题检测论证相似度分析文本语义相似度计算这里是自己的论文阅读记录感兴趣的话可以参考一下如果需要阅读原文的话可以看这里如下所示项目地址在这里如下所示摘要BERT (Devlin et al., 2018) 和 RoBERTa (Liu et al., 2019) 在语义文本相似度 (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 网络然后预测目标值。然而由于可能的组合太多这种设置不适用于各种句子对回归任务。在一个包含 n10000 个句子的集合中使用 BERT 寻找相似度最高的句子对需要进行 n⋅(n−1)/249995000 次推理计算。在现代 V100 GPU 上这需要大约 65 小时。类似地对于 Quora 上现有的超过 4000 万个问题找出与一个新问题最相似的问题可以建模为成对比较但回答单个查询就需要超过 50 小时。解决聚类和语义搜索的常用方法是将每个句子映射到一个向量空间使得语义相似的句子彼此靠近。研究人员已经开始将单个句子输入 BERT 并推导出固定大小的句子嵌入。最常用的方法是对 BERT 的输出层进行平均称为 BERT 嵌入或使用第一个 token[CLS] token的输出。正如我们将要展示的这种常见做法产生的句子嵌入质量相当差通常比平均 GloVe 嵌入 (Pennington et al., 2014) 还要差。为了解决这个问题我们开发了 SBERT。孪生网络架构使得可以为输入句子推导出固定大小的向量。使用余弦相似度或曼哈顿/欧几里得距离等相似度度量可以找到语义相似的句子。这些相似度度量可以在现代硬件上非常高效地执行使 SBERT 能够用于语义相似度搜索以及聚类。在一个包含 10,000 个句子的集合中寻找最相似句子对的复杂性从使用 BERT 的 65 小时降低到计算 10,000 个句子嵌入使用 SBERT 约 5 秒和计算余弦相似度约 0.01 秒。通过使用优化的索引结构从 50 小时缩短到几毫秒 (Johnson et al., 2017)。我们在 NLI 数据上微调 SBERT生成的句子嵌入显著优于其他最先进的句子嵌入方法如 InferSent (Conneau et al., 2017) 和 Universal Sentence Encoder (Cer et al., 2018)。在七个语义文本相似度 (STS) 任务上SBERT 相比 InferSent 提高了 11.7 分相比 Universal Sentence Encoder 提高了 5.5 分。在句子嵌入评估工具包 SentEval (Conneau and Kiela, 2018) 上我们分别取得了 2.1 和 2.6 分的提升。SBERT 可以适应特定任务。它在具有挑战性的论点相似性数据集 (Misra et al., 2016) 以及一个用于区分维基百科文章不同部分句子的三元组数据集 (Dor et al., 2018) 上设定了新的最佳性能。本文结构如下第 3 节介绍 SBERT第 4 节在常见的 STS 任务和具有挑战性的 Argument Facet Similarity (AFS) 语料库 (Misra et al., 2016) 上评估 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 层基础模型或 24 层大型模型上应用多头注意力并将输出传递给一个简单的回归函数以得出最终标签。使用这种设置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 代码库也提供了这两种选项。据我们所知目前还没有评估这些方法是否能产生有用的句子嵌入。句子嵌入是一个研究深入的领域有数十种提出的方法。Skip-Thought (Kiros et al., 2015) 训练一种编码器-解码器架构来预测周围的句子。InferSent (Conneau et al., 2017) 使用斯坦福自然语言推理数据集 (Bowman et al., 2015) 和多体裁 NLI 数据集 (Williams et al., 2018) 的标注数据训练了一个带有最大池化的孪生 BiLSTM 网络。Conneau 等人表明InferSent 在性能上持续优于 Skip-Thought 等无监督方法。Universal Sentence Encoder (Cer et al., 2018) 训练了一个 Transformer 网络并将无监督学习与 SNLI 上的训练相结合。Hill 等人 (2016) 表明训练句子嵌入的任务显著影响其质量。先前的工作 (Conneau et al., 2017; Cer et al., 2018) 发现 SNLI 数据集适合训练句子嵌入。Yang 等人 (2018) 提出了一种使用孪生 DAN 和孪生 Transformer 网络在 Reddit 对话上进行训练的方法该方法在 STS 基准数据集上取得了良好结果。Humeau 等人 (2019) 解决了 BERT 交叉编码器的运行时间开销问题并提出了一种方法多编码器用于使用注意力机制计算 m 个上下文向量和预计算候选嵌入之间的分数。这个想法适用于在更大的集合中寻找得分最高的句子。然而多编码器的一个缺点是得分函数不是对称的并且计算开销对于聚类等用例来说太大因为聚类需要 O(n2) 次得分计算。之前的神经句子嵌入方法都是从随机初始化开始训练的。在本文中我们使用预训练的 BERT 和 RoBERTa 网络并仅对其进行微调以产生有用的句子嵌入。这显著减少了所需的训练时间SBERT 可以在不到 20 分钟内完成微调同时产生比同类句子嵌入方法更好的结果。3 模型SBERT 在 BERT/RoBERTa 的输出上添加了一个池化操作以推导出固定大小的句子嵌入。我们尝试了三种池化策略使用 CLS-token 的输出计算所有输出向量的平均值MEAN 策略以及计算输出向量的最大池化MAX 策略。默认配置是 MEAN。为了微调 BERT/RoBERTa我们创建了孪生网络和三胞胎网络 (Schroff et al., 2015) 来更新权重使得生成的句子嵌入具有语义意义并且可以用余弦相似度进行比较。网络结构取决于可用的训练数据。我们尝试了以下结构和目标函数。3.1 训练细节我们在 SNLI (Bowman et al., 2015) 和多体裁 NLI (Williams et al., 2018) 数据集的组合上训练 SBERT。SNLI 是一个包含 570,000 个句子对的集合标注了矛盾、蕴含和中立标签。MultiNLI 包含 430,000 个句子对涵盖了各种口语和书面文本体裁。我们使用 3 路 softmax 分类器目标函数对 SBERT 进行一个 epoch 的微调。我们使用的批量大小为 16Adam 优化器的学习率为 2e−5并在训练数据的 10% 上进行线性学习率预热。我们的默认池化策略是 MEAN。4 评估 - 语义文本相似度我们在常见的语义文本相似度 (STS) 任务上评估 SBERT 的性能。最先进的方法通常学习一个复杂的回归函数将句子嵌入映射到相似度分数。然而这些回归函数是成对工作的并且由于组合爆炸当句子集合达到一定规模时它们通常是不可扩展的。相反我们始终使用余弦相似度来比较两个句子嵌入之间的相似性。我们也尝试了使用负曼哈顿距离和负欧几里得距离作为相似性度量但所有方法的结果大致相同。4.1 无监督 STS我们评估了 SBERT 在不使用任何 STS 特定训练数据的情况下的 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 et al., 2016) 中指出 Pearson 相关系数不太适合 STS。相反我们计算句子嵌入的余弦相似度与真实标签之间的 Spearman 秩相关系数。其他句子嵌入方法的设置是相同的相似度通过余弦相似度计算。结果如表 1 所示。结果表明直接使用 BERT 的输出会产生相当差的性能。对 BERT 嵌入进行平均仅达到平均相关度 54.81而使用 CLS-token 输出仅达到平均相关度 29.19。两者都比计算平均 GloVe 嵌入差。使用所描述的孪生网络结构和微调机制显著提高了相关性大幅超越了 InferSent 和 Universal Sentence Encoder。SBERT 表现不如 Universal Sentence Encoder 的唯一数据集是 SICK-R。Universal Sentence Encoder 在各种数据集上进行了训练包括新闻、问答页面和讨论论坛这似乎更适合 SICK-R 的数据。相比之下SBERT 仅在 Wikipedia通过 BERT和 NLI 数据上进行预训练。虽然 RoBERTa 能够提高一些监督任务的性能但我们在 SBERT 和 SRoBERTa 之间生成句子嵌入时只观察到微小的差异。4.2 有监督 STSSTS 基准测试 (STSb) (Cer et al., 2017) 是一个流行的评估有监督 STS 系统的数据集。该数据包括来自标题、新闻和论坛三个类别的 8,628 个句子对。它分为训练集 (5,749)、开发集 (1,500) 和测试集 (1,379)。BERT 通过将两个句子都输入网络并使用简单的回归方法输出在该数据集上取得了新的最佳性能。我们使用训练集利用回归目标函数微调 SBERT。在预测时我们计算句子嵌入之间的余弦相似度。所有系统都使用 10 个随机种子进行训练以应对方差 (Reimers and Gurevych, 2018)。结果如表 2 所示。我们尝试了两种设置仅在 STSb 上训练以及先在 NLI 上训练然后在 STSb 上训练。我们观察到后一种策略带来了 1-2 分的小幅提升。这种两步法对于 BERT 交叉编码器影响尤其大将其性能提高了 3-4 分。我们没有观察到 BERT 和 RoBERTa 之间有显著差异。4.3 论点面相似度我们在 Misra 等人 (2016) 提出的 Argument Facet Similarity (AFS) 语料库上评估了 SBERT。AFS 语料库标注了来自社交媒体对话中关于三个争议性话题枪支管制、同性婚姻和死刑的 6,000 个句子级论证对。数据的标注范围从 0“不同主题”到 5“完全等同”。AFS 语料库中的相似性概念与 SemEval 的 STS 数据集中的相似性概念有很大不同。STS 数据通常是描述性的而 AFS 数据是来自对话的论证性摘录。要被认为是相似的论证不仅必须提出相似的主张还必须提供相似的推理。此外AFS 中句子之间的词汇差距要大得多。因此简单的无监督方法以及最先进的 STS 系统在该数据集上表现不佳 (Reimers et al., 2019)。我们在两种场景下评估了 SBERT 在该数据集上的表现1) 如 Misra 等人所提议我们使用 10 折交叉验证评估 SBERT。这种评估设置的一个缺点是尚不清楚该方法对不同主题的泛化能力如何。因此2) 我们在跨主题设置下评估 SBERT。两个主题用于训练然后在剩余的一个主题上评估该方法。我们对所有三个主题重复此过程并平均结果。SBERT 使用回归目标函数进行微调。相似度分数基于句子嵌入使用余弦相似度计算。我们还提供了 Pearson 相关系数 rr以使结果与 Misra 等人可比。然而我们 (Reimers et al., 2016) 指出 Pearson 相关系数存在一些严重缺陷在比较 STS 系统时应避免使用。结果如表 3 所示。无监督方法如 tf-idf、平均 GloVe 嵌入或 InferSent 在该数据集上表现相当差得分较低。在 10 折交叉验证设置中训练 SBERT 得到的性能几乎与 BERT 持平。然而在跨主题评估中我们观察到 SBERT 的性能下降了约 7 个点的 Spearman 相关系数。要被认为是相似的论证应该涉及相同的主张并提供相同的推理。BERT 能够使用注意力直接比较两个句子例如逐词比较而 SBERT 必须将来自未见主题的单个句子映射到一个向量空间使得具有相似主张和推理的论证彼此靠近。这是一项更具挑战性的任务似乎需要比仅用两个主题进行训练更多的东西才能达到与 BERT 相当的水平。4.4 维基百科章节区分Dor 等人 (2018) 使用维基百科为句子嵌入方法创建了一个主题细粒度的训练集、开发集和测试集。维基百科文章被分成不同的章节侧重于某些方面。Dor 等人假设同一章节中的句子在主题上比不同章节中的句子更接近。他们利用这一点创建了一个大型的弱标签句子三元组数据集锚点和正例来自同一章节而负例来自同一篇文章的不同章节。例如来自 Alice Arnold 文章锚点Arnold 于 1988 年加入 BBC 广播剧公司。正例Arnold 于 2012 年 5 月获得媒体关注。负例Balding 和 Arnold 是狂热的高尔夫爱好者。我们使用了 Dor 等人的数据集。我们使用三胞胎目标函数在大约 180 万个训练三元组上对 SBERT 进行一个 epoch 的训练并在 222,957 个测试三元组上进行评估。测试三元组来自一组不同的维基百科文章。作为评估指标我们使用准确率正例是否比负例更接近锚点结果如表 4 所示。Dor 等人使用三胞胎损失微调了一个 BiLSTM 架构来为该数据集推导句子嵌入。如表所示SBERT 明显优于 Dor 等人的 BiLSTM 方法。5 评估 - SentEvalSentEval (Conneau and Kiela, 2018) 是一个流行的评估句子嵌入质量的工具包。句子嵌入用作逻辑回归分类器的特征。逻辑回归分类器在 10 折交叉验证设置中针对各种任务进行训练并在测试折上计算预测准确率。SBERT 句子嵌入的目的不是用于其他任务的迁移学习。在这里我们认为如 Devlin 等人 (2018) 所述为新任务微调 BERT 是更合适的方法因为它更新了 BERT 网络的所有层。然而SentEval 仍然可以为我们句子嵌入在各种任务上的质量提供一个参考。我们将 SBERT 句子嵌入与其他句子嵌入方法在以下七个 SentEval 迁移任务上进行比较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 中找到。SBERT 在 7 个任务中的 5 个上取得了最佳性能。与 InferSent 和 Universal Sentence Encoder 相比平均性能提高了约 2 个百分点。尽管迁移学习不是 SBERT 的目的但它在这些任务上优于其他最先进的句子嵌入方法。SBERT 的句子嵌入似乎很好地捕捉了情感信息与 InferSent 和 Universal Sentence Encoder 相比我们在 SentEval 的所有情感任务MR、CR 和 SST上都观察到了显著的提升。SBERT 明显逊于 Universal Sentence Encoder 的唯一数据集是 TREC 数据集。Universal Sentence Encoder 在问答数据上进行了预训练这似乎对 TREC 数据集的问题类型分类任务有益。平均 BERT 嵌入或使用 BERT 网络的 CLS-token 输出在各种 STS 任务上取得了较差的结果表 1比平均 GloVe 嵌入还差。然而对于 SentEval平均 BERT 嵌入和 BERT CLS-token 输出取得了不错的结果表 5优于平均 GloVe 嵌入。原因是不同的设置。对于 STS 任务我们使用余弦相似度来估计句子嵌入之间的相似度。余弦相似度平等对待所有维度。相比之下SentEval 将逻辑回归分类器拟合到句子嵌入上。这允许某些维度对分类结果产生更高或更低的影响。我们得出结论平均 BERT 嵌入 / BERT 的 CLS-token 输出返回的句子嵌入不适合与余弦相似度或曼哈顿/欧几里得距离一起使用。对于迁移学习它们产生的结果略差于 InferSent 或 Universal Sentence Encoder。然而使用所描述的带有孪生网络结构的微调设置在 NLI 数据集上训练产生了在 SentEval 工具包上达到新最佳性能的句子嵌入。6 消融研究我们已经证明了 SBERT 句子嵌入质量的强大实证结果。在本节中我们对 SBERT 的不同方面进行消融研究以便更好地理解它们的相对重要性。我们评估了不同的池化策略MEAN、MAX 和 CLS。对于分类目标函数我们评估了不同的连接方法。对于每种可能的配置我们使用 10 个不同的随机种子训练 SBERT 并平均其性能。目标函数分类 vs 回归取决于标注的数据集。对于分类目标函数我们在 SNLI 和多体裁 NLI 数据集上训练 SBERT-base。对于回归目标函数我们在 STS 基准数据集的训练集上进行训练。性能是在 STS 基准数据集的开发集上测量的。结果如表 6 所示。当使用分类目标函数在 NLI 数据上训练时池化策略的影响相当小。连接模式的影响要大得多。InferSent (Conneau et al., 2017) 和 Universal Sentence Encoder (Cer et al., 2018) 都使用 (u,v,∣u−v∣,u∗v) 作为 softmax 分类器的输入。然而在我们的架构中添加逐元素的 u∗vu∗v 降低了性能。最重要的组成部分是逐元素差值 ∣u−v∣。请注意连接模式仅与训练 softmax 分类器相关。在推理时当预测 STS 基准数据集的相似度时只使用句子嵌入 u 和 v 结合余弦相似度。逐元素差值衡量两个句子嵌入维度之间的距离确保相似的句子对更接近不相似的句子对更远离。当使用回归目标函数训练时我们观察到池化策略有很大影响。其中MAX 策略的表现明显差于 MEAN 或 CLS-token 策略。这与 (Conneau et al., 2017) 的研究结果相反后者发现对于 InferSent 的 BiLSTM 层使用 MAX 池化比 MEAN 池化更有益。7 计算效率句子嵌入可能需要为数百万个句子计算因此高计算速度是期望的。在本节中我们将 SBERT 与平均 GloVe 嵌入、InferSent (Conneau et al., 2017) 和 Universal Sentence Encoder (Cer et al., 2018) 进行比较。在我们的比较中我们使用了 STS 基准测试 (Cer et al., 2017) 中的句子。我们使用简单的 for 循环、Python 字典查找和 NumPy 计算平均 GloVe 嵌入。InferSent 基于 PyTorch。对于 Universal Sentence Encoder我们使用的是基于 TensorFlow 的 TensorFlow Hub 版本。SBERT 基于 PyTorch。为了改进句子嵌入的计算我们实现了一种智能批处理策略将长度相似的句子分组在一起并且仅填充到小批量中最长元素的长度。这大大减少了填充 token 带来的计算开销。性能是在配备 Intel i7-5820K CPU 3.30GHz、Nvidia Tesla V100 GPU、CUDA 9.2 和 cuDNN 的服务器上测量的。结果如表 7 所示。在 CPU 上InferSent 比 SBERT 快约 65%。这是由于网络架构简单得多。InferSent 使用单层 BiLSTM而 BERT 使用 12 层堆叠的 Transformer 层。然而Transformer 网络的一个优势是在 GPU 上的计算效率。在 GPU 上使用智能批处理的 SBERT 比 InferSent 快约 9%比 Universal Sentence Encoder 快约 55%。智能批处理在 CPU 上实现了 89% 的加速在 GPU 上实现了 48% 的加速。平均 GloVe 嵌入显然是在计算速度上遥遥领先的最快方法。8 结论我们展示了开箱即用的 BERT 将句子映射到一个向量空间该空间不太适合与余弦相似度等常见相似度度量一起使用。在七个 STS 任务上的性能低于平均 GloVe 嵌入的性能。为了克服这个缺点我们提出了 Sentence-BERT (SBERT)。SBERT 在孪生/三胞胎网络架构中微调 BERT。我们在各种常见基准上评估了其质量在这些基准上它可以取得相对于最先进的句子嵌入方法的显著改进。在我们的实验中用 RoBERTa 替换 BERT 并没有产生显著的改进。SBERT 计算效率高。在 GPU 上它比 InferSent 快约 9%9%比 Universal Sentence Encoder 快约 55%55%。SBERT 可用于在计算上无法用 BERT 建模的任务。例如对 10,000 个句子进行层次聚类使用 BERT 需要大约 65 小时因为必须计算大约 5000 万个句子组合。使用 SBERT我们能够将工作量减少到大约 5 秒。