模型的重排序实战:unilm/InfoXLM 中 fairseq 神经机器翻译重排序脚本全解析)
基于噪声信道Noisy Channel模型的重排序实战unilm/InfoXLM 中 fairseq 神经机器翻译重排序脚本全解析【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm本篇技术指南以infoxlm/fairseq/examples/noisychannel/目录下的 README.md 为核心系统讲解 fairseq 中基于 Yee et al. (2019) Simple and Effective Noisy Channel Modeling for Neural Machine Translation 的重排序reranking流水线如何用前向翻译模型、反向信道模型与目标端语言模型联合重打分 beam 搜索生成的 n-best 候选并借助随机搜索自动调优长度惩罚与模型权重。读完本文你将掌握完整的下载、生成、打分、调参与重排序操作流程并理解每个命令行参数背后的源码实现。一、技术背景为什么需要噪声信道重排序标准的序列到序列 NMT 模型直接建模条件概率 P(T|S)给定源句 S 生成目标句 T在解码时用 beam search 生成近似最优假设。但纯前向模型存在过短翻译等系统性偏差模型会为较短的假设分配过高概率业界常用长度惩罚length penalty来缓解。Yee et al. (2019) 提出一种简单而有效的替代方案沿用传统统计机器翻译中的噪声信道分解把翻译概率拆解为三个可独立训练的组件P(T|S) ∝ P(T) · P(S|T)即信道模型channel modelP(S|T)反向翻译模型backward model与目标端语言模型 P(T)的乘积再与前向模型 P(T|S)加权组合。由于 P(T|S) 的 beam 搜索已经给出了质量尚可的候选集合重排序阶段只需要用 beam search 生成 n-best 假设列表nbest list分别计算每个假设的 P(T|S)、P(S|T)可选与 P(T) 分数按加权线性组合挑选总分最高的假设作为最终翻译。在本仓库中这套方法作为 fairseq 的标准示例位于 infoxlm/fairseq/examples/noisychannel/配套论文引用如下inproceedings{yee2019simple, title {Simple and Effective Noisy Channel Modeling for Neural Machine Translation}, author {Kyra Yee and Yann Dauphin and Michael Auli}, booktitle {Conference on Empirical Methods in Natural Language Processing}, year {2019}, }二、预训练模型与测试数据准备README 提供了德→英de→en方向的完整重排序实验所需的三类模型与测试数据。三个模型分别对应重排序公式中的三个组件模型描述下载transformer.noisychannel.de-enDe→En 前向模型用于 beam 生成与 P(T|S)forward_de2en.tar.bz2transformer.noisychannel.en-deEn→De 信道/反向模型用于 P(S|T)backward_en2de.tar.bz2transformer_lm.noisychannel.en英语语言模型用于 P(T)reranking_en_lm.tar.bz2Test Datanewstest_wmt17 测试集wmt17test.tar.bz2按 README 的指引在任意工作目录初始化实验环境并下载全部资源mkdir rerank_example curl https://dl.fbaipublicfiles.com/fairseq/models/noisychannel/forward_de2en.tar.bz2 | tar xvjf - -C rerank_example curl https://dl.fbaipublicfiles.com/fairseq/models/noisychannel/backward_en2de.tar.bz2 | tar xvjf - -C rerank_example curl https://dl.fbaipublicfiles.com/fairseq/models/noisychannel/reranking_en_lm.tar.bz2 | tar xvjf - -C rerank_example curl https://dl.fbaipublicfiles.com/fairseq/models/noisychannel/wmt17test.tar.bz2 | tar xvjf - -C rerank_example解压完成后按 README 定义一组 shell 变量供后续命令使用这些变量名与源码中的参数名一一对应beam50 num_trials1000 fw_namefw_model_ex bw_namebw_model_ex lm_namelm_ex data_dirrerank_example/hyphen-splitting-mixed-case-wmt17test-wmt14bpe data_dir_namewmt17 lmrerank_example/lm/checkpoint_best.pt lm_bpe_codererank_example/lm/bpe32k.code lm_dictrerank_example/lm/dict.txt batch_size32 bwrerank_example/backward_en2de.pt fwrerank_example/forward_de2en.pt需要说明的是所有重排序脚本都依赖from fairseq import options等包内导入因此所有python examples/noisychannel/...命令都必须在 fairseq 项目根目录即本仓库的infoxlm/fairseq/目录下执行。三、重排序流水线从 n-best 生成到最终重排源码视角整套工具由六个脚本组成它们串联成一条清晰的流水线。从 rerank.py 的rerank()函数可以看出完整调用链rerank_generate.gen_and_reprocess_nbest(args) # Step 1-3生成 n-best 并预处理 rerank_score_bw.score_bw(args) # Step 4用双向/前向模型打分 rerank_score_lm.score_lm(args) # Step 4.5用语言模型打分 P(T) match_target_hypo(args, ...) # 组合分数、选最优假设、算 BLEU各阶段职责如下Step 1rerank_generate.py调用generate.main()用--gen-model前向模型生成 n-best 列表其中--nbest N与--beam N均设为候选数README 中beam50输出写到rerank_data/data_dir_name/.../generate_output_bpe.txtStep 2用rerank_utils.write_reprocessed把generate.py的H/S/T/P输出解析为干净的源句/假设/参考文本文件Step 3调用preprocess.main()把重打分所需的文本二值化binarize分别生成 left-to-right、right-to-left、backwards、LM 四类预处理目录目录命名规则见 rerank_utils.get_directoriesStep 4rerank_score_bw.py对--score-model1/--score-model2指定的打分模型执行generate.main(..., --score-reference)得到每个假设的对数概率Step 4.5rerank_score_lm.py对目标端语言模型执行eval_lm.main(..., --output-word-probs)计算 P(T)详见 rerank_utils.lm_scoring。一个值得注意的优化是当打分模型与生成模型是同一个 checkpoint 时args.gen_model args.score_model1源码会直接复用 beam 生成时已有的分数rerank1_is_gen/rerank2_is_gen判定见 rerank.py避免重复计算。四、核心评分公式三个权重与长度惩罚所有分数最终汇聚到 rerank_utils.get_scorescore a*bitext_score1 b*bitext_score2 c*lm_score if lenpen is not None: score / (target_len) ** float(lenpen)其中bitext_score1是第一个打分模型如反向信道模型 P(S|T)的对数概率权重a对应--weight1bitext_score2是第二个打分模型如与生成模型相同的前向模型 P(T|S)的分数权重b对应--weight2lm_score是目标端语言模型 P(T) 的分数权重c对应--weight3lenpen是长度惩罚指数1.0偏向短句、1.0偏向长句与 fairseq 生成阶段--lenpen语义一致见 infoxlm/fairseq/fairseq/options.pytarget_len按词word而非 BPE token 计数因为重打分的各模型可能使用不同的 BPE 编码rerank.py 中特别注释了这一点。当传入--normalize时使用按长度归一化版本前向分数除以目标长度、反向分数除以源长度、LM 分数除以源长度。此外BitextOutput 解析打分输出时会调用get_score_from_pos移除生成阶段的长度惩罚确保各模型贡献的是原始对数概率。五、命令行参数全景重排序相关的全部参数定义在 rerank_options.py 中分为Reranking重排序与Tuning调参两组。重排序组核心参数如下参数默认值说明--score-model1/-s1必填第一个重打分模型或模型集成路径--score-model2/-s2无第二个重打分模型路径可选--num-rescore/-n10参与重打分的候选假设数量--batch-size/-bz128生成 n-best 列表的批大小--gen-subsettest生成子集test/train/valid--gen-model无用于生成翻译的模型路径--backwards1/-b1False第一个模型组是否为反向模型P(S|T)--backwards2/-b2False第二个模型组是否为反向模型--weight1/-a1第一个模型的权重可传多个做搜索--weight2/-b1第二个模型权重--weight3/-c1第三个模型LM权重--language-model/-lm无目标端语言模型路径--lm-dict无目标端语言模型词典--lm-name无目标端语言模型名称--lm-bpe-code无目标端语言模型的 BPE code--data-dir-name无数据目录名称--lenpen1长度惩罚--remove-bpeBPE 符号用于双语与 LM--prefix-len无重打分使用的目标端前缀长度按词--samplingFalse用采样替代 beam search 生成 n-best--diff-bpeFalse重打分与 n-best 使用不同 BPE--nbest-list无使用 interactive.py 格式的预定义 n-best 列表--shard-id/--num-shards0 / 1分片生成支持--normalizeFalse按源/目标长度归一化分数Tuning 组参数供 rerank_tune.py 使用参数默认值说明--tune-param[lenpen]待调参数可选 lenpen/weight1/weight2/weight3--lower-bound[-0.7]搜索空间下界与 tune-param 一一对应--upper-bound[3]搜索空间上界--tune-subsetvalid调参所用的数据子集--num-trials1000随机搜索的试验次数--share-weightsFalse让 weight2 与 weight3 共享同一取值六、示例一P(T|S) × P(S|T) × P(T) 三模型联合重排序与调参最完整的三组件配置beam 生成用前向模型$fw重打分同时使用反向信道模型$bw--backwards1与生成模型本身$fw再加上目标端语言模型$lm。这里对lenpen、weight1、weight3三个参数做随机搜索--tune-param lenpen weight1 weight3下界0 0 0、上界3 3 3weight2固定为 1--weight2 1# reranking with P(T|S) P(S|T) and P(T) python examples/noisychannel/rerank_tune.py $data_dir --tune-param lenpen weight1 weight3 \ --lower-bound 0 0 0 --upper-bound 3 3 3 --data-dir-name $data_dir_name \ --num-trials $num_trials --source-lang de --target-lang en --gen-model $fw \ -n $beam --batch-size $batch_size --score-model2 $fw --score-model1 $bw \ --backwards1 --weight2 1 \ -lm $lm --lm-dict $lm_dict --lm-name en_newscrawl --lm-bpe-code $lm_bpe_code \ --model2-name $fw_name --model1-name $bw_name --gen-model-name $fw_name从 rerank_tune.random_search 的源码可以看出执行逻辑先在valid子集--tune-subset上对每个tune-param在其上下界内均匀采样num_trials组超参数每组超参数调用一次rerank.rerank()在 valid 上计算 BLEU4取最优组合后在--gen-subset默认 test上重跑一次得到最终结果。七、示例二P(T|S) × P(T) 两模型重排序与调参去掉反向信道模型只保留前向模型与语言模型。由于--score-model1 $fw与--gen-model $fw是同一 checkpoint源码会直接复用 beam 生成时的 P(T|S) 分数rerank1_is_genTrue省去一次前向打分。这里只调lenpen与weight3# reranking with P(T|S) and P(T) python examples/noisychannel/rerank_tune.py $data_dir --tune-param lenpen weight3 \ --lower-bound 0 0 --upper-bound 3 3 --data-dir-name $data_dir_name \ --num-trials $num_trials --source-lang de --target-lang en --gen-model $fw \ -n $beam --batch-size $batch_size --score-model1 $fw \ -lm $lm --lm-dict $lm_dict --lm-name en_newscrawl --lm-bpe-code $lm_bpe_code \ --model1-name $fw_name --gen-model-name $fw_name八、示例三使用预配置超参数直接重排序如果已经通过调参或文献确定了超参数可以直接用 rerank.py 跳过随机搜索一次性完成重排序。README 给出的已调好的参数为lenpen0.269、weight11、weight20.929、weight30.831# to run with a preconfigured set of hyperparameters for the lenpen and model weights, using rerank.py instead. python examples/noisychannel/rerank.py $data_dir \ --lenpen 0.269 --weight1 1 --weight2 0.929 --weight3 0.831 \ --data-dir-name $data_dir_name --source-lang de --target-lang en --gen-model $fw \ -n $beam --batch-size $batch_size --score-model2 $fw --score-model1 $bw --backwards1 \ -lm $lm --lm-dict $lm_dict --lm-name en_newscrawl --lm-bpe-code $lm_bpe_code \ --model2-name $fw_name --model1-name $bw_name --gen-model-name $fw_name这里--weight1/2/3与--lenpen只传一个值match_target_hypo 会走单组超参数分支直接对每个候选假设计算组合分数、选出每句最优假设与参考翻译计算 BLEU4 并写入matched_hypos/matched_targets文件若传入多组权重列表则会启动multiprocessing.Pool(32)并行计算并返回 BLEU 最高的那组超参数。九、更多进阶用法前缀重打分、右到左模型与分片前缀重打分prefix rescoring--prefix-len按词数与--target-prefix-frac/--source-prefix-frac按比例允许只对翻译的前缀部分重打分用于评估解码前缀质量。源码在 rerank_utils 中通过截取 pos 分数序列的前缀 token 数实现且规定--prefix-len、--target-prefix-frac、--source-prefix-frac三者互斥--prefix-len与右到左模型不兼容rerank_generate.py 中的断言右到左模型right-to-left--right-to-left1/2会把源句与目标句 token 顺序反转后打分make_right_to_left见 rerank_utils.py且与--backwards互斥采样替代 beam--sampling会用随机采样生成 n-best 候选generate.py --sampling适合探索性生成外部 n-best 列表--nbest-list可复用 interactive.py 输出的预生成 n-best 文件--ref-translation提供参考翻译此时要求--score-model2为空rerank_generate.py分片并行--shard-id/--num-shards/--all-shards支持把 n-best 生成与重排序拆分到多机/多卡并行各分片中间结果按nbest_N_subset_subset_fw_name_name_shard_id_of_n规则存储在examples/noisychannel/rerank_data/data_dir_name/下rerank_utils.get_directories。十、总结以 README.md 为起点、以examples/noisychannel/下六个脚本为支撑本文完整还原了 fairseq 噪声信道重排序的闭环beam 生成 n-best → 反向信道模型与语言模型重打分 → 加权组合 长度惩罚 → 随机搜索调优 → BLEU 评估。这套流水线既可用于复现 Yee et al. (2019) 的实验三个预训练模型与 WMT17 测试数据开箱即用其模块化设计rerank_generate 负责生成、rerank_score_bw 与 rerank_score_lm 负责打分、rerank.py 与 rerank_tune.py 负责组合与调参也便于接入任意自定义的双语模型或语言模型值得作为后续研究如多模型集成、长度偏差修正的实验基座。【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考