unilm 仓库 fairseq NAT 非自回归机器翻译训练实战:六类模型训练脚本与源码级参数全解析

发布时间:2026/9/13 8:32:05
unilm 仓库 fairseq NAT 非自回归机器翻译训练实战:六类模型训练脚本与源码级参数全解析 unilm 仓库 fairseq NAT 非自回归机器翻译训练实战六类模型训练脚本与源码级参数全解析【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm导读本文基于 unilm 仓库中decoding/IAD子项目所内置的 fairseq 非自回归机器翻译Non-autoregressive Machine Translation, NAT示例系统讲解如何用fairseq-train训练六类经典 NAT 模型——NATGu et al., 2017、NAT-CRFSun et al., 2019、iNATLee et al., 2018、Insertion TransformerStern et al., 2019、CMLMGhazvininejad et al., 2019与 Levenshtein TransformerGu et al., 2019。读完本文你将掌握 NAT 训练的数据准备与知识蒸馏流程、translation_lev任务与nat_loss损失的核心机制、每个模型专属参数的源码级含义以及训练完成后的迭代式推理、集成与重排等高级用法。一、背景为什么需要非自回归翻译以及本仓库提供了什么自回归Autoregressive, AR翻译模型按 token 逐位生成译文虽然质量高但解码延迟与目标序列长度成正比。非自回归NAT模型则让解码器一次性并行生成整条目标序列以推理速度换训练复杂度代价是需要额外机制解决目标长度未知与token 间依赖缺失两大难题。本文关联文档 scripts.md 正是这一领域六篇代表性工作的可直接运行的训练脚本集合配套的 README.md 则说明了数据准备、知识蒸馏与解码方法。从源码结构看这些模型全部位于 decoding/IAD/fairseq/fairseq/models/nat/ 目录并统一继承自抽象基类FairseqNATModel定义于 fairseq_nat_model.py后者又继承自标准TransformerModel同时提供--apply-bert-init参数以支持 BERT 风格参数初始化。六个已注册的模型架构名分别为模型架构名--arch对应论文核心思路nonautoregressive_transformerNAT (Gu et al., 2017)先预测长度再一次性并行解码nacrf_transformerNAT-CRF (Sun et al., 2019)在 NAT 之上叠加 CRF 结构化建模iterative_nonautoregressive_transformeriNAT (Lee et al., 2018)迭代精炼逐步修正译文insertion_transformerInsT (Stern et al., 2019)以插入操作为基本生成单元cmlm_transformerCMLM (Ghazvininejad et al., 2019)条件掩码语言模型 掩码预测levenshtein_transformerLevT (Gu et al., 2019)删除 / 掩码插入 / 词插入三类操作二、数据准备WMT14 英德数据、联合词表与知识蒸馏所有训练脚本都以data-bin/wmt14_en_de_distill已二值化的 WMT14 英德蒸馏数据集为输入。其完整准备工作分三步详见 README.md 与 examples/translation/README.md下载并预处理 WMT14 En-De 数据集可参考 prepare-wmt14en2de.sh 完成下载、分词等步骤。学习联合词表预处理时必须给fairseq-preprocess传入--joined-dictionary让源语言与目标语言共享同一词表——这是--share-all-embeddings得以生效的前提。知识蒸馏Knowledge Distillation沿用 Gu et al. (2019) 的做法先在相同数据上按 examples/translation/README.md 训练一个标准自回归 Transformer再用它对训练集做解码生成蒸馏数据供 NAT 模型训练。蒸馏能显著简化训练数据的分布对 NAT 模型学到高质量译文往往是必要的。仓库还直接提供了预处理好的原版数据集与蒸馏数据集压缩包下载入口README 中列出需自行构建二值化数据训练脚本统一指向蒸馏版本data-bin/wmt14_en_de_distill。三、公共训练基线任务、损失与噪声注入机制六套脚本共享大量公共参数理解这些参数是掌握全部脚本的关键。3.1 任务与损失translation_levnat_loss脚本统一使用--task translation_lev与--criterion nat_loss任务层translation_lev.pyTranslationLevenshteinTask继承自标准翻译任务核心差异在于train_step/valid_step会先对目标句注入噪声再交给模型与损失计算translation_lev.pysample[prev_target]即加噪后的解码器输入。损失层nat_loss.pyLabelSmoothedDualImitationCriterion把模型forward返回的多个子损失如word_ins-loss、length-loss、word_del-loss、word_crf-loss按各自factor加权求和nat_loss.py其中--label-smoothing在此注册默认 0.0脚本中设为 0.1。3.2--noise目标句噪声策略--noise定义训练时注入到目标句的噪声类型是区分各模型训练方式的关键开关由任务层 translation_lev.py 注册合法取值及源码实现translation_lev.py如下取值语义对应实现random_delete随机删除目标句中若干词保留bos/eos_random_deleterandom_mask随机将若干词替换为unk至少一个_random_maskfull_mask除bos/eos/pad外全部掩为unk_full_maskno_noise不注入任何噪声直接返回原序列六套脚本的噪声选择NAT、NAT-CRF、iNAT 用full_mask一次性给出整条掩码序列逼模型并行重建Insertion Transformer 与 Levenshtein Transformer 用random_delete与删除/插入操作语义天然契合CMLM 用random_mask与掩码预测任务一致。3.3 优化器与学习率Adam inverse_sqrt所有脚本采用相同优化配置Adam--adam-betas (0.9,0.98)、峰值学习率--lr 0.0005、inverse_sqrt调度、--warmup-updates 10000、--warmup-init-lr 1e-07、--stop-min-lr 1e-09配合--label-smoothing 0.1、--dropout 0.3、--weight-decay 0.01。3.4 架构与训练规模--share-all-embeddings源/目标词嵌入与解码器输出层共享参数需联合词表。--decoder-learned-pos/--encoder-learned-pos编码器、解码器使用可学习的位置编码。--apply-bert-init对所有编码器/解码器层应用 BERT 风格初始化实现在 fairseq_nat_model.py 中通过init_bert_params完成。--max-tokens 8000、--max-update 300000、--save-interval-updates 10000、--fixed-validation-seed 7、--ddp-backendno_c10d、--log-format simple --log-interval 100。默认架构尺寸定义在各模型的*_base_architecture中embed dim 512、FFN 2048、6 层编码器/解码器、8 注意力头例如 nonautoregressive_transformer.py。四、模型一NAT——先预测长度再并行解码4.1 训练脚本fairseq-train \ >fairseq-train \ >fairseq-train \ >fairseq-train \ >fairseq-train \ >fairseq-train \ >fairseq-generate \ >fairseq-generate \ >fairseq-generate \ contenteditable="false">【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考