的完整训练与 BLEU 评测流程)
Fairseq 大规模神经机器翻译实战复现 Scaling NMTOtt et al., 2018的完整训练与 BLEU 评测流程【免费下载链接】fairseqFacebook AI Research Sequence-to-Sequence Toolkit written in Python.项目地址: https://gitcode.com/gh_mirrors/fa/fairseq本指南以 fairseq 仓库中 examples/scaling_nmt/README.md 为骨架讲解如何复现论文Scaling Neural Machine TranslationOtt et al., 2018的实验结果从 WMT16 英德数据集的解压、BPE 预处理与联合词典构建到 Transformer-Big 模型的分布式训练调参大 batch 高学习率再到 checkpoint 权重平均、beam search 生成以及两种 BLEU 评测方案。读完本文你将掌握一套可落地的预处理 → 训练 → 评测完整链路并理解 fairseq 在底层如何实现这些操作。背景Scaling NMT 论文与 fairseq 的对应关系Scaling Neural Machine TranslationOtt et al., 2018发表于 WMT 2018是 fairseq 项目的重要论文之一它系统研究了如何通过增大 batch size、调整学习率等手段在大规模数据上训练出高性能的神经机器翻译模型。该论文复现并超越了原版Attention Is All You NeedVaswani et al., 2017在 WMT14 En-Fr 与 WMT16 En-De 上的结果其全部实验配置、预训练模型与复现脚本都直接内置在 fairseq 仓库中。仓库中与该指南直接相关的文件包括复现说明examples/scaling_nmt/README.md评测脚本scripts/average_checkpoints.py、scripts/compound_split_bleu.sh、scripts/sacrebleu.sh模型架构定义fairseq/models/transformer/transformer_legacy.py数据预处理入口fairseq_cli/preprocess.py通用 WMT 数据准备脚本examples/translation/prepare-wmt14en2de.sh。预训练模型一览论文发布的预训练模型及配套测试集可通过 fairseq 官方模型库获取规格如下模型描述数据集下载内容transformer.wmt14.en-frTransformerOtt et al., 2018WMT14 英语-法语模型压缩包.tar.bz2与 newstest2014 测试集压缩包transformer.wmt16.en-deTransformerOtt et al., 2018WMT16 英语-德语模型压缩包.tar.bz2与 newstest2014 测试集压缩包两个模型均为joined dictionary联合词典训练版本即源语言与目标语言共享同一个词表这要求预处理阶段使用--joined-dictionary。下载解压后可以直接用fairseq-generate在 newstest2014 上验证论文报告的结果若想从零训练则按下一节流程执行。在 WMT16 En-De 上从零训练新模型1. 获取并解压预处理的 WMT16 En-De 数据论文复现使用 Google 提供的预处理 WMT16 En-De 数据包wmt16_en_de.tar.gz内含 BPE 分词后的训练/验证/测试文件。拿到压缩包后执行TEXTwmt16_en_de_bpe32k mkdir -p $TEXT tar -xzvf wmt16_en_de.tar.gz -C $TEXT解压后的目录中会出现以下关键文件$TEXT即wmt16_en_de_bpe32ktrain.tok.clean.bpe.32000BPE 合并数为 32000 的清洗后训练语料newstest2013.tok.bpe.32000验证集newstest2013newstest2014.tok.bpe.32000测试集newstest2014。如果希望从原始语料Europarl、CommonCrawl、News Commentary 等自行走完分词 → 清洗 → BPE全流程仓库还提供了 examples/translation/prepare-wmt14en2de.sh 作为参考它展示了基于 Moses tokenizer 与 subword-nmt 的标准预处理管线。2. 使用联合词典Joined Dictionary预处理数据集fairseq 预处理通过fairseq-preprocess命令完成将文本语料转成二进制的 indexed dataset并构建词典fairseq-preprocess \ --source-lang en --target-lang de \ --trainpref $TEXT/train.tok.clean.bpe.32000 \ --validpref $TEXT/newstest2013.tok.bpe.32000 \ --testpref $TEXT/newstest2014.tok.bpe.32000 \ --destdir>fairseq-train \ >python scripts/average_checkpoints \ --inputs /path/to/checkpoints \ --num-epoch-checkpoints 10 \ --output checkpoint.avg10.pt从源码看该工具的实现要点包括--inputs接受一个或多个 checkpoint 路径--output指定平均后权重写出路径--num-epoch-checkpoints N会在--inputs指向的目录中按正则checkpoint(\d)\.pt匹配按 epoch 保存的 checkpoint并取最近 N 个与之互斥的还有--num-update-checkpoints按更新步数匹配checkpoint_\d_(\d)\.pt与--num-best-checkpoints按验证分数排序取最优 N 个--checkpoint-upper-bound可为 epoch/update 平均设置上界例如--num-epoch-checkpoints10 --checkpoint-upper-bound50表示只平均第 41–50 个 epoch 的权重平均过程会把 FP16 半精度权重先转成 FP32 再求和见average_checkpoints中isinstance(p, torch.HalfTensor)分支浮点参数做除法平均、非浮点参数做整除平均最后整体覆盖回new_state[model]并写出。4.2 使用 Beam Search 生成译文fairseq-generate \ >bash scripts/compound_split_bleu.sh gen.out # BLEU4 29.29, 60.3/35.0/22.8/15.3 (BP1.000, ratio1.004, syslen64763, reflen64496)脚本内部逻辑见 scripts/compound_split_bleu.sh检查gen.out末尾是否含BLEU行以确认生成任务已完成用grep ^H抽取系统译文、grep ^T抽取参考译文通过 perl 正则s{(\S)-(\S)}{$1 ##AT##-##AT## $2}在连字符两侧插入##AT##-##AT##占位符该约定与 fairseq 预处理时合并 BPE 的方式对应##AT##会被--remove-bpe还原成-最后调用fairseq-score --sys ... --ref ...计算 4-gram BLEU其评分实现位于 fairseq_cli/score.py底层使用fairseq/scoring/bleu.py支持--order、--ignore-case、--sacrebleu、--sentence-bleu等选项。方案 B推荐sacrebleu detokenized BLEU文档强烈建议改用 sacrebleu 报告分数因为它是社区公认的标准化评测工具结果可直接与其他论文对比bash scripts/sacrebleu.sh wmt14/full en de gen.out # BLEUcase.mixedlang.en-denumrefs.1smooth.exptest.wmt14/fulltok.13aversion.1.4.3 28.6 59.3/34.3/22.1/14.9 (BP 1.000 ratio 1.016 hyp_len 63666 ref_len 62688)scripts/sacrebleu.sh 的四个位置参数依次为TESTSET如wmt14/full、SRCLANG、TGTLANG与GEN。脚本逻辑为检查sacremoses是否安装缺失时提示pip install sacremoses用grep ^H取出系统译文经sed s/^H\-//去掉行号、sort -n -k 1按序号排序、cut -f 3取译文列再交给sacremoses detokenize做逆分词还原最终用sacrebleu --test-set wmt14/full --language-pair en-de基于内置参考语料计算标准 detokenized BLEU。对比两者方案 A 报告 29.29compound split 后虚高方案 B 报告 28.6标准 detokenized——同一份译文两种口径数字不同正说明了评测口径一致性的重要性。常见问题与注意事项FP16 前提--fp16需要 CUDA 9.1 与 Volta 及更新 GPU否则应去掉该选项改用 FP32 训练显存不足--max-tokens 3584可按显卡显存调整需要更大有效 batch 时优先用--update-freq而非盲目加大--max-tokens评测口径论文复现请严格使用 compound split 脚本对齐数字对外报告建议统一使用 sacrebleu避免 BLEU 虚高引发的对比失真checkpoint 数量平均 5–10 个 checkpoint 是经验值训练不足或波动较大时可结合--checkpoint-upper-bound精细选择参与平均的权重。引用若你的工作复现或参考了本文所述实验建议引用原论文inproceedings{ott2018scaling, title {Scaling Neural Machine Translation}, author {Ott, Myle and Edunov, Sergey and Grangier, David and Auli, Michael}, booktitle {Proceedings of the Third Conference on Machine Translation (WMT)}, year 2018, }延伸阅读本文命令对应的完整说明与更新动态见 examples/scaling_nmt/README.mdTransformer-Big 架构的全部注册实现见 fairseq/models/transformer/transformer_legacy.py数据准备、预处理、训练与生成工具的源码入口分别位于 fairseq_cli/preprocess.py、fairseq_cli/generate.py 与 fairseq/trainer.py评测工具链checkpoint 平均、compound split、sacrebleu 封装集中在 scripts/ 目录可在此基础上按需改造。【免费下载链接】fairseqFacebook AI Research Sequence-to-Sequence Toolkit written in Python.项目地址: https://gitcode.com/gh_mirrors/fa/fairseq创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考