非自回归机器翻译(NAT)实战指南:在 fairseq 中复现 Levenshtein Transformer 与 Mask-Predict 等五类模型
【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm
导读
本文以 fairseq 官方nonautoregressive_translation示例为骨架,完整讲解如何在 WMT'14 英德(En-De)数据集上训练与推理五类非自回归(Non-Autoregressive, NAT)机器翻译模型:Levenshtein Transformer(LevT)、Non-Autoregressive Transformer(NAT)、迭代精炼版 iNAT、Insertion Transformer(InsT)与 Mask-Predict(CMLM)。读完本文,你将掌握translation_lev任务、nat_loss准则、--noise噪声注入机制以及iterative_refinement_generator迭代解码器的完整用法,并理解其底层源码实现,能够直接复现论文结果。
背景:为什么需要非自回归翻译
传统自回归(Autoregressive, AT)翻译逐词从左到右解码,每一步都依赖上一步输出,生成 N 个词需要 N 次串行前向计算,推理延迟高。非自回归模型的目标是并行生成整句翻译:一次性输出全部目标 token,或在少量迭代轮数内逐步精炼,从而大幅降低解码时延。
fairseq 在 examples/nonautoregressive_translation/README.md 中提供了 Levenshtein Transformer(Gu et al., 2019)的完整复现指引,并额外内置了四类经典 NAT 模型的参考实现:
| 模型 | 论文 | 核心思想 |
|---|---|---|
| Levenshtein Transformer (LevT) | Gu et al., 2019 | 以删除/插入两类编辑操作迭代精炼译文 |
| NAT | Gu et al., 2017 | 长度预测 + 一次性并行生成 |
| iNAT | Lee et al., 2018 | 并行生成后迭代精炼,训练中引入 DAE |
| Insertion Transformer (InsT) | Stern et al., 2019 | 通过插入操作逐步构造序列 |
| Mask-Predict (CMLM) | Ghazvininejad et al., 2019 | 条件掩码语言模型 + 迭代解码 |
所有模型共享同一套任务(translation_lev)与损失准则(nat_loss),差异主要体现在模型架构与训练时注入的噪声类型上,这使得对比实验非常方便。
数据集准备:WMT'14 英德与知识蒸馏
下载与预处理
首先按照翻译任务的数据准备说明下载并预处理 WMT'14 En-De 数据集。关键一步:在运行fairseq-preprocess时必须传入--joined-dictionary,让源语言(英)与目标语言(德)共享同一个词表——这是 NAT 系列模型的常见要求,因为许多 NAT 方法(如 LevT、InsT)需要将源 token 直接映射到目标 token 的编辑操作上。
知识蒸馏(Knowledge Distillation)
NAT 模型在训练中缺乏逐词依赖的"自纠正"能力,直接从原始平行语料学习往往难以生成高质量译文。遵循 Gu et al. 2019 的做法,从自回归模型进行知识蒸馏可以显著简化训练数据的分布,有时甚至对 NAT 模型能否学到良好翻译起到决定性作用。
蒸馏流程很简单:
- 先在相同数据上按标准 Transformer 训练指引训练一个自回归模型;
- 用该模型对训练集解码,得到一份"蒸馏数据集"(通常称为
wmt14_en_de_distill),供 NAT 模型训练使用。
官方也提供了预处理好的原始数据集与蒸馏数据集,下载后需自行调用fairseq-preprocess完成二值化(binarized)处理。
训练非自回归模型
训练 NAT 模型统一使用translation_lev任务与nat_loss准则,通过--noise参数指定施加在目标句上的输入噪声。从源码看,translation_lev.py 中--noise的合法取值为random_delete、random_mask、no_noise、full_mask四种,并在 inject_noise 方法中按取值分别执行随机删除、随机掩码、无噪声、全掩码操作,作为解码器的输入prev_target。
默认配置运行的是 Levenshtein Transformer(--noise='random_delete'),以下命令在二值化蒸馏数据上训练 LevT:
fairseq-train \ >fairseq-train \ >fairseq-train \ >fairseq-train \ >fairseq-train \ >fairseq-generate \ >@article{gu2019levenshtein, title={Levenshtein Transformer}, author={Gu, Jiatao and Wang, Changhan and Zhao, Jake}, journal={arXiv preprint arXiv:1905.11006}, year={2019} }延伸阅读
- 完整训练脚本汇总:nonautoregressive_translation/scripts.md
- 模型实现:levenshtein_transformer.py
- 损失准则:nat_loss.py
- 噪声注入任务:translation_lev.py
- 迭代精炼生成器:iterative_refinement_generator.py
【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考