ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

PaddleNLP 中文阅读理解鲁棒性实战:DuReader-robust 数据集微调全流程

PaddleNLP 中文阅读理解鲁棒性实战:DuReader-robust 数据集微调全流程 人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载本文基于 PaddleNLP 官方示例 DuReader-robust 展开介绍如何在该仓库中完成中文抽取式阅读理解模型鲁棒性评测的完整实践从数据集的任务定义与样本结构讲起到使用 ERNIE-Gram 等预训练模型进行微调、训练、评估并生成可提交预测结果的全流程操作同时结合仓库源码剖析长篇章切片、答案位置标注、SQuAD 风格后处理与中文 F1 评分的底层实现帮助读者既会“跑起来”也理解每一步“为什么这样做”。任务背景为什么要评测阅读理解的鲁棒性阅读理解模型的鲁棒性是衡量该技术能否在实际应用中大规模落地的重要指标之一。虽然模型在一些阅读理解测试集上已能取得较好性能但在真实应用中模型的鲁棒性往往难以令人满意。DuReader-robust 是首个关注中文阅读理解模型鲁棒性的数据集旨在考察模型在真实应用场景中的三类典型问题过敏感性over-sensitivity模型对输入中的无关信息如同义改写、干扰内容过度反应导致答案漂移过稳定性over-stability模型对输入变化“无动于衷”即使篇章中的关键事实被篡改仍给出原答案泛化能力generalization模型对未见过的表述方式、篇章结构的适应能力。任务定义与样本结构DuReader-robust 是单篇章、抽取式阅读理解数据集任务定义为对于给定的问题 q 和篇章 p系统需要根据篇章内容给出该问题的答案 a。数据集中的每个样本是一个三元组q, p, a。官方文档给出的示例问题 q乔丹打了多少个赛季篇章 p迈克尔.乔丹在 NBA 打了15个赛季。他在84年进入 nba期间在1993年10月6日第一次退役改打棒球95年3月18日重新回归在99年1月13日第二次退役后于2001年10月31日复出在03年最终退役…参考答案 a[15个, 15个赛季]从仓库源码可以印证该结构。HuggingFace 数据集适配器 dureader_robust.py 定义了 train/validation/test 三个 split并给出数据下载地址而内置加载器 DuReaderRobust 的_read方法会将原始 JSON 展平为样本字段包括id、title、context、question、answers、answer_starts其中answers为答案文本列表、answer_starts为对应的字符偏移这正是抽取式问答标注答案位置所需的格式。该加载器还内置了 MD5 校验如 dureader_robust.py 中SPLITS定义的各 split 哈希保证数据完整性。快速开始数据准备与 Fine-tune数据准备为了方便开发者测试官方已将数据集上传至 HuggingFacePaddlePaddle/dureader_robust训练脚本通过load_dataset直接拉取无需手动下载解压。启动 Fine-tuning进入示例目录slm/examples/machine_reading_comprehension/DuReader-robust/按如下方式启动微调unset CUDA_VISIBLE_DEVICES python -m paddle.distributed.launch --gpus 0 run_du.py \ --model_type ernie_gram \ --model_name_or_path ernie-gram-zh \ --max_seq_length 384 \ --batch_size 12 \ --learning_rate 3e-5 \ --num_train_epochs 1 \ --logging_steps 10 \ --save_steps 1000 \ --warmup_proportion 0.1 \ --weight_decay 0.01 \ --output_dir ./tmp/dureader-robust/ \ --do_train \ --do_predict \ --device gpu核心参数说明官方文档对关键参数的说明如下model_type预训练模型的种类如 bert、ernie、roberta 等model_name_or_path预训练模型的具体名称如bert-base-chinese、roberta-wwm-ext等也可以是模型文件的本地路径output_dir保存模型 checkpoint 的路径do_train是否进行训练do_predict是否进行预测。结合 args.py 中的完整参数定义还有一批带默认值的可调项实际跑批时可按需覆盖参数默认值说明max_seq_length128分词后序列的最大总长度超长截断、不足补 padbatch_size8每张 GPU/CPU 的训练批大小learning_rate5e-5AdamW 的初始学习率weight_decay0.0权重衰减系数adam_epsilon1e-8Adam 优化器的 epsilonnum_train_epochs3训练总轮数max_steps-1若 0 则指定总训练步数并覆盖num_train_epochswarmup_proportion0.0线性学习率 warmup 占训练总步数的比例logging_steps500每隔多少步打印一次日志save_steps500每隔多少步保存一次 checkpointseed42随机种子devicegpu训练设备可选 cpu / gpu / npudoc_stride128长篇章切分窗口之间的步长重叠量n_best_size20后处理阶段保留的 n-best 候选数max_query_length64问题最大长度max_answer_length30预测答案最大长度token 数do_lower_caseFalse是否对输入小写化大小写敏感模型应设 FalseverboseFalse是否输出详细日志do_train/do_predictFalse是否训练 / 是否预测其中model_type在 run_du.py 中会被映射到模型与分词器组合目前内置支持四种MODEL_CLASSES { bert: (BertForQuestionAnswering, BertTokenizer), ernie: (ErnieForQuestionAnswering, ErnieTokenizer), ernie_gram: (ErnieGramForQuestionAnswering, ErnieGramTokenizer), roberta: (RobertaForQuestionAnswering, RobertaTokenizer), }即--model_type支持bert、ernie、ernie_gram、roberta四值大小写不敏感脚本内部会先转小写再查表。训练结束后的评估输出训练结束后脚本会自动对验证集进行评估输出类似如下的 JSON来自官方文档示例{ exact: 72.90049400141143, f1: 86.95957173352133, total: 1417, HasAns_exact: 72.90049400141143, HasAns_f1: 86.95957173352133, HasAns_total: 1417 }字段含义可由评测源码 squad.py 的make_eval_dict/merge_eval得到印证exact与f1为全量样本的 Exact Match 与 F1 得分百分制total为样本总数HasAns_*为“有答案”子集的对应指标。示例输出中只出现HasAns而没有NoAns说明该验证集中所有样本均有答案squad_evaluate仅当存在无答案样本时才输出NoAns及best_exact/best_f1阈值项。评估结束后模型还会自动对测试集进行预测并把可提交的结果生成在当前工作目录的prediction.json中。NOTE如需恢复模型训练model_name_or_path只需指定到文件夹名即可。如--model_name_or_path./tmp/dureader-robust/model_19000/程序会自动加载模型参数model_state.pdparams也会自动加载词表、模型 config 和 tokenizer 的 config。这一行为由 run_du.py 中的model_class.from_pretrained(args.model_name_or_path)实现——checkpoint 目录由save_pretrained生成其中已包含权重、config 与分词器文件因此可以直接作为加载路径。源码纵深解析训练流程是如何实现的数据流load_dataset → 特征加工 → DataLoaderrun_du.py 的run函数按以下顺序组织训练设备与多卡初始化paddle.set_device(args.device)设置设备若paddle.distributed.get_world_size() 1则初始化并行环境并用paddle.DataParallel包装模型。这也解释了启动命令为何使用python -m paddle.distributed.launch——即使单卡也可统一走分布式启动入口。随机种子set_seed(args)同时设置random、numpy、paddle三个源的随机种子保证可复现。加载数据集load_dataset(PaddlePaddle/dureader_robust, splittrain)与splitvalidation分别加载训练集与验证集。特征加工训练集通过prepare_train_features、验证集通过prepare_validation_features两个map函数batchedTrue, num_proc4完成分词与标注再用paddle.io.DataLoader加自定义collate_fn组批。长篇章切片与答案位置标注训练侧prepare_train_features是理解抽取式问答训练的关键窗口化切分调用tokenizer(questions, contexts, strideargs.doc_stride, max_seq_lenargs.max_seq_length)。当“问题 篇章”超过max_seq_length示例命令中为 384时tokenizer 会按doc_stride默认 128步长滚动切窗一条样本可能产生多个 featureoverflow_to_sample记录了 feature 与原始样本的映射用于标注时回查答案。字符偏移 → token 位置offset_mapping提供 token 到原始篇章字符位置的映射。标注逻辑取第一个答案answers[answer_start][0]与其文本长度计算start_char/end_char再在token_type_ids 1的篇章区域内二分推进找到覆盖答案的token_start_index - 1与token_end_index 1作为start_positions/end_positions。无答案 / 答案越界的处理若样本没有答案或答案落在当前窗口之外offsets判断不通过则将起止位置都标为[CLS]token 的索引——这使模型在“答案不在该窗口”时学会把概率压向 CLS与后处理阶段的 null 分数机制相互呼应。组批侧使用 paddlenlp.data 的DictPad/Stackinput_ids与token_type_ids按 pad token 填充start_positions/end_positions以 int64 堆叠。模型结构一对 span logitsMODEL_CLASSES中各 QA 模型如 ErnieGramForQuestionAnswering的结构一致在预训练编码器的 hidden states 之上接一个线性层nn.Linear(config.hidden_size, 2)对每个 token 同时预测“是否是答案起点 / 终点”前向输出start_logits与end_logits两个张量。损失函数与优化器损失run_du.py 中定义的CrossEntropyLossForSQuAD对 start/end 两个 logits 分别做交叉熵后取平均loss (start_loss end_loss) / 2其中 label 就是上面标注出的start_positions/end_positions。学习率采用LinearDecayWithWarmup(args.learning_rate, num_training_steps, args.warmup_proportion)即前warmup_proportion比例的步数线性升温示例命令中为 0.1之后线性衰减到 0num_training_steps取max_steps若 0或len(dataloader) * num_train_epochs。优化器paddle.optimizer.AdamW其中apply_decay_param_fun按参数名过滤——名称中含bias或norm的参数不施加 weight decay这是 Transformer 微调的常见做法。日志与 checkpoint每logging_steps步打印 loss 与吞吐step/s每save_steps步由 rank 0 保存至output_dir/model_global_step/训练结束时也会强制保存一次。注意保存目录名由全局步数决定如model_19000这正是“恢复训练”NOTE 中路径形式的来源。评估与后处理从 logits 到可提交文本do_predict阶段的调用链为验证集特征加工prepare_validation_features额外记录example_id并把非篇章 token 的offset_mapping置 None→evaluate逐 batch 前向收集全部 start/end logits → compute_prediction 后处理 → squad_evaluate 打分并落盘。多窗口合并compute_prediction先按example_id把一个样本切出的多个 feature 归组在每个 feature 内取 start logits 与 end logits 各自最大的n_best_size默认 20个位置做笛卡尔组合过滤掉越界、不在篇章内、长度超过max_answer_length默认 30的候选每个候选得分为start_logits[i] end_logits[j]跨所有 feature 合并后取前 n-best再用 softmax 归一化得到 probability最终取第 0 名的文本作为该样本预测。结果落盘evaluate函数将all_predictions以ensure_asciiFalse写入prediction.json即官方文档所说的“可提交结果”。中文评测细节squad_evaluate被显式传了is_whitespace_splitedFalse——中文答案没有空格分隔compute_f1 在此模式下会把归一化后的 gold/pred 当作整体字符串处理gold_toks[0]避免英文按词分词的 F1 逻辑在中文上失真normalize_answer还会剔除中英文标点如。“”《》等见 remove_punctuation并小写化使 “15个” 与 “15 个” 这类表面差异不影响得分。实践要点与常见问题序列长度与窗口的取舍max_seq_length 384是“问题 篇章”共享的预算。若篇章普遍较长可适当调大该值同时留意doc_stride默认 128——stride 越大窗口重叠越少、feature 数越少但答案恰好落在窗口缝隙处的风险略增两者共同决定训练/推理的显存占用与标注正确率。学习率与 warmup示例使用3e-5 0.1 warmup AdamWbias/norm 不衰减这是中文预训练模型下游微调的典型量级换用其他model_type时建议从 5e-5 附近起调。单卡与多卡命令固定使用paddle.distributed.launch --gpus 0单卡脚本内部对 world size 1 的场景做了DistributedBatchSampler与DataParallel支持多卡时直接调整--gpus即可checkpoint 仍由 rank 0 写出。恢复训练把--model_name_or_path指向output_dir下的model_step/目录即可脚本会自动加载权重、config 与分词器见上文 NOTE。只评估不训练do_train/do_predict是两个独立开关可将--model_name_or_path指向已训练 checkpoint 并仅保留--do_predict用于单独重跑评估或生成测试集预测。指标解读验证集评估同时给出exactEM与f1且按“是否有答案”分组DuReader-robust 验证集全部有答案因此输出中通常只出现HasAns_*字段total为 1417 与官方示例一致。小结本文以 PaddleNLP 的 DuReader-robust 官方示例为主线覆盖了中文抽取式阅读理解鲁棒性评测的完整闭环数据集的三元组任务定义与 HF 数据源、四选一model_type的微调命令与全量参数、训练侧的长文窗口切分与 CLS 兜底标注、ErnieGramForQuestionAnswering的双 logit 结构、CrossEntropyLossForSQuAD与 AdamW/LinearDecayWithWarmup 的优化细节以及compute_prediction/squad_evaluate构成的中文 F1/EM 评估与prediction.json提交文件生成链路。所有关键行为均可在 run_du.py、args.py、dureader_robust.py 与 squad.py 中逐行对应读者可据此在自己的业务篇章上复用该流程系统性地度量并改进模型的过敏感、过稳定与泛化表现。赞分享人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载相关推荐PaddleNLP ERNIE-GRAM 中文预训练模型指南权重清单、架构解析与 DuReader-robust 微调实战PaddleNLP ERNIE GRAM 中文预训练模型指南权重清单、架构解析与 DuReader robust 微调实战 ERNIE GRAM 是 Padd人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPPaddleNLP PEFT实践参数高效微调全集PaddleNLP PEFT实践参数高效微调全集 引言大模型微调的新范式 你是否曾面临这样的困境想要微调一个大语言模型来适应特定任务却发现显存需求巨大、大模型NLP预训练微调模型推理服务模型量化分布式训练RLHF人工智能Gromit-MPX与同类工具对比为什么它是Linux最佳屏幕标注工具Gromit MPX与同类工具对比为什么它是Linux最佳屏幕标注工具 在Linux系统中屏幕标注工具是教学、演示和协作的重要辅助工具。Gromit MP桌面应用上一篇Dokku Haproxy 代理插件实战指南基于 EasyHaproxy 的 Docker 标签路由、SSL 与运维全解析下一篇CDAP测试与调试开发者必备的故障排查工具集创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表