unilm 联合对齐-翻译实战指南:基于 fairseq 的 Jointly Learning to Align and Translate(Garg et al., 2019)完整训练与评估流程
2026/9/13 4:02:32 网站建设 项目流程

unilm 联合对齐-翻译实战指南:基于 fairseq 的 Jointly Learning to Align and Translate(Garg et al., 2019)完整训练与评估流程

【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm

导读

本文基于 unilm 仓库中 edgelm/examples/joint_alignment_translation/README.md 展开,系统讲解如何在 fairseq 框架上复现 "Jointly Learning to Align and Translate with Transformer Models"(Garg et al., EMNLP 2019)——即让 Transformer 在完成机器翻译任务的同时,通过监督学习从交叉注意力中直接产出高质量词对齐(alignment)。文章覆盖 WMT'18 En-De 数据准备、FastAlign 对齐生成、含对齐信息的二值化预处理、transformer_wmt_en_de_big_align模型训练,以及 BPE 级对齐的生成与评估,并深入到 transformer_align.py 与 label_smoothed_cross_entropy_with_alignment.py 等源码实现,帮助读者掌握一套可直接运行、可复用的端到端实战方案。

一、方法背景:为什么让翻译与对齐联合学习

传统的词对齐任务通常由独立的统计工具(Giza++、FastAlign)完成,其产出再作为外部资源注入下游系统。而 Garg et al. (2019) 的核心思路是:Transformer 解码器的交叉注意力(cross-attention)本身就携带了"目标词与源词对应关系"的信息,完全可以把这个关系显式地监督起来——在标准翻译损失之外,附加一项"对齐损失",用外部工具(如 FastAlign)生成的先验对齐作为监督信号,引导特定层、特定注意力头学会对齐。

这样做的好处在于:

  • 翻译与对齐共享同一套表示,无需单独训练对齐模型;
  • 翻译性能与对齐质量同时提升,实验表明联合训练后翻译 BLEU 与对齐 AER 均有改善;
  • 对齐信息可以在推理时以 BPE 级、token 级甚至软对齐(soft alignment)的形式直接输出,服务于可解释性、术语翻译、评价诊断等下游需求。

在 unilm 仓库中,这一方法在 fairseq 代码库中被完整落地为三个关键模块:模型架构 transformer_align.py、损失函数 label_smoothed_cross_entropy_with_alignment.py、以及推理侧的对齐导出逻辑(generate.py)。

二、仓库中的示例布局与脚本清单

本示例位于 edgelm/examples/joint_alignment_translation/,包含两个文件:

文件作用
README.md完整的五步操作手册:数据准备 → 对齐生成 → 预处理 → 训练 → 评估
prepare-wmt18en2de_no_norm_no_escape_no_agressive.shWMT'18 En-De 数据的下载、Moses 分词、长度过滤与 32k BPE 子词切分脚本

配套的 fairseq 实现分布在 edgelm/fairseq/ 下,后续各节会逐一对照。

三、第 1 步:提取并预处理 WMT'18 En-De 数据

示例提供了一个一键脚本,直接执行:

./prepare-wmt18en2de_no_norm_no_escape_no_agressive.sh

从脚本源码(prepare-wmt18en2de_no_norm_no_escape_no_agressive.sh)可以看到它的具体工作内容:

  1. 克隆 Moses 脚本仓库,用于调用tokenizer.perl(分词)、clean-corpus-n.perl(语料清洗)与remove-non-printing-char.perl(去除不可打印字符)。
  2. 下载并行语料:Europarl v7、CommonCrawl、News Commentary v13(nc-v13)、Rapid 2016,并分别下载 newstest2012(验证集)与 newstest2014(测试集),数据全部写入orig/目录。
  3. 预处理:对训练语料按-no-escape模式做 Moses 分词(注意脚本名中的no_norm_no_escape_no_agressive正对应"不做规范化的 escape、不做激进清洗"的参数选择);测试集从newstest2014-deen-*.sgm中抽取<seg>文本并分词。
  4. 长度过滤:用clean-corpus-n.perl以 1.5 的 ratio、长度 1–100 的区间过滤训练语料。
  5. 子词切分:克隆 fastBPE 并编译fast二进制,先在output/train.enoutput/train.de上学习 32000 个 BPE codes,再对 train/valid/test 三个切分分别应用 BPE,最终输出到bpe.32k/目录,得到bpe.32k/train.enbpe.32k/train.debpe.32k/valid.*bpe.32k/test.*

