自然语言推理
给定两个句子(前提和假设),自然语言推理(NLI)的任务是判断前提是否蕴含假设,它们是否矛盾,或者它们是否中立。常用的 NLI 数据集是 SNLI 和 MultiNLI。
要在 NLI 上训练 CrossEncoder,请参阅以下示例文件
-
本示例使用
CrossEntropyLoss
来训练 CrossEncoder 模型,以预测“矛盾”、“蕴含”和“中立”中正确类别的最高逻辑值。
您也可以训练和使用 SentenceTransformer
模型来完成此任务。有关更多详细信息,请参阅 Sentence Transformer > 训练示例 > 自然语言推理。
数据
我们将 SNLI 和 MultiNLI 合并为一个名为 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']