自然语言推断

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

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

  • training_nli.py:

    此示例使用 CrossEntropyLoss 训练 CrossEncoder 模型,以从“矛盾”、“蕴含”和“中立”中预测正确类别的最高对数。

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

数据

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

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

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

CrossEntropyLoss

CrossEntropyLoss 是一种相当基本的损失,它在通过模型传递分词文本对并对对数应用可选激活函数后产生的对数(又名输出,原始预测)上应用常见的 torch.nn.CrossEntropyLoss。如果 CrossEncoder 模型必须预测不止 1 个类别,它通常会用到。

推理

您可以使用任何 预训练的 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']