自然语言推理

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

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

要训练 NLI,请参阅以下示例文件

  1. training_nli.py:

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

  2. training_nli_v2.py:

    我们原始 SBERT 论文中使用的 SoftmaxLoss 并未产生最佳性能。一个更好的损失是 MultipleNegativesRankingLoss,我们提供成对或三元组。在此脚本中,我们提供了一个三元组格式:(锚点,蕴涵句,矛盾句)。NLI 数据提供了这样的三元组。MultipleNegativesRankingLoss 产生更高的性能,并且比 SoftmaxLoss 更直观。我们已使用此损失来训练我们的 使用知识蒸馏使单语句子嵌入多语言化 论文中的复述模型。

  3. training_nli_v3.py

    遵循 GISTEmbed 论文,我们可以使用引导模型修改 MultipleNegativesRankingLoss 中的批内负样本选择。具体来说,如果引导模型认为 (a1, bn) 对的相似度大于 (a1, b1),则 (a1, bn) 对被视为假负样本,因此在训练过程中被忽略。本质上,这会为模型生成更高质量的训练数据,代价是运行引导模型的推理会带来一些训练开销。

您也可以训练并使用 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 也是如此。

在 NLI 中使用 MultipleNegativesRankingLoss 相当容易:我们将带有“蕴涵”标签的句子定义为正样本对。例如,我们有像(“多个男性正在踢的足球比赛。”,“一些男性正在进行一项运动。”)这样的句子对,并希望这些句子对在向量空间中距离接近。AllNLI 的“pair”子集 已按此格式准备。

带有难负样本的 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) 对被视为假负样本,并因此在训练过程中被忽略。本质上,这会为模型带来更高质量的训练数据。