一、什么是 WNLI?

WNLI 是 GLUE 基准中的一项任务,代表 Winograd Natural Language Inference,是一个极具挑战性的 文本蕴涵识别任务,来源于著名的 Winograd Schema Challenge

任务目标:判断“假设”句子是否可以从“前提”句子中逻辑推导而来。

它属于一种特殊的 NLI(自然语言推理)任务,但与其他任务相比,它更注重代词消解和常识推理

二、任务特点

特性 内容
任务类型 文本蕴涵(entailment / not_entailment)
数据来源 Winograd Schema Challenge 改写而来
挑战点 强常识推理,模糊代词解析
标签类别 entailment(蕴涵) / not_entailment(不蕴涵)

示例:

premise(前提) hypothesis(假设) label
The city councilmen refused the demonstrators a permit because they feared violence. The city councilmen feared violence. entailment
The city councilmen refused the demonstrators a permit because they advocated violence. The city councilmen advocated violence. not_entailment

上述例子中的“they”必须正确地指代不同对象,才能判断句子逻辑关系。

三、数据规模与构造

由于任务极为复杂,WNLI 的数据量非常少

数据集划分 样本数量
训练集 635
验证集 71
测试集 146

该数据集由 Winograd Schema 改写成 NLI 形式而来,但其中存在一些问题:

  • 样本非常稀缺

  • 部分样本标注错误(已知问题)

  • 测试集是验证集的子集(导致泄露风险)

四、GLUE 官方警告

GLUE 官方建议:

不要对 WNLI 的结果进行优化或调优

原因包括:

  1. 测试集与验证集重复,容易过拟合

  2. 标注质量较低,部分蕴涵关系模糊甚至错误

  3. 不是所有模型都能正确处理代词指代问题

因此,WNLI 更适合作为一个“对常识与代词处理能力”的测试集,而不是用于实际的模型训练。

五、加载 WNLI 数据(Hugging Face)

1. 安装数据集工具

pip install datasets

2. 加载 WNLI 数据集

from datasets import load_dataset

dataset = load_dataset("glue", "wnli")
print(dataset["train"][0])

示例输出:

{
  "premise": "The trophy doesn't fit into the brown suitcase because it's too large.",
  "hypothesis": "The trophy is too large.",
  "label": 1  # entailment
}

标签说明:

label_map = {0: "not_entailment", 1: "entailment"}

六、训练模型建议

虽然 WNLI 数据集极小,我们可以尝试对强大的预训练模型进行微调:

from transformers import BertTokenizer, BertForSequenceClassification

tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
model = BertForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=2)

数据预处理:

def preprocess(example):
    return tokenizer(example["premise"], example["hypothesis"],
                     truncation=True, padding="max_length")

encoded_dataset = dataset.map(preprocess, batched=True)

训练代码(可参考 GLUE 训练流程):

from transformers import Trainer, TrainingArguments

training_args = TrainingArguments(
    output_dir="./wnli_model",
    evaluation_strategy="epoch",
    per_device_train_batch_size=8,
    num_train_epochs=10,
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=encoded_dataset["train"],
    eval_dataset=encoded_dataset["validation"]
)

trainer.train()

七、推荐模型

模型名称 特点
bert-base-uncased 通用模型,可用于初步尝试
roberta-large 更强的语言表示能力,更擅长代词与常识任务
deberta-v3-large 精度高,在多项推理任务上表现优异

八、总结

项目 内容
任务类型 文本蕴涵识别(代词与常识推理)
数据规模 极小(<700 个训练样本)
模型要求 强语义建模 + 常识推理能力
风险提示 标注噪声 + 数据泄露 + 不可优化
应用建议 用作语言理解能力的测试集,而非主力训练数据

九、使用建议与注意事项

  1. 不要用 WNLI 作评估标准,它不稳定且不可调优

  2. 可用于分析模型“代词解析与推理”的能力

  3. 在报告中注明不对其结果进行过调参

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