ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

多语种翻译实战:基于 unilm/edgelm 的 translation_multi_simple_epoch 框架(温度采样、语言标记与 mBART 微调)

2026/9/13 5:18:53 拓冰建站 浏览量
多语种翻译实战:基于 unilm/edgelm 的 translation_multi_simple_epoch 框架(温度采样、语言标记与 mBART 微调) 多语种翻译实战基于 unilm/edgelm 的 translation_multi_simple_epoch 框架温度采样、语言标记与 mBART 微调【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm本文以 edgelm/examples/multilingual/README.md 为骨架结合仓库内 fairseq 源码与配套脚本系统讲解如何在 unilm 仓库的 edgelm 分支下用多份双语平行语料训练多语种翻译模型涵盖温度采样的数据配比控制、源/目标语言标记langtok的注入方式、从 mBART 预训练模型微调以及推理生成与 sacrebleu 评测的完整链路。读者读完可掌握一整套可直接复现的多语种翻译训练、微调与评估方案。框架能力概览该框架面向同时使用多份不同翻译方向的双语平行语料bitext训练一个统一的多语种翻译模型这一场景其核心任务实现在 edgelm/fairseq/tasks/translation_multi_simple_epoch.py 中通过register_task(translation_multi_simple_epoch)注册为 fairseq 任务。与单语对翻译任务不同它要求所有语言共享同一份联合 BPE 词表并围绕三个关键机制展开基于温度temperature的数据采样对规模不均衡、方向各异的多个数据集进行配比采样避免大语料淹没小语料。对应参数--sampling-method取值uniform/temperature/concat与--sampling-temperature可配置的语言标记language token注入自动在源句/目标句上添加源语言或目标语言的标记 token使模型感知当前正在翻译哪种语言。对应参数--encoder-langtok取值src/tgt/None与--decoder-langtok布尔开关从预训练模型微调支持加载 mBART 等多语种预训练模型继续训练对应参数--finetune-from-model。温度采样如何平衡不均衡的多语料数据采样逻辑实现在 edgelm/fairseq/data/multilingual/sampling_method.py 中。该模块定义了三种采样函数uniform(dataset_sizes)对每个语对返回等权重1.0即所有语对按相同概率被采样完全不考虑语料规模差异temperature_sampling(dataset_sizes, temp)对第 i 个语对采样权重为(size_i / total_size) ** (1.0 / temp)其中size_i是该语对的样本数、total_size是所有语对样本总数。温度temp越大权重越趋近均匀削弱大语料优势温度越小趋近 0则越偏向大语料参数解析部分add_arguments显示--sampling-method的实际可选值还包括RoundRobindefaultconcat其中concat表示把全部数据集简单拼接后整体训练RoundRobin则按语对轮转取数据——README 中列出的uniform/temperature/concat是三种最常用的配置。--sampling-temperature的默认值为1.5仅在--sampling-method temperature时生效。实践中的标准组合是--sampling-method temperature --sampling-temperature 1.5见下文训练命令。语言标记langtok让模型知道在翻译哪种语言多语种翻译模型需要在输入/输出中携带语言身份信息。README 给出的两种配置方式--encoder-langtok src在源句前添加源语言 token也可设为tgt在源句前添加目标语言 token或设为None不添加--decoder-langtok在目标句即解码器输入前添加目标语言 token作为解码起始标记。从源码看语言标记的注入贯穿训练与推理两个阶段训练阶段MultilingualDatasetManager根据src_langtok_spec/tgt_langtok_spec对每个语对的数据集做变换见 translation_multi_simple_epoch.py 中的build_dataset_for_inference推理阶段inference_step会在prefix_tokens为空时将目标语言 token 作为prefix_tokens塞给 generatortranslation_multi_simple_epoch.py等价于强制以目标语言 token 作为解码起点生成结束后build_generator会把输出中用于解码的目标语言 token 通过symbols_to_strip_from_output剥掉translation_multi_simple_epoch.py保证最终译文不含语言标记如需保留以便分析可加--keep-inference-langtok。从预训练模型微调框架通过--finetune-from-model $pretrained_model指定预训练 checkpoint 路径可以是 mBART 预训练模型也可以是之前训练好的任意多语种模型加载权重后继续训练这是 mBART50 微调方案many-to-one / one-to-many / many-to-many的基础。数据预处理联合 BPE 词表与 binarize多语种训练的前提是所有语言共享一个联合 BPE 词表因此 README 要求按 mBART 的预处理流程复用其预训练的 sentencepiece 模型你也可以在自己的数据集上训练联合 BPE 模型再走翻译任务的多语种预处理链路。仓库在 edgelm/examples/multilingual/data_scripts/ 目录下提供了完整的数据工具链data_scripts/README.md 描述了从安装依赖pip install -r requirement.txt、下载数据设置WORKDIR_ROOT数据会落在$WORKDIR_ROOT/ML50到预处理需安装 sentencepiece 并设置SPM_PATH的流程数据组织按流水线划分$WORKDIR_ROOT/ML50/raw解压后的原始数据→$WORKDIR_ROOT/ML50/dedup去重数据→$WORKDIR_ROOT/ML50/clean从 dedup 数据中剔除与 valid/test 重叠的句子后的训练数据下载脚本覆盖了常见多语数据集download_ML50_v1.shML50、download_iwslt_and_extract.sh、download_ted_and_extract.py、download_wmt19_and_before.py、download_wmt20.sh、download_flores_data.sh、download_iitb.sh 等质量工具包括 dedup.py、fasttext_multi_filter.pyfastText 语种过滤、strip_sgm.sh、check_valid_test_overlaps.py 等。二进制化则使用 README 指定的 binarize.py它依赖两个环境变量WORKDIR_ROOT与SPM_PATH会自动下载 mBART50 的 sentencepiece 模型与 250k 词表随后按语对用spm_encode.py把 train/test/valid 切分编码为 BPE piece再调用 fairseq 的预处理命令生成各语对的 databin。注意ML50 数据的各语言字典即为dict.{lang}.txt见下文 mBART50 一节需复制到数据目录中。语言列表文件 ML50_langs.txt 每行一种语言代码形如ar_AR、cs_CZ、de_DE、en_XX、fr_XX等共 52 行覆盖 ML50 全部语种训练时通过--lang-dict传给任务用于确定模型感知的有序语言集合。训练从零训练多语种翻译模型README 给出的训练命令如下假设数据已按上述流程 binarize 好且各语对目录就绪lang_pairslanguage pairs to be trained, e.g. en-cs,cs-en path_2_dataset to data path lang_lista file which contains a list of languages separated by new lines fairseq-train $path_2_data \ --encoder-normalize-before --decoder-normalize-before \ --arch transformer --layernorm-embedding \ --task translation_multi_simple_epoch \ --sampling-method temperature \ --sampling-temperature 1.5 \ --encoder-langtok src \ --decoder-langtok \ --lang-dict $lang_list \ --lang-pairs $lang_pairs \ --criterion label_smoothed_cross_entropy --label-smoothing 0.2 \ --optimizer adam --adam-eps 1e-06 --adam-betas (0.9, 0.98) \ --lr-scheduler inverse_sqrt --lr 3e-05 --warmup-updates 2500 --max-update 40000 \ --dropout 0.3 --attention-dropout 0.1 --weight-decay 0.0 \ --max-tokens 1024 --update-freq 2 \ --save-interval 1 --save-interval-updates 5000 --keep-interval-updates 10 --no-epoch-checkpoints \ --seed 222 --log-format simple --log-interval 2参数要点拆解参数取值/示例作用--task translation_multi_simple_epoch固定指定多语种翻译任务对应 translation_multi_simple_epoch.py 中的注册任务--lang-pairsen-cs,cs-en逗号分隔、按训练顺序排列的语对列表任务会将每个语对分别构建数据集--lang-dict$lang_list文件路径每行一个语言的有序语言列表文件可直接复用 ML50_langs.txt 或自建--sampling-methodtemperature语对采样方式可选uniform/temperature/concat源码还支持RoundRobin默认concat--sampling-temperature1.5温度系数仅对temperature方式生效越大越均匀--encoder-langtoksrc在源句前加源语言 token可选src/tgt/None--decoder-langtok开启在目标句前加目标语言 token 作为解码起始--arch transformer --layernorm-embedding固定Transformer 结构 embedding 层后 LayerNorm与 mBART 结构对齐--encoder-normalize-before --decoder-normalize-before固定Pre-LN 风格归一化--criterion label_smoothed_cross_entropy --label-smoothing 0.2固定标签平滑 0.2 的交叉熵--optimizer adam --adam-eps 1e-06 --adam-betas (0.9, 0.98)固定Adam 优化器与 mBART 一致的超参--lr-scheduler inverse_sqrt --lr 3e-05 --warmup-updates 2500 --max-update 40000固定逆平方根学习率调度2500 步预热最多 4 万步更新--dropout 0.3 --attention-dropout 0.1 --weight-decay 0.0固定正则化配置--max-tokens 1024 --update-freq 2固定每 batch 最大 token 数与梯度累积步数等效扩大 batch--save-interval 1 --save-interval-updates 5000 --keep-interval-updates 10 --no-epoch-checkpoints固定每 5000 步保存一次 checkpoint保留最近 10 个不按 epoch 存--seed 222 --log-format simple --log-interval 2固定复现性种子与日志频率仓库把上述命令封装成了脚本 train_multilingual_model.sh按位置传三个参数即可运行bash train_multilingual_model.sh path_2_data lang_list lang_pairs # 例如bash train_multilingual_model.sh ./data ./ML50_langs.txt en-fr,en-cs,fr-en,cs-en注意--lang-pairs与--lang-dict必须与数据目录中实际存在的语对一致。另外TranslationMultiSimpleEpochTask.__init__中会对各源语言/目标语言的字典做一致性校验check_dicts所有源语言共享同一份字典、所有目标语言共享同一份字典这正是联合 BPE 词表 共享字典设计在源码层面的体现。微调从 mBART 预训练模型继续训练多语种模型同样可以从单语预训练模型如 mBART微调而来只需在训练命令基础上增加--finetune-from-model指向预训练 checkpointlang_pairslanguage pairs to be trained, e.g. en-cs,cs-en path_2_dataset to data path lang_lista file which contains a list of languages separated by new lines pretrained_modelpath to the pretrained model, e.g. mbart or another trained multilingual model fairseq-train $path_2_data \ --finetune-from-model $pretrained_model \ --encoder-normalize-before --decoder-normalize-before \ --arch transformer --layernorm-embedding \ --task translation_multi_simple_epoch \ --sampling-method temperature \ --sampling-temperature 1.5 \ --encoder-langtok src \ --decoder-langtok \ --lang-dict $lang_list \ --lang-pairs $lang_pairs \ --criterion label_smoothed_cross_entropy --label-smoothing 0.2 \ --optimizer adam --adam-eps 1e-06 --adam-betas (0.9, 0.98) \ --lr-scheduler inverse_sqrt --lr 3e-05 --warmup-updates 2500 --max-update 40000 \ --dropout 0.3 --attention-dropout 0.1 --weight-decay 0.0 \ --max-tokens 1024 --update-freq 2 \ --save-interval 1 --save-interval-updates 5000 --keep-interval-updates 10 --no-epoch-checkpoints \ --seed 222 --log-format simple --log-interval 2与从零训练相比唯一的区别就是多了--finetune-from-model。配套脚本 finetune_multilingual_model.sh 将其封装为四个位置参数bash finetune_multilingual_model.sh path_2_data lang_list lang_pairs pretrained_model脚本注释明确说明pretrained_modelcan be an mBART pretrained model as well——即可以加载 mBART 预训练权重也可以加载此前训练好的任意多语种模型作为起点。微调时建议保持与预训练一致的模型结构transformer layernorm-embedding pre-norm与较小的学习率3e-05即为此类配置。生成与评测fairseq-generate sacrebleu标准生成流程生成阶段同样使用多语种任务且必须保证--lang-dict、--lang-pairs与训练时一致模型才能正确解析语对与语言 token。生成时源语言 token 会被加到源句前目标语言 token 作为解码起始 token即上文inference_step中prefix_tokens的注入逻辑modelmultilingual model source_langsource language target_langtarget language fairseq-generate $path_2_data \ --path $model \ --task translation_multi_simple_epoch \ --gen-subset test \ --source-lang $source_lang \ --target-lang $target_lang --sacrebleu --remove-bpe sentencepiece\ --batch-size 32 \ --encoder-langtok src \ --decoder-langtok \ --lang-dict $lang_list \ --lang-pairs $lang_pairs ${source_lang}_${target_lang}.txt--source-lang/--target-lang指定本次翻译方向对应任务参数-s/-t生成时任务内部会将lang_pairs固定为{source_lang}-{target_lang}这一条见 translation_multi_simple_epoch.py--sacrebleu让 fairseq 在输出末尾附带 sacreBLEU 分数--remove-bpe sentencepiece会按 sentencepiece 规则还原 BPE piece输出重定向到{source_lang}_{target_lang}.txt其中逐句包含S源句、T参考、H假设译文即模型生成结果三类行。仓库同时提供了封装脚本 multilingual_fairseq_gen.shbash multilingual_fairseq_gen.sh path_2_data lang_list model该脚本内置lang_pairsen-fr,en-cs,fr-en,cs-en、source_langcs、target_langen可作为最简生成模板修改使用。用自定义 tokenizer 复现文献指标fairseq 内建的 sacrebleu 分数是基于sacrebleu的默认 tokenization 计算的。若要与其他文献对齐可以换成自定义 tokenizer例如针对目标语言的 Moses 风格 tokenizer重新计算分数TOKENIZERpath to a customized tokenizer for decoding evaluation TOK_CMD$TOKENIZER $target_lang or cat for sacrebleu cat {source_lang}_${target_lang}.txt | grep -P ^H |sort -V |cut -f 3- |$TOK_CMD ${source_lang}_${target_lang}.hyp cat {source_lang}_${target_lang}.txt | grep -P ^T |sort -V |cut -f 2- |$TOK_CMD ${source_lang}_${target_lang}.ref sacrebleu -tok none -s none ${source_lang}_${target_lang}.ref ${source_lang}_${target_lang}.hyp这段流水线的含义是从生成文件中提取假设译文行^H并按序号排序、cut -f 3-去掉行号与分数列得到.hyp提取参考译文行^T、cut -f 2-去掉行号得到.ref用sacrebleu -tok none -s none以不分词、不采用句子级平滑的方式计算 BLEU从而与文献口径一致若希望使用 sacrebleu 默认评测则将TOK_CMD设为cat即可。使用 mBART50 预训练模型官方提供了四类 mBART50 checkpoint均为可下载的 tar 包本文不再列出外部地址下载与解压方式见原文档mMBART 50 pretrained仅预训练、未做翻译微调的基础模型mMBART 50 finetuned many-to-one微调为多种语言 → 英语mMBART 50 finetuned one-to-many微调为英语 → 多种语言mMBART 50 finetuned many-to-many微调为任意方向的多语言互译。每个 tar 包解压后包含四类文件文件说明model.ptfairseq 模型 checkpointML50_langs.txt支持的语种列表与仓库中的 ML50_langs.txt 同构sentence.bpe.modelsentencepiece 模型dict.{lang}.txt各语言的 fairseq 字典lang替换为ML50_langs.txt中列出的语言代码使用步骤分两步第一步binarize 自己的数据使用 binarize.py 工具配合sentence.bpe.model与dict.{lang}.txt完成分词与二进制化并把各语言字典复制到数据目录--lang-dict指向ML50_langs.txt模型需要据此构造字典。第二步运行生成命令path_2_datapath to your binarized data with fairseq dictionaries modelpath_to_extracted_folder/model.pt lang_listpath_to_extracted_folder/ML50_langs.txt source_langsource language target_langtarget language fairseq-generate $path_2_data \ --path $model \ --task translation_multi_simple_epoch \ --gen-subset test \ --source-lang $source_lang \ --target-lang $target_lang --sacrebleu --remove-bpe sentencepiece\ --batch-size 32 \ --encoder-langtok src \ --decoder-langtok \ --lang-dict $lang_list与自训练模型的生成命令相比此处不再传--lang-pairs——因为预训练模型的语对集合已由 checkpoint 本身决定--lang-dict提供的ML50_langs.txt足以让任务为指定的--source-lang/--target-lang构造正确的语言标记与字典。--encoder-langtok src --decoder-langtok则与训练/微调时的语言标记配置保持一致。引用如果论文复现或方法改进工作基于该框架README 提供的规范引用如下article{tang2020multilingual, title{Multilingual Translation with Extensible Multilingual Pretraining and Finetuning}, author{Yuqing Tang and Chau Tran and Xian Li and Peng-Jen Chen and Naman Goyal and Vishrav Chaudhary and Jiatao Gu and Angela Fan}, year{2020}, eprint{2008.00401}, archivePrefix{arXiv}, primaryClass{cs.CL} }小结至此一条从数据预处理联合 BPE 词表 binarize.py 二进制化→ 温度采样多语训练--sampling-method temperature --sampling-temperature 1.5→ mBART 预训练模型微调--finetune-from-model→ 多语生成与 sacrebleu 评测的完整链路已经打通。核心要点可归纳为共享联合词表是前提--lang-dict/--lang-pairs的一致性贯穿训练与推理--encoder-langtok/--decoder-langtok决定语言身份的注入方式。相关可复现脚本与源码均可在仓库 edgelm/examples/multilingual/ 与 edgelm/fairseq/tasks/translation_multi_simple_epoch.py 中直接查阅与运行。【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考