ARTICLE · INTELLIGENCE

战地情报 · 详情页

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

fairseq 联合对齐-翻译实战:复现 Garg et al. (2019) 的 WMT‘18 英德 Transformer 训练全流程

fairseq 联合对齐-翻译实战:复现 Garg et al. (2019) 的 WMT‘18 英德 Transformer 训练全流程 fairseq 联合对齐-翻译实战复现 Garg et al. (2019) 的 WMT18 英德 Transformer 训练全流程【免费下载链接】fairseqFacebook AI Research Sequence-to-Sequence Toolkit written in Python.项目地址: https://gitcode.com/gh_mirrors/fa/fairseq本指南以 fairseq 仓库中的 examples/joint_alignment_translation/README.md 为核心系统讲解如何端到端复现Jointly Learning to Align and Translate with Transformer ModelsGarg et al., EMNLP 2019——即让 Transformer 在训练机器翻译模型的同时把解码器的交叉注意力监督成词对齐信号。读完本文你将掌握从 WMT18 英德数据下载、FastAlign 统计对齐生成、带对齐信息的 fairseq-preprocess 预处理到transformer_wmt_en_de_big_align架构训练与--print-alignment对齐抽取的完整实战链路并理解其底层源码实现。一、方法背景为什么让翻译模型顺手学对齐传统词对齐word alignment依赖 Giza、FastAlign 等统计工具独立于翻译模型运行而 Garg et al. (2019) 提出把对齐作为辅助监督信号直接叠加到 Transformer 的翻译训练目标上选择解码器某一层的若干交叉注意力头用外部统计对齐作为软标签通过额外的对齐损失约束注意力分布从而实现边翻译、边对齐。在 fairseq 中该方法的载体是transformer_align模型与label_smoothed_cross_entropy_with_alignment损失函数二者共同实现了论文中的联合训练目标。二、模型与损失transformer_align的源码解读2.1 模型定义transformer_align模型注册于 fairseq/models/transformer_align.py它直接继承标准的TransformerModel仅在顶层增加了三个与对齐监督相关的配置参数类型默认值说明--alignment-headsint1每层中被对齐监督的交叉注意力头数量--alignment-layerint4被监督的解码器层编号0 表示最底层bottommost--full-context-alignmentboolFalse是否在完整目标上下文的条件下监督对齐在forward_decodertransformer_align.py中模型把alignment_layer与alignment_heads作为额外参数传给解码器解码器据此返回对应层、对应头的注意力分布作为对齐损失的输入若开启full_context_alignment还会额外用features_onlyTrue跑一次前向用全上下文条件下的注意力替换原来的attn输出。2.2 架构注册本任务使用的transformer_wmt_en_de_big_align架构transformer_align.py以 fairseq 经典的transformer_wmt_en_de_big为底座big 配置encoder-embed-dim 1024、encoder-ffn-embed-dim 4096、16 头注意力等并设定默认--alignment-heads 1、--alignment-layer 4。2.3 对齐损失损失函数实现在 fairseq/criterions/label_smoothed_cross_entropy_with_alignment.py它在标签平滑交叉熵label_smoothed_cross_entropy的基础上叠加对齐项新增配置alignment_lambda默认0.05即对齐损失的权重compute_alignment_loss源码 L73-L91取出模型输出的注意力概率attn_prob将其展平为(bsz * tgt_sz, src_sz)再根据样本中的对齐索引对align形状[:, 2]每行是一对 src-tgt 索引取对应的注意力概率用align_weights加权后求负对数损失损失公式loss -sum( log(attn[align]) * align_weights )align_weights是目标端索引频率的倒数1 / frequency由 fairseq/data/language_pair_dataset.py 中的compute_alignment_weights计算目的是对一对多的对齐做归一化避免高频目标词主导梯度总损失loss label_smoothed_cross_entropy_loss alignment_lambda * alignment_loss对齐损失仅在训练集且样本含alignments时计算日志中会额外输出alignment_loss标量reduce_metrics L100-L102便于训练时监控对齐项收敛。三、实战步骤一下载与预处理 WMT18 英德数据仓库提供了完整的自动化预处理脚本 examples/joint_alignment_translation/prepare-wmt18en2de_no_norm_no_escape_no_agressive.sh运行./prepare-wmt18en2de_no_norm_no_escape_no_agressive.sh脚本内部按以下顺序工作克隆 Moses 解码器仓库使用其tokenizer.perl、clean-corpus-n.perl、remove-non-printing-char.perl脚本下载训练语料Europarl v7、CommonCrawl、News Commentary v13、Rapid 2016、验证集newstest2012与测试集newstest2014共 6 个压缩包并解压到orig/对每个语料依次执行去不可打印字符、Moses tokenization-no-escape关闭 HTML 转义合并为训练集train.tags.en-de.tok.*测试集从 newstest2014 的 SGM 文件提取seg文本并做同样的 tokenize用clean-corpus-n.perl按长度比 1.5 过滤训练语料-ratio 1.5限制句长 1–100以 newstest2012 作为验证集valid克隆 fastBPE 并编译在合并的双语训练集上学习 32000 个 BPE 词表codes随后对 train/valid/test 的 en、de 两侧统一应用 BPE输出到bpe.32k/目录文件名为train.en、train.de、valid.*、test.*。注意脚本名称中的no_norm_no_escape_no_agressive对应 tokenizer 的-no-escape选项即不做 Unicode 归一化、不转义 HTML 实体这与论文复现时的数据处理设定一致。四、实战步骤二用 FastAlign 生成统计对齐联合训练需要先有外部对齐作为监督信号本例使用 FastAlign 在 BPE 级语料上生成git clone gitgithub.com:clab/fast_align.git pushd fast_align mkdir build cd build cmake .. make popd ALIGNfast_align/build/fast_align paste bpe.32k/train.en bpe.32k/train.de | awk -F \t {print $1 ||| $2} bpe.32k/train.en-de $ALIGN -i bpe.32k/train.en-de -d -o -v bpe.32k/train.align要点说明paste将英德 BPE 句对按行拼成 FastAlign 的源 ||| 目标输入格式FastAlign 参数-d使用降噪训练目标diagonal 先验、-o输出优化后的对齐、-v输出到 stdout生成的对齐文件bpe.32k/train.align每行格式为空格分隔的src_idx-tgt_idx对索引从 0 开始——这正是 fairseq 的parse_alignmentfairseq/utils.py L637-L655所解析的标准格式。五、实战步骤三带对齐的 fairseq-preprocess 预处理对齐信息通过--align-suffix参数接入预处理流程与文本语料一起二值化fairseq-preprocess \ --source-lang en --target-lang de \ --trainpref bpe.32k/train \ --validpref bpe.32k/valid \ --testpref bpe.32k/test \ --align-suffix align \ --destdir binarized/ \ --joined-dictionary \ --workers 32其底层逻辑见 fairseq_cli/preprocess.py当设置了--align-suffix align时_make_all_alignments会检查trainpref .align即bpe.32k/train.align是否存在存在则通过AlignmentDatasetBinarizerfairseq/binarizer.py L289逐行调用parse_alignment将其转换为二值化数据集分别产出train.align.en-de、valid.align.en-de、test.align.en-de仅当对应.align文件存在时。因此训练/验证/测试集都可以拥有对齐监督。其他参数说明--joined-dictionary英德共享同一个 BPE 词典因为两侧使用了同一套 32k BPE codes--workers 32多进程并行处理--destdir binarized/二值化产物输出目录。训练时translation任务fairseq/tasks/translation.py L148-L154在--load-alignments开启时会加载{split}.align.{src}-{tgt}二值化数据集数据加载阶段fairseq/data/language_pair_dataset.py L335-L336将每条样本的对齐取出并在 collate 阶段L128-L153做偏移修正把 batch 内句子的 token 索引偏移回全局索引、合法性检查check_alignment会警告并跳过越界对齐以及align_weights频率归一化计算。六、实战步骤四训练联合对齐-翻译模型6.1 基础训练命令fairseq-train \ binarized \ --arch transformer_wmt_en_de_big_align --share-all-embeddings \ --optimizer adam --adam-betas (0.9, 0.98) --clip-norm 0.0 --activation-fn relu\ --lr 0.0002 --lr-scheduler inverse_sqrt --warmup-updates 4000 --warmup-init-lr 1e-07 \ --dropout 0.3 --attention-dropout 0.1 --weight-decay 0.0 \ --max-tokens 3500 --label-smoothing 0.1 \ --save-dir ./checkpoints --log-interval 1000 --max-update 60000 \ --keep-interval-updates -1 --save-interval-updates 0 \ --load-alignments --criterion label_smoothed_cross_entropy_with_alignment \ --fp16命令拆解--arch transformer_wmt_en_de_big_align启用上文所述的对齐模型架构默认在解码器第 4 层用 1 个注意力头做对齐监督可通过--alignment-heads、--alignment-layer、--full-context-alignment调整--load-alignments让翻译任务加载二值化对齐数据对应 translation.py L198 的配置项--criterion label_smoothed_cross_entropy_with_alignment切换为含对齐项的组合损失可通过--alignment-lambda默认 0.05调节对齐损失的权重--label-smoothing 0.1标签平滑系数优化器adambeta(0.9, 0.98)、inverse_sqrt学习率调度、4000 步 warmup、初始学习率 1e-7峰值 lr 0.0002--clip-norm 0.0表示不裁剪梯度--activation-fn relu与论文设定一致big 架构默认即 relu此处显式给出--max-tokens 3500单 batch 最大 token 数--fp16混合精度训练注意需要 CUDA 9.1 或更高版本以及 Volta 及更新的 GPU原文档明确提示。6.2 大 batch 训练技巧若机器有 8 张 GPU、希望模拟更大的全局 batch追加--update-freq 8梯度累积 8 步再更新等效模拟 8×864 张 GPU 的训练 batch相应调高学习率0.0007 在大 batch 下表现良好原文档建议值。七、实战步骤五解码并抽取 BPE 级对齐训练完成后用fairseq-generate在测试集上解码同时输出模型学到的对齐fairseq-generate \ binarized --gen-subset test --print-alignment \ --source-lang en --target-lang de \ --path checkpoints/checkpoint_best.pt --beam 5 --nbest 1--print-alignment支持两种模式见 fairseq_cli/generate.py L301-L319hard默认对每个目标词取注意力最大的源词位置输出形如src_idx-tgt_idx的硬对齐soft输出每个目标词在源句上的完整注意力概率分布逗号分隔。解码器返回的注意力经过 fairseq/utils.py 的extract_hard_alignment处理它会剔除 pad/eos 位置的无效注意力将对应位置置为-inf再把 token 级注意力通过get_token_to_word_mapping映射回词级索引。由于语料与对齐都在 BPE 层生成此时得到的对齐是BPE 级subword 级对齐。八、实战步骤六对齐的后处理与评估BPE 级对齐不能直接用于词级 AER 评估需要后处理。原文档指出以下工具的代码可以在 alignment-scripts 工具库中找到该库由 lilt 团队维护对齐测试集的准备构造可用于评测的词级对齐黄金标准BPE 级 → 词级对齐转换将 subword 级对齐合并为 token 级对齐双向对齐对称化对源→目标、目标→源两个方向的对齐做 grow-diagonal-final-andgdfa等对称化处理AER 指标评估计算 Alignment Error Rate。这些步骤通常与fairseq-generate输出配合完成先用--gen-subset test对双向模型分别生成对齐再做对称化与 AER 评测。九、引用若在研究中使用了该方法请引用原论文inproceedings{garg2019jointly, title {Jointly Learning to Align and Translate with Transformer Models}, author {Garg, Sarthak and Peitz, Stephan and Nallasamy, Udhyakumar and Paulik, Matthias}, booktitle {Conference on Empirical Methods in Natural Language Processing (EMNLP)}, address {Hong Kong}, month {November}, url {https://arxiv.org/abs/1909.02074}, year {2019}, }总结本文从原文档的完整训练流程出发结合 fairseq 源码梳理了联合对齐-翻译的完整闭环transformer_align模型通过--alignment-layer/--alignment-heads指定被监督的注意力label_smoothed_cross_entropy_with_alignment损失以alignment_lambda默认 0.05加权统计对齐与注意力分布的距离数据侧则由--align-suffix--load-alignments贯穿预处理与训练。按文中 6 步操作即可在 WMT18 英德上复现该论文并进一步扩展对齐后处理与 AER 评估。【免费下载链接】fairseqFacebook AI Research Sequence-to-Sequence Toolkit written in Python.项目地址: https://gitcode.com/gh_mirrors/fa/fairseq创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

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