ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

在 fairseq 中复现 Scaling NMT(Ott et al., 2018):基于 unilm 仓库 IAD 子目录的 WMT‘16 En-De 端到端训练与评测指南

在 fairseq 中复现 Scaling NMT(Ott et al., 2018):基于 unilm 仓库 IAD 子目录的 WMT‘16 En-De 端到端训练与评测指南 在 fairseq 中复现 Scaling NMTOtt et al., 2018基于 unilm 仓库 IAD 子目录的 WMT16 En-De 端到端训练与评测指南【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm本指南以 decoding/IAD/fairseq/examples/scaling_nmt/README.md 为骨架完整讲解如何在仓库内置的 fairseq 框架中复现《Scaling Neural Machine Translation》Ott et al., 2018的 Transformer 大模型Big翻译实验从下载 WMT16 英德数据、预处理构建联合词典、训练 Big 模型到使用 checkpoint 平均、束搜索生成与两种 BLEU 评测方法并结合 fairseq/models/transformer.py 与 fairseq/scripts 下的配套脚本进行源码级印证。读完本文你将掌握一套可复制运行的 NMT 复现流水线并理解 fairseq 中大数据、大批量、大模型训练的关键配置技巧。1. 背景Scaling NMT 论文与 fairseq 的关系《Scaling Neural Machine Translation》Ott et al., 2018提出了训练更大规模神经机器翻译模型的一系列实践方法是 fairseq 早期最具代表性的工作之一。本仓库的 decoding/IAD/fairseq 目录内置了一份完整可用的 fairseq 代码库而 examples/scaling_nmt/README.md 正是该论文结果的官方复现说明。它包含两条主线发布模型提供transformer.wmt14.en-fr与transformer.wmt16.en-de两个预训练模型的下载入口模型权重与 newstest2014 测试数据复现流程给出在 WMT16 En-De 上从零训练 Big Transformer 的完整命令序列预处理 → 训练 → 评估。下文将按 README 的顺序逐条展开并在关键步骤处引入仓库源码作为依据。2. 预训练模型概览README 提供了两套官方发布的模型均基于 Scaling NMT 论文中的 Transformer 结构可用于快速对比或直接推理模型描述数据集下载内容transformer.wmt14.en-frTransformerOtt et al., 2018WMT14 English-French模型.tar.bz2与 newstest2014 测试数据transformer.wmt16.en-deTransformerOtt et al., 2018WMT16 English-German模型.tar.bz2与 newstest2014 测试数据下载解压后即可用fairseq-generate配合模型权重进行推理评估命令可参考下文第 5 节。3. 在 WMT16 En-De 上训练新模型四步流水线3.1 第 1 步下载并解压预处理的 WMT16 En-De 数据首先下载 Google 提供的预处理版 WMT16 En-De 数据README 中附有下载链接数据为 BPE 分词后的格式然后解压TEXTwmt16_en_de_bpe32k mkdir -p $TEXT tar -xzvf wmt16_en_de.tar.gz -C $TEXT解压后目录中应包含train.tok.clean.bpe.32000训练集、newstest2013.tok.bpe.32000验证集与newstest2014.tok.bpe.32000测试集等 BPE 编码文件BPE 词表规模为 32000。3.2 第 2 步使用联合词典joined dictionary预处理数据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 \ >register_model_architecture(transformer, transformer_vaswani_wmt_en_de_big) def transformer_vaswani_wmt_en_de_big(args): args.encoder_embed_dim getattr(args, encoder_embed_dim, 1024) args.encoder_ffn_embed_dim getattr(args, encoder_ffn_embed_dim, 4096) args.encoder_attention_heads getattr(args, encoder_attention_heads, 16) args.encoder_normalize_before getattr(args, encoder_normalize_before, False) args.decoder_embed_dim getattr(args, decoder_embed_dim, 1024) args.decoder_ffn_embed_dim getattr(args, decoder_ffn_embed_dim, 4096) args.decoder_attention_heads getattr(args, decoder_attention_heads, 16) args.dropout getattr(args, dropout, 0.3) base_architecture(args)即编码器/解码器各 6 层继承自base_architecture见 transformer.py、嵌入维度 1024、FFN 维度 4096、注意力头数 16、dropout 默认 0.3。README 训练命令中显式给出的--dropout 0.3与该架构默认值一致。关键超参数解读参数取值作用--share-all-embeddings开启编码器、解码器与输出层共享词嵌入矩阵显著减少参数量--optimizer adam --adam-betas (0.9, 0.98)—Adam 优化器beta20.98 是 Transformer 训练常用设置--clip-norm 0.00不启用梯度裁剪--lr 0.0005 --lr-scheduler inverse_sqrt—初始学习率 5e-4采用逆平方根调度--warmup-updates 4000 --warmup-init-lr 1e-07—前 4000 步从 1e-7 线性升温到目标学习率--criterion label_smoothed_cross_entropy --label-smoothing 0.1—标签平滑交叉熵损失平滑系数 0.1--max-tokens 35843584单批次最大 token 数按 token 而非句子数计--fp16开启半精度混合精度训练关于--share-all-embeddings的约束从源码看共享词嵌入并非无条件可用。在 transformer.py 的模型构建逻辑中若src_dict ! tgt_dict即没有联合词典会抛出ValueError: --share-all-embeddings requires a joined dictionary若编码器与解码器嵌入维度不一致会抛出维度不匹配错误共享后会自动将share_decoder_input_output_embed置为 True即解码器输入与输出层也共享权重。这正是第 2 步必须使用--joined-dictionary的原因所在两个步骤在源码层面互相印证。--fp16的硬件前提README 明确指出--fp16需要CUDA 9.1 及以上且 GPU 为Volta 架构或更新否则半精度训练无法发挥硬件优势甚至不可用。3.4 大批量训练的官方建议重要README 特别强调用更大的 batch 训练、同时调大学习率可以获得更好的效果。假设机器上有 8 块 GPU添加--update-freq 16用梯度累积模拟在 8×16128 个 GPU 上的训练效果即每个更新步累积 16 个 mini-batch 的梯度将学习率提升到0.001大批量下表现良好。这一建议在 docs/getting_started.rst 中也有对应说明--update-freq用于累积梯度等效于扩大 batch size是 fairseq 在有限显存下放大有效批量的标准手段。4. 评估技巧复现论文 BLEU 分数的三道工序README 提醒原版《Attention Is All You Need》论文使用了若干技巧来获得更高的 BLEUScaling NMT 论文复用了这些技巧因此在复现结果时必须一并应用。4.1 工序一平均最后若干轮 checkpoint平均最近 5~10 个 checkpoint 通常效果不错具体数量可根据训练时长调整python scripts/average_checkpoints \ --inputs /path/to/checkpoints \ --num-epoch-checkpoints 10 \ --output checkpoint.avg10.pt该命令由仓库内置脚本 fairseq/scripts/average_checkpoints.py 提供其核心逻辑average_checkpoints函数是将每个 checkpoint 的模型参数在 CPU 上逐项累加后除以模型个数得到平均权重同时校验各 checkpoint 的参数键名必须完全一致否则抛出KeyError见 average_checkpoints.py。脚本还支持--num-epoch-checkpoints N按checkpointN.pt命名规则取最近 N 个 epoch 的 checkpoint--num-update-checkpoints N按checkpoint_ee_uu.pt命名规则取最近 N 个 update 的 checkpoint二者互斥见 average_checkpoints.py--checkpoint-upper-bound N限定取数上限例如--num-epoch-checkpoints10 --checkpoint-upper-bound50表示取第 41~50 个 checkpoint 求平均。4.2 工序二束搜索生成译文使用束宽 4、长度惩罚 0.6 生成翻译结果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)对应脚本为 fairseq/scripts/compound_split_bleu.sh它先检查gen.out最后一行是否已包含 BLEU 统计未生成完毕则退出再从^H假设译文与^T参考译文行中抽取文本用 Perl 正则s{(\S)-(\S)}{$1 ##AT##-##AT## $2}g在连字符两侧加空格最后调用fairseq-score计算分数。例如 Café-Liebhaber 会被拆成 Café - Liebhaber 三个 token从而普遍抬高 BLEU。README 明确警示这种注水分数不能与未采用该技巧的工作直接比较该技巧源自原版 AIAYN 代码Scaling NMT 论文沿用了它。方式 Bsacrebleu detokenized BLEU推荐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)对应脚本为 fairseq/scripts/sacrebleu.sh它从gen.out提取^H行并按序号排序、抽取译文列经sacremoses detokenize还原后交给sacrebleu计算。README 强烈建议论文报告使用sacrebleu分数因其评测口径标准化、可复现。运行前需安装依赖pip install sacremosessacrebleu 亦需另行安装。对比同一模型两种口径下分别得到 29.29compound split不推荐与 28.6sacrebleu推荐差异正是连字符拆词技巧所致。5. 使用预训练模型的推理路线若只想复现推理效果而非重新训练可在下载transformer.wmt16.en-de或 en-fr模型后以对应测试集数据为输入执行fairseq-generate解压模型与 newstest2014 数据.tar.bz2若使用 bpe32k 测试数据参照第 3.2 步执行fairseq-preprocess得到二值化数据注意--joined-dictionary需与模型训练时的词典设置一致执行第 4.2 步的fairseq-generate将--path指向解压后的模型权重。6. 引用若你的工作复用了本复现流程或模型建议按 README 中的 BibTeX 引用论文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, }7. 复现检查清单数据解压wmt16_en_de.tar.gz至wmt16_en_de_bpe32k目录预处理使用--joined-dictionary词表 32768输出至data-bin/wmt16_en_de_bpe32k训练transformer_vaswani_wmt_en_de_big--share-all-embeddings--fp16Volta / CUDA 9.1大批量优化8 卡场景可加--update-freq 16并将--lr提到 0.001评估平均最近 5~10 个 checkpoint →--beam 4 --lenpen 0.6生成 → 用 sacrebleu 计算 detokenized BLEU不推荐 compound split 口径对照sacrebleu 口径下目标分数约 28.6compound split 口径约 29.29仅供参考。【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进