自然语言推理

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

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

  • training_nli.py:

    本示例使用 CrossEntropyLoss 来训练 CrossEncoder 模型,以预测“矛盾”、“蕴含”和“中立”中正确类别的最高逻辑值。

您也可以训练和使用 SentenceTransformer 模型来完成此任务。有关更多详细信息,请参阅 Sentence Transformer > 训练示例 > 自然语言推理

数据

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

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

我们将 AllNLI 格式化为几个不同的子集,以兼容不同的损失函数。例如,请参阅 AllNLI 的 pair-class 子集

CrossEntropyLoss

The CrossEntropyLoss 是一种相当基础的损失函数,它在 1) 将分词后的文本对通过模型和 2) 对逻辑值应用可选激活函数后,将常见的 torch.nn.CrossEntropyLoss 应用于逻辑值(也称为输出、原始预测)。如果 CrossEncoder 模型需要预测多个类别,它会非常常用。

推理

您可以使用任何 预训练的 NLI CrossEncoder 模型 进行推理,如下所示

from sentence_transformers import CrossEncoder

model = CrossEncoder("cross-encoder/nli-deberta-v3-base")
scores = model.predict([
    ("A man is eating pizza", "A man eats something"),
    ("A black race car starts up in front of a crowd of people.", "A man is driving down a lonely road."),
])

# Convert scores to labels
label_mapping = ["contradiction", "entailment", "neutral"]
labels = [label_mapping[score_max] for score_max in scores.argmax(axis=1)]
# => ['entailment', 'contradiction']