说明:该脚本会从外部数据源下载语料与依赖工具(Moses、fastBPE),运行前提是网络可达且已安装wgetperlg++等基础工具链。

第 2 步:用统计对齐工具生成先验对齐(FastAlign)

联合训练需要"外部对齐信号",示例推荐使用 FastAlign 生成 BPE 级对齐:

git clone git@github.com:clab/fast_align.git pushd fast_align mkdir build cd build cmake .. make popd ALIGN=fast_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

关键点:

  • 对齐粒度为 BPE:因为模型输入本身就是 BPE 序列,FastAlign 直接作用于bpe.32k/train.en-de(格式为源句 ||| 目标句的一行一句文件),产出的对齐天然与模型 token 对应,无需再映射;
  • -d采用 dice 系数优化、-o输出对称化后的对齐、-v输出对齐概率到 stderr(供后续加权);
  • 示例用 FastAlign,但 README 明确说明 Giza++ 等任意统计对齐工具均可替代,只要最终能得到train.align格式的对齐文件即可。

第 3 步:带对齐信息的二值化预处理(fairseq-preprocess)

将平行语料与对齐文件一起打包为 fairseq 二进制格式:

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

参数说明:

参数作用
--source-lang en --target-lang de指定源/目标语言,前缀文件按{prefix}.{lang}读取
--trainpref/--validpref/--testpref三个切分的文件前缀(即bpe.32k/train等,实际读取train.entrain.de
--align-suffix align关键参数:指定对齐文件后缀,即读取bpe.32k/train.align;在 options.py 中该参数默认值为None,不传则不会打包任何对齐数据
--joined-dictionary源与目标共享同一个词典(对 En-De 这类同文种语言可显著压缩词表)
--destdir binarized/输出目录,最终得到binarized/train.en-de.debinarized/train.en-de.en以及对齐文件binarized/train.align.en-de
--workers 32多进程并行预处理,加速大数据集处理

对齐数据被写为{split}.align.{src}-{tgt}的索引文件。在训练时,tasks/translation.py 会按路径{data_path}/{split}.align.{src}-{tgt}检测并对齐数据集进行加载,再注入LanguagePairDataset供损失函数使用。

第 4 步:训练联合对齐-翻译模型

4.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

4.2 与联合对齐直接相关的三个参数

  • --arch transformer_wmt_en_de_big_align:注册于 transformer_align.py,是transformer_wmt_en_de_big的对齐版本,并设定默认--alignment-heads 1--alignment-layer 4
  • --load-alignments:打开对齐数据加载开关(见 translation.py 的load_alignments配置,默认False);
  • --criterion label_smoothed_cross_entropy_with_alignment:注册于 label_smoothed_cross_entropy_with_alignment.py,在标准标签平滑交叉熵之上叠加对齐损失。

4.3 源码级原理:TransformerAlignModel

transformer_align.py 定义了TransformerAlignModel,它继承标准TransformerModel,并引入三个可配置项:

参数默认值含义
--alignment-heads1用对齐监督的交叉注意力头数(per layer)
--alignment-layer4被监督的层号,0 表示最底层
--full-context-alignmentFalse是否在完整目标上下文的条件下监督对齐

forward_decoder在解码时把alignment_layeralignment_heads传入 decoder,提取对应层指定头的注意力分布;若开启full_context_alignment,还会额外以features_only=True走一次前向,用完整目标上下文的注意力替换部分上下文的注意力(对应论文中的 full-context variant)。

4.4 源码级原理:对齐损失怎么算

LabelSmoothedCrossEntropyCriterionWithAlignment 的 forward 流程为:

  1. 计算标准标签平滑损失(nll_loss分量单独记录);
  2. 若样本中存在alignments且非空(即--load-alignments生效且当前 batch 非 dummy),调用compute_alignment_loss
  3. 对齐损失为负对数注意力:loss = -(attn[align[:,1], align[:,0]].log() * align_weights).sum(),即对 FastAlign 给出的每个 (src, tgt) 对齐对,取该位置注意力概率的负对数,并按目标位置的频率倒数align_weights加权归一化;
  4. 最终loss += self.alignment_lambda * alignment_loss,其中alignment_lambda默认0.05(见配置 label_smoothed_cross_entropy_with_alignment.py),可通过--alignment-lambda调节对齐监督的强度;
  5. reduce_metrics会单独汇总并输出alignment_loss指标,训练日志中可实时观察对齐损失与翻译损失的变化趋势。

4.5 训练超参数要点与注意事项

  • 优化器:Adam(betas=(0.9, 0.98))、inverse_sqrt学习率调度、4000 步 warmup、初始 lr 1e-07、峰值 lr 0.0002;
  • 正则化:dropout 0.3、attention-dropout 0.1、label-smoothing 0.1、weight-decay 0.0、--clip-norm 0.0表示不做梯度裁剪;
  • 训练规模:--max-tokens 3500(单 batch 的 token 上限)、60000 步更新、--log-interval 1000
  • --fp16的硬件前提:README 明确注明需要 CUDA 9.1+ 与 Volta 及以上架构的 GPU(即支持混合精度训练的 GPU);
  • 大 batch 扩展:若机器有 8 张 GPU 且想模拟更大 batch,添加--update-freq 8相当于模拟 8×8=64 张 GPU 的批量规模,同时将学习率提高到 0.0007(README 指出这对大 batch 效果良好);
  • --keep-interval-updates -1--save-interval-updates 0组合用于控制 checkpoint 保存策略。

第 5 步:评估翻译并导出 BPE 级对齐

fairseq-generate \ binarized --gen-subset test --print-alignment \ --source-lang en --target-lang de \ --path checkpoints/checkpoint_best.pt --beam 5 --nbest 1
  • 使用checkpoint_best.pt进行 beam search(--beam 5),输出测试集翻译;
  • --print-alignment让生成器在输出中追加A-{id}行,内容是src_idx-tgt_idx形式的目标-源对齐索引对(对应源码 generate.py 中print_alignment == "hard"的分支);
  • 对齐信息来源于训练中受监督层/头的交叉注意力:推理时 fairseq_model.py 会根据print_alignment自动为模型开启need_attn,从而在解码过程中收集注意力并解析为对齐;
  • 该对齐是BPE 级别的,README 明确指出后续的"BPE 级→token 级转换、双向对称化、AER 评估"需要使用额外的 alignment-scripts 工具链完成(原文档提供的外部工具地址此处不再重复)。

六、评估对齐质量(AER 指标)与配套工具

README 的 "Other resources" 一节指出,完整评估管线还需要四类配套能力:

  1. 准备对齐测试集(alignment test sets):构造带 gold alignment 的评测数据;
  2. BPE 级 → token 级对齐转换:因为模型输出的是 BPE 对齐,评测前需按 BPE 合并规则还原到词级别;
  3. 双向对齐对称化(symmetrization):融合 en→de 与 de→en 两个方向的对齐结果;
  4. AER 指标计算:Alignment Error Rate,衡量预测对齐与 gold alignment 的吻合程度。

这些能力在 unilm 仓库中不提供实现,需使用论文作者推荐的外部 alignment-scripts 工具包(见原文档第 75 行),本文仅说明其在整体流程中的位置与用途。

七、引用论文

本文复现的方法出自以下论文,训练与评估时请按此引用:

@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}, }

八、总结与扩展阅读

本示例给出了一条从数据到模型再到评估的完整链路,其核心工程要点可归纳为:

  • 对齐信号先于训练存在:用 FastAlign/Giza++ 等统计工具生成先验对齐,经--align-suffix打包进二值化数据;
  • 架构层面的最小改动TransformerAlignModel仅需指定被监督的层号与头数,即复用标准 Transformer 的交叉注意力作为对齐来源;
  • 损失层面的联合监督label_smoothed_cross_entropy_with_alignmentalignment_lambda=0.05的权重将负对数注意力损失叠加到翻译损失之上,实现"一份模型、两个任务";
  • 推理即对齐fairseq-generate --print-alignment无需额外模型即可输出对齐,且源码同时支持 hard 与 soft 两种对齐导出模式。

想深入了解底层实现,可继续阅读以下仓库文件:

  • 模型架构:edgelm/fairseq/models/transformer_align.py
  • 损失函数:edgelm/fairseq/criterions/label_smoothed_cross_entropy_with_alignment.py
  • 对齐数据加载:edgelm/fairseq/tasks/translation.py
  • 对齐导出实现:edgelm/fairseq_cli/generate.py
  • 预处理参数定义:edgelm/fairseq/options.py

【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询