
用 fairseq 复现多样化机器翻译混合专家模型unilm 仓库 translation_moe 实战解析【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm本篇基于 unilm 仓库中 translation_moe 示例文档完整讲解如何复现 Shen et al. (2019)《Mixture Models for Diverse Machine Translation: Tricks of the Trade》的多样化机器翻译方案从 WMT17 En-De 数据准备到translation_moe任务的四种混合专家MoE变体训练、按专家分别生成翻译再到用 score.py 计算 pairwise BLEU 与平均 oracle BLEU。读完后你将掌握如何借助--method、--num-experts、--gen-expert等参数构建“共享参数 专家指示词”的混合模型并能对照源码理解在线责任分配online responsibility assignment与 LogSumExp 自定义反传的实现细节。背景为什么用混合专家做多样化翻译神经机器翻译NMT的贪心/束搜索解码天然倾向于输出高频、保守的译文导致同一句源文的不同译文高度雷同难以覆盖参考译文的多样性分布。Shen et al. (2019) 的方案是把翻译模型写成K 个专家expert的混合用“共享参数化 专家指示词”的方式实现所有专家共享同一套 Transformer 参数不增加模型规模在词表中为每个专家新增一个指示符号expert_ii 0..K-1解码时把该符号作为第一个目标 token就能强制输出“第 i 个专家”的译文训练时采用在线责任分配每个句子由后验概率决定由哪个专家负责硬混合或以混合权重计入所有专家软混合。unilm 仓库在 edgelm/examples/translation_moe/ 下提供了完整的任务实现与评测脚本下面按“数据 → 训练 → 生成 → 评测”四步复现。第一步准备 WMT17 En-De 数据必须使用联合词表按照文档要求先按 WMT14 En-De 数据准备指南 下载并预处理 WMT17 En-De 数据。该指南提供了下载脚本 prepare-wmt14en2de.sh并在 翻译 README 的 “WMT14 English to German (Convolutional)” 一节给出标准 binarize 命令# 下载并准备数据见 translation 示例 cd examples/translation/ bash prepare-wmt14en2de.sh cd ../.. # 二值化数据集注意加 --joined-dictionary 学习联合词表 TEXTexamples/translation/wmt17_en_de fairseq-preprocess \ --source-lang en --target-lang de \ --trainpref $TEXT/train --validpref $TEXT/valid --testpref $TEXT/test \ --destdir># add indicator tokens for each expert for i in range(cfg.num_experts): # add to both dictionaries in case were sharing embeddings src_dict.add_symbol(expert_{}.format(i)) tgt_dict.add_symbol(expert_{}.format(i))注释明确说明“为共享 embedding 的情形向两个词表都添加”。也就是说模型通过共享源/目标词表把expert_i既当作输入侧的专家身份标记也当作目标侧解码的起始 token--share-all-embeddings。如果源/目标使用分离词表两侧对expert_i的编码会不一致指示词机制就失效了因此必须--joined-dictionary。第二步训练混合专家模型文档提供了训练hMoElp硬混合 学习先验模型、3 个专家的完整命令fairseq-train --ddp-backendlegacy_ddp \ ># compute loss with dropout if self.hard_selection: winners prob_z_xy.max(dim1)[1] # 每句取后验最大的专家 loss -get_lprob_yz(winners) # 仅对胜者重算 log p(y|z, x) else: lprob_yz get_lprob_yz() # B x K loss -LogSumExpMoE.apply(lprob_yz, prob_z_xy, 1)硬混合hMoElp/hMoEupwinners argmax_k prob_z_xy损失只由获胜专家的lprob_yz[winners]构成——每个句子训练时被“分配”给一个专家软混合sMoElp/sMoEup前向用标准logsumexp_k lprob_yz[i,k]但反向传播不走 LogSumExp 的导数而是用自定义 autograd Function LogSumExpMoEclass LogSumExpMoE(torch.autograd.Function): Standard LogSumExp forward pass, but use *posterior* for the backward. staticmethod def forward(ctx, logp, posterior, dim-1): ctx.save_for_backward(posterior) return torch.logsumexp(logp, dimdim) staticmethod def backward(ctx, grad_output): (posterior,) ctx.saved_tensors grad_logp grad_output.unsqueeze(ctx.dim) * posterior return grad_logp, None, None这正是论文中“用后验近似梯度”的技巧反向时把梯度按后验权重posterior分摊给各专家分支而前向值仍是严格的 log 混合概率。此外每次迭代的logging_output会记录posterior的 batch 级累加和经reduce_metrics以标量形式打印方便监控各专家的责任分布是否退化。第三步按专家分别生成翻译模型训好后用--gen-expert指定由哪个专家解码。生成时gen-expert会覆盖--gen-expert的默认值 0。以从专家 0 生成为例fairseq-generate>def inference_step(self, generator, models, sample, prefix_tokensNone, expertNone, constraintsNone): expert expert or self.cfg.gen_expert with torch.no_grad(): return generator.generate( models, sample, prefix_tokensprefix_tokens, constraintsconstraints, bos_tokenself.expert_index(expert), # 用 expert_i 替换 BOS )即生成时把 beam search 的起始 token 直接换成expert_i的下标。由于所有专家共享参数同一份 checkpoint 只需切换 BOS 就能产出 K 路风格/分布不同的译文——这也是“共享参数化”混合模型最实用的性质。第四步评测多样性——pairwise BLEU 与平均 oracle BLEU4.1 下载多参考测试集wget dl.fbaipublicfiles.com/fairseq/data/wmt14-en-de.extra_refs.tok该文件是 tokenized 的 WMT14 En-De 测试集每条样本带多条参考译文格式为S-源句/T-一条参考/R...其余参考行。4.2 对每个专家分别跑生成BPE_CODEexamples/translation/wmt17_en_de/code for EXPERT in $(seq 0 2); do \ cat wmt14-en-de.extra_refs.tok \ | grep ^S | cut -f 2 \ | fairseq-interactive>python examples/translation_moe/score.py --sys wmt14-en-de.extra_refs.tok.gen.3experts --ref wmt14-en-de.extra_refs.tok # pairwise BLEU: 48.26 # #refs covered: 2.11 # multi-reference BLEU (leave-one-out): 59.46文档给出 3 专家模型对应论文 Table 7 第 3 行的结果。score.py 的计算口径值得细读文件格式解析load_sys读取生成文件中S-/T-/D-行D-id\tlog_prob\t译文见 score.py#L56-L77load_ref按S-/T-/R行分组解析多参考见 score.py#L80-L98pairwise BLEUpairwise()对每条句子的 K 个译文两两组合——把其余 K-1 条当参考、当前 1 条当假设全部拼接后算 corpus BLEU。衡量“专家之间互译是否彼此多样”#refs coveredmulti_ref()每条译文对多参考逐一算 sentence-BLEU 取 argmax 的最近参考统计平均每条源句被 K 个专家“覆盖”的不同参考数示例中 2.11即 3 个专家平均覆盖了约 2 条不同参考而非 3 条完全重复multi-reference BLEU (leave-one-out)multi_ref()把 K 路译文全部展平对 m 条参考逐条留出leave-one-out用其余 m-1 条当参考算 corpus BLEU 后取平均与参考集自身的intra_ref口径可比。此外score.py还支持--output参数把源句、参考和各专家译文及 log-prob 合并成便于人工检查的格式见merge()。关键参数与文件速查关注点位置说明MoE 任务定义方法枚举、专家词表注入、损失/推理逻辑translation_moe_src/translation_moe.py--method、--num-experts、--gen-expert等参数的解析与行为都集中于此学习先验门控网络translation_moe_src/mean_pool_gating_network.py均值池化 两层 FC log_softmax软混合的反向传播技巧translation_moe_src/logsumexp_moe.py前向 LogSumExp、反向按后验分配梯度多样性评测score.pypairwise BLEU、refs covered、leave-one-out 多参考 BLEU数据准备参照edgelm/examples/translation/README.md、prepare-wmt14en2de.shWMT17 En-De 下载与 binarize注意--joined-dictionary适用前提与限制该示例基于 unilm 仓库内置的 edgelmfairseq 派生代码树训练/生成命令依赖fairseq-train、fairseq-generate、fairseq-interactive三个 CLI 与sacrebleu库learned-prior 变体sMoElp/hMoElp强制要求门控网络--num-experts在训练与推理时必须保持一致否则词表中expert_i数量对不上会导致指示词机制失效。引用article{shen2019mixture, title {Mixture Models for Diverse Machine Translation: Tricks of the Trade}, author {Tianxiao Shen and Myle Ott and Michael Auli and MarcAurelio Ranzato}, journal {International Conference on Machine Learning}, year 2019, }【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考