尧图精选

mBART 多语言去噪预训练实战指南:从 CC25 预训练模型微调到 EN-RO 机器翻译

🕒 发布时间:2026/9/13 2:26:51 📁 来源:尧图网络
mBART 多语言去噪预训练实战指南从 CC25 预训练模型微调到 EN-RO 机器翻译【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm导读mBARTMultilingual Denoising Pre-training for Neural Machine Translation是第一个直接以完整序列到序列模型为对象进行多语言去噪预训练的方法通过在 25 种语言的单语语料上执行 BART 目标完成预训练再将预训练权重微调到具体翻译方向。本文以 decoding/IAD/fairseq/examples/mbart/README.md 为骨架结合 decoding/IAD/fairseq/fairseq/tasks/translation_from_pretrained_bart.py、decoding/IAD/fairseq/fairseq/models/bart/model.py 等源码完整讲解预训练模型下载、SentencePiece BPE 编码、fairseq-preprocess 数据预处理、EN-RO 微调与 sacreBLEU 评测的端到端流程并剖析语言标识符lang token与mask符号在任务实现中的底层机制。一、mBART 是什么多语言序列到序列去噪自编码器mBART 是一个序列到序列sequence-to-sequence去噪自编码器denoising auto-encoder在多种语言的大规模单语语料上使用 BART 目标BART objective进行预训练。按照 decoding/IAD/fairseq/examples/mbart/README.md 的介绍mBART 是最早通过对多语言的完整文本进行去噪来预训练完整序列到序列模型的方法之一此前的方案要么只预训练编码器要么只预训练解码器要么只重建文本的一部分。其核心思想可以概括为在预训练阶段不依赖任何平行语料仅用单语文本通过类似 BART 的文本损坏与重建目标让模型学会从被破坏的文本中还原完整文本这一通用能力随后在翻译数据上微调将这种语言理解与生成能力迁移到具体的翻译任务上。从源码结构看mBART 的模型实现直接建立在 BART 之上——decoding/IAD/fairseq/fairseq/models/bart/model.py#L26-L27 中BARTModel继承自TransformerModel而mbart_large、mbart_base等架构正是以bart为基座注册的模型架构register_model_architecture(bart, mbart_large) def mbart_large_architecture(args): args.no_scale_embedding getattr(args, no_scale_embedding, False) bart_large_architecture(args)可以看到mbart_large与 BART-large 的唯一区别在于关闭了 embedding 缩放no_scale_embedding False即不按sqrt(d)缩放 embedding。bart_large_architecture中编码器嵌入维度为 1024、FFN 维度为 4×102412 层编码器与 12 层解码器、16 注意力头见 decoding/IAD/fairseq/fairseq/models/bart/model.py#L315-L319 起的架构注册这正对应 README 中mbart.CC25的12 层编码器 12 层解码器、610M 参数。二、预训练模型与基准结果README 提供了两个官方发布的 checkpoint均托管在 fairseq 官方资源中训练与微调可直接使用Model描述# 参数下载mbart.CC25在 25 种语言单语语料上训练、12 层编码器与解码器的 mBART 模型610Mmbart.cc25.v2.tar.gzmbart.ft.ro_en在 ro-en 语言对上微调过的 mBART CC25 模型610Mmbart.cc25.ft.enro.tar.gzWMT16 EN-RO 基准结果test set未使用额外数据BLEUModelen-roro-enRandom34.334.0mbart.cc2537.737.8mbart.enro.bilingual38.538.5这一组数据说明仅做多语言去噪预训练的mbart.cc25不经过任何双语微调在 WMT16 EN-RO 上即可取得明显高于随机初始化基线的 BLEU而微调后的mbart.enro.bilingual进一步提升约 0.8 个 BLEU。需要强调的是上述 BLEU 数值直接引用自仓库 README属于官方文档记载的基准数据在读者自己的数据与超参下结果可能有所波动。三、完整实战流程EN-RO 翻译微调3.1 数据准备BPE 编码mBART 的词表基于 SentencePieceSPM因此数据侧的关键一步是使用预训练时的sentence.bpe.model对双语语料做 BPE 编码。首先下载预训练模型并解压同时安装 sentencepiecewget https://dl.fbaipublicfiles.com/fairseq/models/mbart/mbart.cc25.v2.tar.gz tar -xzvf mbart.CC25.tar.gz随后对训练集、验证集、测试集的源语言${SRC}与目标语言${TGT}分别执行 SPM 编码SPM/path/to/sentencepiece/build/src/spm_encode MODELsentence.bpe.model ${SPM} --model${MODEL} ${DATA}/${TRAIN}.${SRC} ${DATA}/${TRAIN}.spm.${SRC} ${SPM} --model${MODEL} ${DATA}/${TRAIN}.${TGT} ${DATA}/${TRAIN}.spm.${TGT} ${SPM} --model${MODEL} ${DATA}/${VALID}.${SRC} ${DATA}/${VALID}.spm.${SRC} ${SPM} --model${MODEL} ${DATA}/${VALID}.${TGT} ${DATA}/${VALID}.spm.${TGT} ${SPM} --model${MODEL} ${DATA}/${TEST}.${SRC} ${DATA}/${TEST}.spm.${SRC} ${SPM} --model${MODEL} ${DATA}/${TEST}.${TGT} ${DATA}/${TEST}.spm.${TGT} 要点BPE 编码必须使用预训练自带的sentence.bpe.model以保证训练/验证/测试与预训练使用完全一致的子词切分每个句子在编码后保持一行多个文件可并行处理。3.2 数据预处理fairseq-preprocess编码完成后使用fairseq-preprocess将文本格式化为 fairseq 的二进制数据。关键点是源语言与目标语言共用同一个dict.txtmBART 预训练词典并设置--thresholdsrc 0 --thresholdtgt 0以保留全部词条DICTdict.txt fairseq-preprocess \ --source-lang ${SRC} \ --target-lang ${TGT} \ --trainpref ${DATA}/${TRAIN}.spm \ --validpref ${DATA}/${VALID}.spm \ --testpref ${DATA}/${TEST}.spm \ --destdir ${DEST}/${NAME} \ --thresholdtgt 0 \ --thresholdsrc 0 \ --srcdict ${DICT} \ --tgtdict ${DICT} \ --workers 70说明--srcdict与--tgtdict指向同一份dict.txt因为预训练阶段源/目标语言共享词表--workers 70用于并行加速输出目录${DEST}/${NAME}下将生成train.spm.${SRC}-${TGT}.{src,tgt}等二进制数据与词典文件。3.3 微调fairseq-train在 CC25 预训练权重上对 EN-RO 进行微调的命令如下可直接替换path_2_data为 3.2 节的输出目录PRETRAINmbart.cc25 # fix if you moved the downloaded checkpoint langsar_AR,cs_CZ,de_DE,en_XX,es_XX,et_EE,fi_FI,fr_XX,gu_IN,hi_IN,it_IT,ja_XX,kk_KZ,ko_KR,lt_LT,lv_LV,my_MM,ne_NP,nl_XX,ro_RO,ru_RU,si_LK,tr_TR,vi_VN,zh_CN fairseq-train path_2_data \ --encoder-normalize-before --decoder-normalize-before \ --arch mbart_large --layernorm-embedding \ --task translation_from_pretrained_bart \ --source-lang en_XX --target-lang ro_RO \ --criterion label_smoothed_cross_entropy --label-smoothing 0.2 \ --optimizer adam --adam-eps 1e-06 --adam-betas (0.9, 0.98) \ --lr-scheduler polynomial_decay --lr 3e-05 --warmup-updates 2500 --total-num-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 \ --restore-file $PRETRAIN \ --reset-optimizer --reset-meters --reset-dataloader --reset-lr-scheduler \ --langs $langs \ --ddp-backend no_c10d3.3.1 关键参数逐项解读--task translation_from_pretrained_bart指定从预训练 BART/mBART 权重初始化翻译任务。对应任务类位于 decoding/IAD/fairseq/fairseq/tasks/translation_from_pretrained_bart.py#L14-L15它继承自TranslationTask。初始化时会遍历--langs指定的语言列表向源/目标词典逐个添加[语言代码]符号并追加mask符号见 translation_from_pretrained_bart.py#L52-L58def __init__(self, args, src_dict, tgt_dict): super().__init__(args, src_dict, tgt_dict) self.langs args.langs.split(,) for d in [src_dict, tgt_dict]: for l in self.langs: d.add_symbol([{}].format(l)) d.add_symbol(mask)同时add_args定义了任务级参数--langs必填逗号分隔的预训练语言列表顺序必须与预训练一致微调时需包含全部预训练语言与--prepend-bos每个句子前添加 BOS以匹配 mBART 预训练习惯。--langs25 个语言代码这是 mBART 的完整预训练语言集合从ar_AR阿拉伯语到zh_CN中文。语言代码采用xx_YY形式如en_XX、ro_RO其中XX表示该语言不区分地区变体。微调时不能只传源/目标语言必须保留完整列表原因见 3.3.2。--source-lang en_XX --target-lang ro_RO翻译方向。注意语言代码与数据预处理阶段使用的语言名如en、ro不同这里使用的是 mBART 的 lang token 形式。--arch mbart_large对应 bart/model.py#L369-L372 注册的架构即 12 层编码器 12 层解码器的 BART-large 结构并关闭 embedding 缩放。--encoder-normalize-before --decoder-normalize-before --layernorm-embeddingmBART 采用 Pre-LN先归一化再子层结构LayerNorm 同时作用于 embedding 输出。--criterion label_smoothed_cross_entropy --label-smoothing 0.2带标签平滑的交叉熵平滑系数 0.2是机器翻译微调的常见配置。--optimizer adam --adam-eps 1e-06 --adam-betas (0.9, 0.98)Adam 优化器beta2 取 0.98、eps 取 1e-6 是预训练/微调 Transformer 的经典取值。--lr-scheduler polynomial_decay --lr 3e-05 --warmup-updates 2500 --total-num-update 40000多项式衰减学习率初始 3e-5前 2500 步 warmup共 40000 步。--dropout 0.3 --attention-dropout 0.1 --weight-decay 0.0全局 dropout 0.3、注意力 dropout 0.1、权重衰减为 0。--max-tokens 1024 --update-freq 2单 batch 最多 1024 token梯度累积 2 步等效 batch size 扩大一倍。--restore-file $PRETRAIN与四个--reset-*加载 CC25 预训练权重同时重置优化器状态、训练指标、数据加载器与学习率调度器确保微调从干净状态开始。--ddp-backend no_c10d分布式训练后端配置。3.3.2 语言标识符与mask的底层机制mBART 的一个关键设计是语言标识符lang token。预训练时每个句子会附加其语言代码如[en_XX]、[ro_RO]使模型能够区分不同语言。这一机制在微调阶段由translation_from_pretrained_bart任务完整保留数据加载load_dataset调用load_langpair_dataset(..., prepend_bos..., append_source_idTrue)见 translation_from_pretrained_bart.py#L73-L90其中append_source_idTrue会在源句子末尾追加源语言的 lang id。生成阶段build_generator构造SequenceGenerator时显式将 EOS 设为self.tgt_dict.index([{}].format(self.args.target_lang))见 translation_from_pretrained_bart.py#L103-L117即解码器以目标语言 token 作为句子终止符生成会在出现[ro_RO]时停止。推理输入build_dataset_for_inference在每条源序列末尾拼接[源语言]的 id见 translation_from_pretrained_bart.py#L119-L131。正因如此--langs必须覆盖全部 25 个预训练语言任务初始化时会为词典补充这些 lang token加载 checkpoint 时 embedding 矩阵的行数才能与词典对齐。同时bart/model.py#L220-L230 中的truncate_emb逻辑说明了一个细节预训练词典中的mask对应 embedding 矩阵的最后一行当切换到翻译任务词典中不含mask时代码会自动截掉这行使加载的 embedding 与任务词典严格匹配。3.4 生成与评测fairseq-generate sacreBLEU下载微调好的 EN-RO 模型wget https://dl.fbaipublicfiles.com/fairseq/models/mbart/mbart.cc25.ft.enro.tar.gz tar -xzvf mbart.cc25.ft.enro.tar.gz执行翻译生成model_dirMBART_finetuned_enro # fix if you moved the checkpoint fairseq-generate path_2_data \ --path $model_dir/model.pt \ --task translation_from_pretrained_bart \ --gen-subset test \ -t ro_RO -s en_XX \ --bpe sentencepiece --sentencepiece-model $model_dir/sentence.bpe.model \ --sacrebleu --remove-bpe sentencepiece \ --batch-size 32 --langs $langs en_ro参数要点--bpe sentencepiece指定推理时用 SentencePiece 还原子词--sentencepiece-model指向与预训练一致的 SPM 模型--sacrebleu让 fairseq 直接按 moses 风格计算 BLEU--remove-bpe在输出时移除 SPM 的▁前缀-t ro_RO -s en_XX指定翻译方向--langs与训练保持一致。对生成结果en_ro做后处理并计算最终 BLEU需要 WMT16 的 moses tokenizer 脚本cat en_ro | grep -P ^H |sort -V |cut -f 3- | sed s/\[ro_RO\]//g |$TOKENIZER ro en_ro.hyp cat en_ro | grep -P ^T |sort -V |cut -f 2- | sed s/\[ro_RO\]//g |$TOKENIZER ro en_ro.ref sacrebleu -tok none -s none en_ro.ref en_ro.hyp这一后处理流程解释如下grep -P ^H提取以H-开头的模型输出行grep -P ^T提取以T-开头的参考译文行sort -V按行号自然排序保证H-10排在H-2之后cut去除行号与得分列sed s/\[ro_RO\]//g删除解码器在句尾生成的目标语言 token[ro_RO]——这正是 3.3.2 中以目标语言 token 作为 EOS设计的直接体现经过 moses tokenizer 规范化后用sacrebleu -tok none -s none在无额外 tokenization 的情况下计算 BLEU。四、源码级延伸mBART 预训练任务multilingual_denoising作为背景补充mBART 的预训练对应multilingual_denoising任务实现于 decoding/IAD/fairseq/fairseq/tasks/multilingual_denoising.py。该任务继承自DenoisingTaskBART 的去噪目标并新增了三个关键参数--multilang-sampling-alpha默认 1.0多语言采样平滑系数。_get_sample_prob中按smoothed_prob prob ** alpha计算各语言采样概率见 multilingual_denoising.py#L91-L99alpha 越大低资源语言被上采样的程度越高有助于缓解语料规模不均。--add-lang-token为每种语言向词典添加[lang]token见 multilingual_denoising.py#L72-L74。--no-whole-word-mask-langs指定不使用整词掩码的语言如无空格分隔的 CJK 语言。预训练与微调共享同一套lang token mask 去噪设计这解释了为什么微调阶段--langs必须完整传递、mask符号由任务类自动补充——它们在 translation_from_pretrained_bart.py#L52-L58 中同样被加入词典保证了预训练与微调间的词汇表一致性。此外bart/model.py#L232-L272 还实现了新增语言继续预训练的支持当加载的 embedding 行数小于新词典时会用正态初始化std embed_dim ** -0.5为新语言补充 embedding并保持mask位于最后一行。五、常见问题与实操提示langs 顺序不能乱--langs的顺序必须与预训练一致README 中的 25 语言列表即为标准顺序因为 lang token 在词典中的 index 由加入顺序决定。词典与 embedding 对齐微调时若提示 embedding 尺寸不匹配检查是否因词典中缺少某个 lang token 或mask导致行数多 1——源码的truncate_emb会自动处理翻译任务下多出的mask行。BPE 模型必须一致从数据编码3.1到生成3.4全程应使用同一份sentence.bpe.model混用会导致子词切分不一致、评测失真。评测口径直接看fairseq-generate输出的--sacrebleu结果即可但 README 中的en_ro.hyp/en_ro.ref后处理路线更适合复现 WMT16 官方的 tokenized BLEU二者口径不同比较时应保持一致。资源需求mbart_large为 610M 参数模型README 中--max-tokens 1024 --update-freq 2是适配较小显存的保守配置显存充足时可适当调大--max-tokens并相应减少--update-freq。六、引用信息mBART 的原始论文信息README 提供article{liu2020multilingual, title{Multilingual Denoising Pre-training for Neural Machine Translation}, author{Yinhan Liu and Jiatao Gu and Naman Goyal and Xian Li and Sergey Edunov and Marjan Ghazvininejad and Mike Lewis and Luke Zettlemoyer}, year{2020}, eprint{2001.08210}, archivePrefix{arXiv}, primaryClass{cs.CL} }小结本文以仓库 decoding/IAD/fairseq/examples/mbart/README.md 为核心完整还原了 mBART 从预训练模型下载、SPM 编码、fairseq-preprocess 预处理、EN-RO 微调到 sacreBLEU 评测的全流程并通过 translation_from_pretrained_bart.py 与 bart/model.py 的源码揭示了 lang token 作为 EOS、mask行截断、词典对齐等底层机制。掌握这条管线后你可以将 mBART CC25 快速迁移到其他低资源语言对或参考multilingual_denoising任务的设计在更多语言上继续预训练。【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →