使用 HANS 数据集对 NLI 模型进行对抗性评估:基于 Transformers run_hans.py 实战指南
推理引擎大模型【免费下载链接】FlexGenRunning large language models on a single GPU for throughput-oriented scenarios.项目地址https://gitcode.com/gh_mirrors/fl/FlexGen点击查看免费下载导读本文介绍如何基于 Hugging Face Transformers 生态使用 HANSHeuristic Analysis for NLI Systems数据集对自然语言推理NLI模型进行对抗性评估。HANS 专门用于检测模型是否在依赖词汇重叠、子序列、句法成分等表层启发式线索而非真正理解蕴含关系。读完本文你将掌握完整的评估流水线从获取 HANS 数据集、用 GLUE 脚本训练 NLI 模型到运行run_hans.py生成预测文件、再通过 HANS 官方评分脚本按三类启发式分别统计 entailed / non-entailed 准确率并能读懂示例结果揭示的模型脆弱性。本指南以仓库中的 README.md 为骨架结合 run_hans.py 与 utils_hans.py 源码展开。HANS为什么需要对抗性评估常规 GLUE 评测如 MNLI 的 dev 集准确率衡量的是模型在标准分布上的表现。然而已有研究McCoy et al., 2019见 arXiv:1902.01007指出很多 NLI 模型作弊它们并非真正理解句子的蕴含关系而是利用训练数据中的统计捷径。HANS 数据集正是为暴露这一缺陷而设计它构造了三种启发式陷阱词汇重叠lexical overlap前提与假设共享大量词汇模型易误判为蕴含子序列subsequence假设恰好是前提的连续子串模型易直接判蕴含句法成分constituent假设与前提的某个句法成分相同模型易被误导。HANS 对每种启发式同时提供entailed真蕴含与non-entailed假蕴含两类样例。若模型依赖启发式而非语义其 non-entailed 准确率会远低于 entailed 准确率——这正是对抗性评估的核心诊断信号。本指南对应的示例由 Nafise Sadat Moosavi 提供被收录于仓库的 research_projects 目录。环境准备与依赖运行评估脚本前需要安装 Transformers 及相关依赖。仓库中 requirements.txt 明确锁定transformers 3.5.1。由于run_hans.py基于较老的 Trainer API使用HfArgumentParser、TrainingArguments建议在兼容该版本的 Python 3.6 环境中执行pip install transformers3.5.1此外脚本运行依赖torch、numpy、tqdm、filelock用于缓存文件的跨进程锁请一并安装pip install torch numpy tqdm filelock获取 HANS 数据集HANS 数据集由 Tom McCoy 提供可从其官方仓库下载。下载解压后目录中应包含以下两个核心文件heuristics_train_set.txt训练集带标签run_hans.py支持do_train时使用heuristics_evaluation_set.txt评估集即对抗性评测所用数据。从源码 utils_hans.py 可以看到HansProcessor正是读取这两个文件构造样例def get_train_examples(self, data_dir): return self._create_examples(self._read_tsv(os.path.join(data_dir, heuristics_train_set.txt)), train) def get_dev_examples(self, data_dir): return self._create_examples(self._read_tsv(os.path.join(data_dir, heuristics_evaluation_set.txt)), dev)因此命令行中的--data_dir $HANS_DIR必须指向包含上述两个.txt文件的目录。获取经过 NLI 训练的模型HANS 评估针对的是已经过 NLI 任务训练的模型。README 建议使用run_glue.py在 MNLI 上训练模型例如 BERT-base训练产物即模型目录路径$MODEL_PATH。仓库中的 legacy/pytorch-lightning/run_glue.py 即为此类训练脚本的示例使用glue_processors、glue_tasks_num_labels等 API 完成 GLUE 任务处理。模型目录需包含pytorch_model.bin或 TF 权重、config.json与词表文件run_hans.py通过AutoConfig/AutoTokenizer/AutoModelForSequenceClassification加载。需要注意run_hans.py的版本差异--model_name_or_path若指向含.ckpt的路径源码会以from_tfTrue加载 TF 权重见 run_hans.py。运行对抗性评估run_hans.py 完整指南命令行参数README 给出的核心命令如下export HANS_DIRpath-to-hans export MODEL_TYPEtype-of-the-model-e.g.-bert-roberta-xlnet-etc export MODEL_PATHpath-to-the-model-directory-that-is-trained-on-NLI-e.g.-by-using-run_glue.py python run_hans.py \ --task_name hans \ --model_type $MODEL_TYPE \ --do_eval \ --data_dir $HANS_DIR \ --model_name_or_path $MODEL_PATH \ --max_seq_length 128 \ --output_dir $MODEL_PATH参数说明如下参数取值示例含义--task_namehans任务名必须为hans源码hans_tasks_num_labels {hans: 3}仅注册了该任务--model_typebert/roberta/xlnet等模型类型决定 tokenizer 行为--do_eval无值触发评估模式生成预测文件--data_dirHANS 数据集目录需包含heuristics_evaluation_set.txt等文件--model_name_or_path模型目录或 HF 模型 ID被评估的 NLI 模型--max_seq_length128序列最大长度超长截断、不足补齐--output_dir模型目录预测结果输出位置三类参数对象与可选参数run_hans.py通过HfArgumentParser同时解析三组参数见 run_hans.pyModelArguments--config_name、--tokenizer_name、--cache_dir用于指定与模型不同的配置/分词器或下载缓存位置DataTrainingArguments--task_name、--data_dir、--max_seq_length默认 128、--overwrite_cacheTrainingArgumentsTransformers 内置--do_train、--do_eval、--per_device_eval_batch_size、--seed、--local_rank分布式、--fp16、--overwrite_output_dir等。README 示例仅用默认 batch size 与 seed若要复现示例结果注意保持 seed 一致。由于--output_dir同时是模型目录且评估模式不触发目录非空校验该校验仅在do_train时生效见 run_hans.py直接复用模型目录输出是安全的。数据加载与特征化细节评估数据由HansDataset加载utils_hans.py关键逻辑缓存特征会被缓存为cached_dev_Tokenizer类名_max_seq_length_hans文件使用FileLock保证分布式下仅单进程构建、其余进程复用缓存可用--overwrite_cache强制重建RoBERTa 标签修正对 RoBERTa / XLM-R / BART 系列源码会交换 label 1 与 label 2# HACK(label indices are swapped in RoBERTa pretrained model)见 utils_hans.py标签体系HansProcessor.get_labels()返回[contradiction, entailment, neutral]其中 HANS 评估将contradiction与neutral归并为 non-entailmentlabel 0entailment为 label 1见 utils_hans.pypairID 保留TSV 中第 8 列是样例编号前缀ex会被剥离并转为整数作为预测结果与黄金标签对齐的键见 utils_hans.py。预测输出与结果文件评估完成后trainer.predict(eval_dataset)得到 logits经np.argmax(..., axis1)取预测类别随后写入$MODEL_PATH/hans_predictions.txt见 run_hans.py格式为pairID,gold_label ex1,entailment ex2,contradiction ...随后使用 HANS 数据集官方提供的评分脚本hans/evaluate_heur_output.py需从 HANS 仓库获取对该文件进行评估即python hans/evaluate_heur_output.py --output_dir $MODEL_PATH或按该脚本的接口传入hans_predictions.txt路径与评估集路径。示例结果解读BERT-base 的脆弱性README 给出了一个参考结果使用 batch size 8、随机种子 42 在 MNLI 上训练的 BERT-base 模型在 HANS 上的表现如下Heuristic entailed results: lexical_overlap: 0.9702 subsequence: 0.9942 constituent: 0.9962 Heuristic non-entailed results: lexical_overlap: 0.199 subsequence: 0.0396 constituent: 0.118这是对抗性评估最有说服力的证据entailed 准确率极高0.970.99模型面对真蕴含样例时几乎全对说明它非常擅长找证据non-entailed 准确率极低0.040.20当样例满足启发式特征但语义上并不蕴含时模型几乎全部误判为蕴含。两者之间巨大的落差说明该模型在 MNLI 上虽表现良好却严重依赖表层启发式线索而非真正的语义推理是典型的表面线索投机者。若你的模型在 HANS 上 non-entailed 准确率明显更高说明其推理能力更稳健。需要强调的是该结果是特定配置batch size 8、seed 42下的参考值并非所有 BERT-base 模型的普适结论不同训练配置会得到不同数字。进阶扩展结合评估脚本进行分布外诊断run_hans.py还支持训练模式--do_train可在 HANS 训练集上继续微调并保存模型与 tokenizerrun_hans.py。常见进阶用法包括多模型对比对 BERT、RoBERTa、XLNet 等不同架构分别运行run_hans.py --do_eval对比各类启发式的 non-entailed 准确率定位最稳健的架构训练干预实验在 NLI 训练中引入对抗样本、数据增强或去偏正则再回到 HANS 验证改进效果参数敏感性调整--max_seq_length默认 128HANS 样例普遍较短128 足够、--per_device_eval_batch_size、--seed观察结果稳定性与 GLUE 指标对照将 MNLI dev 准确率与 HANS 得分对照展示标准评测高分 ≠ 鲁棒推理的差异。小结本文完整梳理了基于 HANS 的 NLI 对抗性评估流程获取数据集 → 用run_glue.py训练 NLI 模型 → 运行run_hans.py --do_eval生成hans_predictions.txt→ 用 HANS 官方evaluate_heur_output.py按三类启发式统计 entailed / non-entailed 准确率。源码层面的关键实现标签修正、pairID 对齐、缓存与多进程锁、RoBERTa 标签交换均在 run_hans.py 与 utils_hans.py 中得到印证。对抗性评估是检验 NLI 模型真实推理能力、避免高分低能的重要工具建议将其纳入模型发布的常规评测流程。赞分享推理引擎大模型【免费下载链接】FlexGenRunning large language models on a single GPU for throughput-oriented scenarios.项目地址https://gitcode.com/gh_mirrors/fl/FlexGen点击查看免费下载相关推荐ParlAI Bot Adversarial Dialogue 任务实战基于冒犯性标注的对抗性对话安全数据集与评估体系ParlAI Bot Adversarial Dialogue 任务实战基于冒犯性标注的对抗性对话安全数据集与评估体系 导读 Bot AdversarialNLP人工智能深度学习如何在Elm项目中快速集成elm-charts5分钟上手教程如何在Elm项目中快速集成elm charts5分钟上手教程 想要在Elm应用中快速创建漂亮的SVG图表吗elm charts是你的完美选择这个强大的El人工智能NLPEmbedding微调机器学习《开源大模型食用指南》实战基于 transformers 与 peft 对 Phi-4 进行 LoRA 微调《开源大模型食用指南》实战基于 transformers 与 peft 对 Phi 4 进行 LoRA 微调 Phi 4 是微软开源的 14B 参数级大语言模教程大模型本地部署微调上一篇skrollr实现视差滚动的无障碍支持ARIA属性应用下一篇Android视频缓存终极指南深入解析缓存文件格式与数据结构创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考