理解 siamese BERT 网络如何精确地将句子转换为嵌入
简介
Transformer 在 NLP 畛域获得了进化性的提高,这已不是什么机密。基于 Transformer,还倒退出了许多其余机器学习模型。其中之一是 BERT,它次要由几个重叠的 Transformer 编码器组成。除了用于一系列不同的问题(例如情感剖析或问答)之外,BERT 在构建词嵌入(示意单词语义的数字向量)方面变得越来越风行。
以嵌入的模式示意单词具备微小的劣势,因为机器学习算法无奈解决原始文本,但能够对向量的向量进行操作。这容许应用欧几里得间隔或余弦间隔等规范度量来比拟不同单词的相似性。
问题在于,在实践中,咱们常常须要为整个句子而不是单个单词构建嵌入。然而,根本的 BERT 版本仅在单词级别构建嵌入。因而,起初开发了几种相似 BERT 的办法来解决这个问题,本文将对此进行探讨。通过逐渐探讨它们,咱们将达到称为 SBERT 的最先进模型。
BERT
首先,让咱们回顾一下 BERT 是如何解决信息的。作为输出,它须要一个 [CLS] 标记和由非凡 [SEP] 标记分隔的两个句子。依据模型配置,该信息由多头注意力模块解决 12 或 24 次。而后,输入被聚合并传递到一个简略的回归模型以取得最终标签。
穿插编码器架构
能够应用 BERT 来计算一对文档之间的类似度。思考在一个大汇合中找到最类似的一对句子的指标。为了解决这个问题,每个可能的对都被放入 BERT 模型中。这会导致推理过程中呈现二次复杂度。例如,解决 n = 10 000 个句子须要 n * (n — 1) / 2 = 49 995 000 次推理 BERT 计算,这并不是真正可扩大的。
其余办法
剖析穿插编码器架构的低效率,为每个句子独立地事后计算嵌入仿佛是合乎逻辑的。之后,咱们能够间接计算所有文档对上选定的间隔度量,这比将平方数的句子对输出 BERT 要快得多。
可怜的是,这种办法对于 BERT 来说是不可能的:BERT 的外围问题是,每次同时传递和解决两个句子时,很难取得仅独立示意单个句子的嵌入。
钻研人员试图通过应用 [CLS] 令牌嵌入的输入来打消这个问题,心愿它蕴含足够的信息来示意一个句子。然而,事实证明 [CLS] 对于这项工作基本没有用,因为它最后是在 BERT 中针对下一句预测进行预训练的。
另一种办法是将单个句子传递给 BERT,而后对输入标记嵌入进行均匀。然而,取得的后果甚至比简略均匀 GLoVe 嵌入还要蹩脚。
推导独立句子嵌入是 BERT 的次要问题之一。为了缓解这个问题,开发了 SBERT。
SBERT
SBERT 引入了 Siamese 网络概念,这意味着每次两个句子都通过雷同的 BERT 模型独立传递。在探讨 SBERT 架构之前,让咱们先参考一下 Siamese 网络的一个奥妙正文:
- 大多数时候,在科学论文中,暹罗网络架构都是用多个接管如此多输出的模型来形容的。实际上,它能够被认为是具备雷同配置和在多个并行输出之间共享权重的单个模型。每当更新单个输出的模型权重时,它们也会同样更新其余输出。
回到 SBERT,在将一个句子传递给 BERT 后,池化层被利用于 BERT 嵌入以取得其较低维度的示意:初始 512 768 维向量被转换为单个 768 维向量。对于池化层,SBERT 作者倡议抉择均匀池化层作为默认层,只管他们也提到能够应用最大池化策略或简略地采纳 [CLS] 令牌的输入。
当两个句子都通过池化层时,咱们有两个 768 维向量 u 和 v。通过应用这两个向量,作者提出了三种优化不同指标的办法,这将在上面探讨。
分类指标函数
该问题的指标是将给定的一对句子正确分类为几个类别之一。
生成嵌入 u 和 v 后,钻研人员发现从这两个向量派生出另一个向量作为元素相对差 |u-v| 很有用。他们还尝试了其余特色工程技术,但这一技术显示了最好的后果。
最初,三个向量 u、v 和 |u-v| 连接起来,乘以可训练的权重矩阵 W,并将乘法后果输出到 softmax 分类器中,该分类器输入对应于不同类别的句子的归一化概率。穿插熵损失函数用于更新模型的权重。
用于解决此指标的最风行的现有问题之一是 NLI(自然语言推理),其中对于定义假如和前提的给定句子 A 和 B,有必要预测假如是否为真(蕴涵),在给定的前提下,谬误(矛盾)或不确定(中立)。对于这个问题,推理过程与训练雷同。
正如论文中所述,SBERT 模型最后是在两个数据集 SNLI 和 MultiNLI 上进行训练的,这两个数据集蕴含一百万个句子对,并带有相应的标签蕴含、矛盾或中性。之后,论文钻研人员提到了无关 SBERT 调优参数的详细信息:
“咱们应用 3 路 softmax 分类器指标函数对一个 epoch 的 SBERT 进行微调。咱们应用了 16 的批量大小、学习率为 2e−5 的 Adam 优化器以及超过 10% 的训练数据的线性学习率预热。”
回归指标函数
在这个公式中,在取得向量 u 和 v 后,它们之间的类似度得分间接通过选定的类似度度量来计算。将预测的类似度得分与实在值进行比拟,并应用 MSE 损失函数更新模型。默认状况下,作者抉择余弦类似度作为类似度度量。
在推理过程中,能够通过以下两种形式之一应用该架构:
- 通过给定的句子对,能够计算类似度得分。推理工作流程与训练完全相同。
- 对于给定的句子,能够提取其句子嵌入(在利用池化层之后)以供当前应用。当咱们失去大量句子的汇合并旨在计算它们之间的成对类似度分数时,这特地有用。通过将每个句子仅运行一次 BERT,咱们提取了所有必要的句子嵌入。之后,咱们能够间接计算所有向量之间所选的类似度度量(毫无疑问,它依然须要二次比拟次数,但同时咱们防止了像以前那样应用 BERT 进行二次推理计算)。
三重态指标函数
三元组指标引入了三元组损失,该损失是依据通常称为锚、正和负的三个句子计算的。假如锚定句和肯定句十分靠近,而锚定句和否定句则十分不同。在训练过程中,模型会评估该对(锚,正)与该对(锚,负)相比的靠近水平。从数学上讲,以下损失函数被最小化:
距离 ε 确保正句子与锚点的间隔至多比负句子与锚点的间隔近 ε。否则,损失将大于 0。默认状况下,在这个公式中,作者抉择欧氏间隔作为向量范数,参数 ε 设置为 1。
三元组 SBERT 架构与前两种架构的不同之处在于,该模型当初并行承受三个输出句子(而不是两个)。
Code
SentenceTransformers 是一个用于构建句子嵌入的最先进的 Python 库。它蕴含多个针对不同工作的预训练模型。应用 SentenceTransformers 构建嵌入很简略,上面的代码片段中显示了一个示例。
而后构建的嵌入可用于相似性比拟。每个模型都是针对特定工作进行训练的,因而参考文档抉择适合的相似性度量进行比拟始终很重要。
总结
咱们曾经理解了一种用于获取句子嵌入的高级 NLP 模型。通过将 BERT 推理执行的二次次数缩小为线性,SBERT 在放弃高精度的同时实现了速度的大幅增长。
为了最终了解这种差别有如许显着,参考论文中形容的例子就足够了,在这个例子中,钻研人员试图在 n = 10000 个句子中找到最类似的一对。在古代 V100 GPU 上,此过程应用 BERT 大概须要 65 小时,而应用 SBERT 只需 5 秒!这个例子表明 SBERT 是 NLP 的巨大进步。
本文由 mdnice 多平台公布