ARTICLE DETAIL

建站实战干货

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

XLM-R(XLM-RoBERTa)大规模无监督跨语言表示学习:模型架构、基准评测与 fairseq 实战指南

2026/9/13 19:21:14 拓冰建站 浏览量
XLM-R(XLM-RoBERTa)大规模无监督跨语言表示学习:模型架构、基准评测与 fairseq 实战指南 XLM-RXLM-RoBERTa大规模无监督跨语言表示学习模型架构、基准评测与 fairseq 实战指南【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm导读本文基于 infoxlm/fairseq/examples/xlmr/README.md 展开系统梳理 XLM-RXLM-RoBERTa这一大规模跨语言句子编码器的核心内容从 2.5T 语料、100 种语言的预训练背景到 base/large 两档模型的配置与加载再到 torch.hub 一键调用、SentencePiece 编码、多层特征提取等完整实战流程。同时结合本仓库 fairseq 源码model.py、hub_interface.py深入解析XLMRModel的实现原理与各 API 的底层调用链。读完本文你将掌握 XLM-R 在 fairseq 中的完整加载、编码、特征提取与下游微调方法。背景从 RoBERTa 到跨语言的 XLM-RXLM-RXLM-RoBERTa是 fairseq 提供的规模化跨语言句子编码器。与单语 RoBERTa 不同XLM-R 在2.5T2.5 万亿 token规模的多语言数据上进行无监督预训练数据覆盖100 种语言语料从 Common Crawl 中过滤得到。这种大规模 多语言的无监督训练策略使其在多个跨语言基准上取得当时领先的结果——这也是Unsupervised Cross-lingual Representation Learning at Scale大规模无监督跨语言表示学习这一名称的由来。从本仓库的代码结构看XLM-R 是 fairseq 中 RoBERTa 体系的直接延伸。model.py 中定义register_model(xlmr) class XLMRModel(RobertaModel): classmethod def hub_models(cls): return { xlmr.base.v0: http://dl.fbaipublicfiles.com/fairseq/models/xlmr.base.v0.tar.gz, xlmr.large.v0: http://dl.fbaipublicfiles.com/fairseq/models/xlmr.large.v0.tar.gz, }即XLMRModel直接继承RobertaModel核心差异在于注册名不同、hub 模型映射不同、from_pretrained默认使用bpesentencepiece而 RoBERTa 默认是 GPT-2 BPE。这决定了 XLM-R 在分词层面依赖 SentencePiece 模型SPM来处理上百种语言的共享词表。预训练模型一览原文档给出了两档官方预训练权重配置与规模如下Model描述参数量词表大小权重包xlmr.base.v0采用 BERT-base 架构的 XLM-R250M250kxlmr.base.v0.tar.gzxlmr.large.v0采用 BERT-large 架构的 XLM-R560M250kxlmr.large.v0.tar.gz两点说明两档模型的词表大小均为250k25 万这是支撑 100 种语言共享表示的关键设计原文档提示这两个 v0 权重发布时仍在训练中后续会更新权重论文报告的结果基于上述 checkpoint 得出。架构细节可以从源码中的register_model_architecture定义精确还原model.py架构encoder_layersencoder_embed_dimencoder_ffn_embed_dimattention_headsroberta_base12768307212roberta_large241024409616这印证了BERT-base / BERT-large 架构的说法base 对应 12 层 Transformer 编码器、隐层 768、FFN 3072、12 个注意力头large 对应 24 层、隐层 1024、FFN 4096、16 个注意力头。同时base_architecture中默认activation_fngelu、pooler_activation_fntanh、dropout0.1、attention_dropout0.1均为 RoBERTa 体系的经典配置。跨语言基准评测结果原文档给出了 XLM-R large 在两大经典跨语言基准上的表现。XNLIConneau et al., 2018跨语言自然语言推断XNLI 评测表15 种语言 平均中xlmr.large.v0采用TRANSLATE-TRAIN-ALL策略用全部语言训练与roberta.large.mnli的TRANSLATE-TEST策略对比Modelavgenfresdeelbgrutrarvithzhhiswurroberta.large.mnliTRANSLATE-TEST77.891.382.984.381.281.783.178.376.876.674.274.177.570.966.766.8xlmr.large.v0TRANSLATE-TRAIN-ALL82.488.785.285.684.683.685.582.481.680.983.480.983.379.875.974.3可以看到XLM-R 在平均分上领先单语 RoBERTa 4.6 个点且在低资源语言如斯瓦希里语 sw、乌尔都语 ur上的优势更为明显——这正是大规模多语言预训练价值的直接体现。MLQALewis et al., 2018多语言问答MLQA 使用 F1/EM精确匹配双指标评测 7 种语言ModelavgenesdearhivizhBERT-large-80.2/67.4------mBERT57.7/41.677.7/65.264.3/46.657.9/44.345.7/29.843.8/29.757.1/38.657.5/37.3xlmr.large.v070.0/52.280.1/67.773.2/55.168.3/53.762.8/43.768.3/51.070.5/50.167.1/44.4XLM-R 在平均 F1/EM70.0/52.2上显著超越多语言 BERTmBERT的 57.7/41.6验证了更大规模语料与更大词表对跨语言迁移能力的提升。加载 XLM-R 模型两种方式原文档给出了两种加载路径适用于不同的 PyTorch 版本与使用场景。方式一从 torch.hub 加载PyTorch 1.1import torch xlmr torch.hub.load(pytorch/fairseq, xlmr.large.v0) xlmr.eval() # disable dropout (or leave in train mode to finetune)xlmr.eval()用于关闭 dropout若保留在训练模式不调用 eval则可直接继续微调。其背后正是XLMRModel.hub_models()提供的 hub 映射表model.pyxlmr.base.v0与xlmr.large.v0分别指向对应的权重压缩包。方式二手动下载权重后从本地加载PyTorch 1.0 或自定义模型# 下载 xlmr.large 模型 wget https://dl.fbaipublicfiles.com/fairseq/models/xlmr.large.v0.tar.gz tar -xzvf xlmr.large.v0.tar.gzfrom fairseq.models.roberta import XLMRModel xlmr XLMRModel.from_pretrained(/path/to/xlmr.large.v0, checkpoint_filemodel.pt) xlmr.eval() # disable dropout (or leave in train mode to finetune)从源码看XLMRModel.from_pretrainedmodel.py会调用hub_utils.from_pretrained默认bpesentencepiece、load_checkpoint_headsTrue并返回一个RobertaHubInterface实例hub_interface.py。这个接口对象内部持有args、task、model三部分并基于encoders.build_bpe(args)构建 BPE 编码器同时注册一个_float_tensorbuffer 以便随时查询模型所在设备xlmr.device。使用 SPM 编码器处理输入文本加载模型后第一步是把原始文本转成 token 序列。encode方法内部hub_interface.py会执行 SentencePiece 分词、拼装特殊符号再通过task.source_dictionary.encode_line映射为整数索引每个序列以句首符号s开头以句尾符号/s结尾格式为s ... /s多句输入句子对时用额外的/s作为分隔符即s d e f /s /s 1 2 3 /s。原文档给出的多语言编码示例含断言验证en_tokens xlmr.encode(Hello world!) assert en_tokens.tolist() [0, 35378, 8999, 38, 2] xlmr.decode(en_tokens) # Hello world! zh_tokens xlmr.encode(你好世界) assert zh_tokens.tolist() [0, 6, 124084, 4, 3221, 2] xlmr.decode(zh_tokens) # 你好世界 hi_tokens xlmr.encode(नमस्ते दुनिया) assert hi_tokens.tolist() [0, 68700, 97883, 29405, 2] xlmr.decode(hi_tokens) # नमस्ते दुनिया ar_tokens xlmr.encode(مرحبا بالعالم) assert ar_tokens.tolist() [0, 665, 193478, 258, 1705, 77796, 2] xlmr.decode(ar_tokens) # مرحبا بالعالم fr_tokens xlmr.encode(Bonjour le monde) assert fr_tokens.tolist() [0, 84602, 95, 11146, 2] xlmr.decode(fr_tokens) # Bonjour le monde几个值得注意的细节英文、法语等使用拉丁字母的语言SPM 将单词切为子词如Hello - 35378、world - 8999标点独立成 token中文整句你好世界被切为[6, 124084, 4, 3221]其中 6 与 4 对应中文标点类 token说明 XLM-R 的词表对中文按子词/字符粒度覆盖印地语天城文、阿拉伯语阿拉伯文同样得到有效的 token 化体现 250k 共享词表对多文字系统的支持decode是encode的逆过程hub_interface.py先去除s再根据连续两个/s判断文档边界做切分逐段反解码单句返回字符串多句返回列表。从 XLM-R 提取特征extract_features是 XLM-R 用于下游任务的核心 API。原文档示例# 提取最后一层特征 last_layer_features xlmr.extract_features(zh_tokens) assert last_layer_features.size() torch.Size([1, 6, 1024]) # 提取所有层特征layer 0 为 embedding 层 all_layers xlmr.extract_features(zh_tokens, return_all_hiddensTrue) assert len(all_layers) 25 assert torch.all(all_layers[-1] last_layer_features)特征形状的深层含义中文输入你好世界编码后为 6 个 token所以特征张量为[1, 6, 1024]1为 batch 维6为序列长度含s与/s1024是 large 模型的隐层维度return_all_hiddensTrue时返回25 层特征即 1 层 embeddinglayer 0 24 层 Transformer 编码器与 large 架构的encoder_layers24完全对应all_layers[-1]与last_layer_features相等验证了最后一层特征 不返回中间状态时的默认输出这一行为。从源码看hub_interface.pyextract_features会将一维 token 序列升维为(1, seq_len)校验序列长度不超过model.max_positions()即args.max_positions以features_onlyTrue调用模型前向跳过 LM 头只取编码器输出若return_all_hiddensTrue将内部状态从T x B x C转置为B x T x C后逐层返回。对应的编码器前向逻辑在RobertaEncoder.forwardmodel.pyfeatures_onlyFalse时会把特征送入RobertaLMHead做词表投影得到 MLM logitsfeatures_onlyTrue时直接返回(batch, src_len, embed_dim)的隐藏表示。深入源码XLM-R 的编码器与初始化RobertaEncodermodel.py是 XLM-R 的骨干实现内部使用 fairseq 的TransformerSentenceEncoder并采用 BERT 风格的关键设置num_segments0不使用 segment 嵌入RoBERTa 体系的特征之一encoder_normalize_beforeTrue在子层前做 LayerNormpre-normapply_bert_initTrue应用 BERT 式随机初始化LM 头的权重与embed_tokens词嵌入共享参数weightself.sentence_encoder.embed_tokens.weight。RobertaModel.__init__中还有一处重要细节self.apply(init_bert_params)model.py即整个模型遵循 BERT 的随机初始化方案这是 RoBERTa/XLM-R 与原始 Transformer 初始化习惯的差异点。此外模型还支持 LayerDrop 与层剪枝add_args中定义了--encoder-layerdrop默认 0和--encoder-layers-to-keep当传入--encoder-layers-to-keep时RobertaEncoder会把encoder_layers改为保留的层数并将同一列表赋给decoder_layers_to_keep实现按需裁剪层数的灵活部署model.py。进阶用法分类头与掩码填空除了特征提取RobertaHubInterface还提供了下游微调与推理的现成接口可与原文档的训练模式微调提示配合使用。注册分类头并预测xlmr.register_classification_head(sentence_classification, num_classes2) logits xlmr.predict(sentence_classification, tokens, return_logitsTrue)register_classification_headhub_interface.py最终调用RobertaModel.register_classification_headmodel.py生成一个RobertaClassificationHead其前向model.py取序列首 tokens等价于 BERT 的[CLS]的特征经过dense - activation(tanh) - dropout - out_proj输出各类别 logits。predict默认返回log_softmax概率return_logitsTrue时返回原始 logits。掩码语言模型填空xlmr.fill_mask(He is a mask guy, topk5)fill_maskhub_interface.py实现掩码词预测将输入按mask切分后编码定位mask_idx位置以features_onlyFalse前向获得词表 logits取softmax后返回 top-k 的补全结果每个结果含补全文本、概率值与预测 token可直接用于零样本的完形填空评测。生态衔接XLM-R 与 InfoXLMXLM-R 在本仓库中还有一层特殊身份它是 InfoXLM 系列模型的基础。根据 infoxlm/README.md 的说明InfoXLM、XLM-Align 等模型与 XLM-R使用完全相同的词表、分词器和架构因此微调时只需把模型名从xlm-roberta-base换成对应模型即可复用全部 XLM-R 的微调代码。同时InfoXLM 的数据预处理也直接复用 XLM-R 的dict.txt即 XLM-R 的 250k 词表文件这从侧面说明本 README 讲解的 XLM-R 是整个跨语言预训练技术栈的地基。引用若在研究中使用了 XLM-R请按以下 BibTeX 引用来自原文档article{, title {Unsupervised Cross-lingual Representation Learning at Scale}, author {Alexis Conneau and Kartikay Khandelwal and Naman Goyal and Vishrav Chaudhary and Guillaume Wenzek and Francisco Guzm\an and Edouard Grave and Myle Ott and Luke Zettlemoyer and Veselin Stoyanov }, journal{}, year {2019}, }小结模型与数据XLM-R 在 2.5T 语料、100 种语言上无监督预训练提供 base250M/ large560M两档权重共享 250k 词表基准表现在 XNLI82.4 平均分TRANSLATE-TRAIN-ALL与 MLQA70.0/52.2 平均 F1/EM上均领先当时基线快速上手torch.hub.load(pytorch/fairseq, xlmr.large.v0)或XLMRModel.from_pretrained(...)两种方式均可加载配合encode/decode/extract_features完成编码与特征提取实现原理XLMRModel继承RobertaModel编码器为TransformerSentenceEncoder的 BERT 风格配置SPM 分词 共享词表是支撑百语言的关键相关实现可在 model.py 与 hub_interface.py 中进一步研读。【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考