自然语言推断

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

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

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

  1. training_nli.py:

    此示例使用原始 [Sentence Transformers 论文](https://hugging-face.cn/papers/1908.10084)中描述的SoftmaxLoss

  2. training_nli_v2.py:

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

  3. training_nli_v3.py

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

您还可以训练和使用CrossEncoder模型来完成此任务。有关更多详细信息,请参阅交叉编码器 > 训练示例 > 自然语言推理

数据

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

句子 A (前提) 句子 B (假设) 标签
一场有多个男性参与的足球比赛。 一些男人在进行一项运动。 蕴含
一个年长和一个年轻的男人在微笑。 两个男人在笑着看地板上玩的猫。 中立
一个男人在某个东亚国家检查一个人物的制服。 那个男人在睡觉。 矛盾

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

SoftmaxLoss

Conneau 等人描述了如何在暹罗网络之上使用 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 的 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) 对被视为假负样本,因此在训练过程中被忽略。本质上,这会为模型带来更高质量的训练数据。