自然语言推断

给定两个句子(前提和假设),自然语言推断 (NLI) 的任务是决定前提是否蕴含假设,它们是否矛盾,或者它们是否是中性的。常用的 NLI 数据集是 SNLIMultiNLI

Conneau 等人 表明,NLI 数据在训练句子嵌入方法时非常有用。我们在我们的 Sentence-BERT-Paper 中也发现了这一点,并且经常使用 NLI 作为句子嵌入方法的第一个微调步骤。

要在 NLI 上进行训练,请参阅以下示例文件

  1. training_nli.py:

    此示例使用 SoftmaxLoss,如原始 [Sentence Transformers 论文](https://arxiv.org/abs/1908.10084) 中所述。

  2. training_nli_v2.py:

    我们原始 SBERT 论文中使用的 SoftmaxLoss 并不能产生最佳性能。更好的损失函数是 MultipleNegativesRankingLoss,我们在这里提供成对或三元组。在此脚本中,我们提供格式为 (anchor, entailment_sentence, contradiction_sentence) 的三元组。NLI 数据提供了这样的三元组。MultipleNegativesRankingLoss 产生的性能更高,并且比 SoftmaxLoss 更直观。我们在 Making Monolingual Sentence Embeddings Multilingual using Knowledge Distillation 论文中使用了此损失函数来训练释义模型。

  3. training_nli_v3.py

    根据 GISTEmbed 论文,我们可以使用引导模型修改 MultipleNegativesRankingLoss 的批内负样本选择。如果引导模型认为候选负样本对过于相似,则在训练期间会忽略这些负样本对。实际上,与 MultipleNegativesRankingLoss 相比,GISTEmbedLoss 往往会产生更强的训练信号,但代价是在引导模型上运行推理会产生一些训练开销。

您还可以训练和使用 CrossEncoder 模型来执行此任务。有关更多详细信息,请参阅 Cross Encoder > 训练示例 > 自然语言推断

数据

我们将 SNLIMultiNLI 合并到一个我们称之为 AllNLI 的数据集中。这两个数据集包含句子对和以下三个标签之一:蕴含、中性、矛盾

句子 A(前提) 句子 B(假设) 标签
一场有多个男性参与的足球比赛。 一些男人在进行一项运动。 蕴含
一个年纪较大和一个年纪较小的男人在微笑。 两个男人在微笑,并嘲笑在地板上玩耍的猫。 中性
一名男子在检查某个东亚国家人物的制服。 该男子正在睡觉。 矛盾

我们以几种不同的子集格式化 AllNLI,这些子集与不同的损失函数兼容。例如,请参阅 AllNLI 的三元组子集

SoftmaxLoss

Conneau 等人 描述了如何使用 Siamese 网络 之上的 softmax 分类器来学习有意义的句子表示。我们可以通过使用 SoftmaxLoss 来实现这一点

SBERT SoftmaxLoss

我们将两个句子通过我们的 SentenceTransformer 模型,并获得句子嵌入 uv。然后我们连接 uv|u-v| 以形成一个长向量。然后,此向量被传递给 softmax 分类器,该分类器预测我们的三个类别(蕴含、中性、矛盾)。

此设置学习句子嵌入,这些嵌入稍后可用于各种任务。

MultipleNegativesRankingLoss

使用 NLI 数据的 SoftmaxLoss 产生(相对)良好的句子嵌入在某种程度上是巧合。MultipleNegativesRankingLoss 更加直观,并且产生明显更好的句子表示。

MultipleNegativesRankingLoss 的训练数据由句子对 [(a1, b1), …, (an, bn)] 组成,我们假设 (ai, bi) 是相似的句子,而 (ai, bj) 是不相似的句子,其中 i != j。它最小化 (ai, bi) 之间的距离,同时最大化所有 i != j 的距离 (ai, bj)。例如,在下图中

SBERT MultipleNegativeRankingLoss

(a1, b1) 之间的距离减小,而 (a1, b2…5) 之间的距离将增大。对于 a2, …, a5 也执行相同的操作。

MultipleNegativesRankingLoss 与 NLI 一起使用非常容易:我们将具有蕴含标签的句子定义为正对。例如,我们有诸如(“一场有多个男性参与的足球比赛。”“一些男人在进行一项运动。”)之类的对,并且希望这些对在向量空间中彼此接近。AllNLI 的对子集 已以此格式准备。

带有困难负样本的 MultipleNegativesRankingLoss

我们可以通过提供三元组而不是对来进一步改进 MultipleNegativesRankingLoss:[(a1, b1, c1), …, (an, bn, cn)]。ci 的样本是所谓的困难负样本:在词汇层面上,它们类似于 ai 和 bi,但在语义层面上,它们意味着不同的事物,并且不应在向量空间中接近 ai

对于 NLI 数据,我们可以使用矛盾标签来创建带有困难负样本的三元组。因此,我们的三元组如下所示:(“一场有多个男性参与的足球比赛。”“一些男人在进行一项运动。”“一群男人在进行一场棒球比赛。”)。我们希望句子“一场有多个男性参与的足球比赛。”“一些男人在进行一项运动。”在向量空间中彼此接近,而“一场有多个男性参与的足球比赛。”和“一群男人在进行一场棒球比赛。”之间应该有更大的距离。AllNLI 的三元组子集 已以此格式准备。

GISTEmbedLoss

通过认识到 此示例 中所示的批内负采样存在一些缺陷,可以进一步扩展 MultipleNegativesRankingLoss。特别是,我们自动假设 (a1, b2), …, (a1, bn) 是负样本,但这不一定是真的。

为了解决这个问题,GISTEmbedLoss 使用 Sentence Transformer 模型来指导批内负样本选择。特别是,如果引导模型认为 (a1, bn) 的相似度大于 (a1, b1),则 (a1, bn) 对将被视为假负样本,因此在训练过程中被忽略。从本质上讲,这为模型带来了更高质量的训练数据。