
XLM-R 跨语言表示学习实战指南基于 fairseq 的 100 语言预训练模型、评测结果与推理用法【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm导读本文以 unilm 仓库中 kosmos-2/fairseq/examples/xlmr/README.md 为骨架系统讲解 XLM-RXLM-RoBERTa这一大规模自监督跨语言编码器的数据、模型家族、基准评测与推理用法并结合 model_xlmr.py、hub_interface.py 等源码还原其加载、分词与特征提取的实现原理。读完本文你将掌握如何在 fairseq 环境中加载 base/large/XL/XXL 四种规模的 XLM-R 模型完成多语言文本的编码、解码与特征抽取并理解其 SentencePiece 子词机制与下游分类头的扩展方式。一、XLM-R 是什么XLM-RXLM-RoBERTa是一个通用的跨语言句子编码器在大量跨语言理解Cross-lingual UnderstandingXLU基准上取得了领先成绩。它的核心思路是把 RoBERTa 的掩码语言建模Masked Language ModelingMLM训练范式扩展到 100 种语言不依赖任何平行语料仅通过大规模单语数据的自监督学习让模型在共享的表示空间中统一 100 种语言的信息。这一工作对应两篇论文《Unsupervised Cross-lingual Representation Learning at Scale》Conneau et al., 2019提出 XLM-R 本体训练语料规模达到 2.5T。《Larger-Scale Transformers for Multilingual Masked Language Modeling》Goyal et al., 2021将模型规模进一步放大于 2021 年 6 月发布了XLMR-XL与XLMR-XXL两个更大规模的版本。在 fairseq 的代码体系中XLM-R 与 RoBERTa 共享同一套模型实现XLMRModel直接继承自RobertaModel仅通过register_model(xlmr)注册为独立模型类型并复用了 RoBERTa 的 Hub 接口model_xlmr.py。这意味着 RoBERTa 生态中成熟的加载、推理、微调工具链可以直接平移到 XLM-R 上。二、预训练数据与 100 种语言XLM-R 在2.5T的过滤后 CommonCrawl 数据上进行预训练覆盖 100 种语言。得益于超大规模的多语言单语数据与 MLM 目标模型无需平行语料即可习得跨语言对齐的表示。完整语言列表如下LanguageLanguageLanguageLanguageLanguageAfrikaansAlbanianAmharicArabicArmenianAssameseAzerbaijaniBasqueBelarusianBengaliBengali RomanizeBosnianBretonBulgarianBurmeseBurmese zawgyi fontCatalanChinese (Simplified)Chinese (Traditional)CroatianCzechDanishDutchEnglishEsperantoEstonianFilipinoFinnishFrenchGalicianGeorgianGermanGreekGujaratiHausaHebrewHindiHindi RomanizeHungarianIcelandicIndonesianIrishItalianJapaneseJavaneseKannadaKazakhKhmerKoreanKurdish (Kurmanji)KyrgyzLaoLatinLatvianLithuanianMacedonianMalagasyMalayMalayalamMarathiMongolianNepaliNorwegianOriyaOromoPashtoPersianPolishPortuguesePunjabiRomanianRussianSanskritScottish GaelicSerbianSindhiSinhalaSlovakSlovenianSomaliSpanishSundaneseSwahiliSwedishTamilTamil RomanizeTeluguTelugu RomanizeThaiTurkishUkrainianUrduUrdu RomanizeUyghurUzbekVietnameseWelshWestern FrisianXhosaYiddish值得注意的细节列表中除了标准语种还包含Bengali Romanize、Hindi Romanize、Tamil Romanize、Telugu Romanize、Urdu Romanize等转写Romanize变体以及Burmese zawgyi font这类针对特定字体编码的变体。这种语言 书写变体的细粒度拆分是为了在词表与数据层面覆盖同一语言的不同书写形态从而提升低资源场景下的建模效果。三、预训练模型家族从 base 到 XXL 的四个规模官方提供了四种规模的预训练权重均采用 250k25 万词表的 SentencePiece 子词模型参数量从 2.5 亿跨越到 107 亿ModelDescription#paramsvocab sizexlmr.baseXLM-R using the BERT-base architecture250M250kxlmr.largeXLM-R using the BERT-large architecture560M250kxlmr.xlXLM-Rlayers36, model_dim25603.5B250kxlmr.xxlXLM-Rlayers48, model_dim409610.7B250k其中xlmr.base沿用 BERT-base 的 12 层 Transformer 编码器结构xlmr.large沿用 BERT-large 的 24 层结构是 XLM-R 原论文的主力模型xlmr.xl将层数扩到 36 层、隐层维度提到 2560参数量 35 亿xlmr.xxl进一步扩到 48 层、隐层维度 4096参数量 107 亿代表当时更大规模的跨语言 MLM 探索。从源码看这四个模型名被硬编码在XLMRModel.hub_models()的返回字典中model_xlmr.py即xlmr.base、xlmr.large、xlmr.xl、xlmr.xxl四个入口每个入口对应一个官方打包的模型归档。加载器会依据该字典自动解析模型包因此用户只需要传模型名即可完成下载与装配。四、跨语言基准评测结果4.1 XNLICross-lingual NLIXNLIConneau et al., 2018是衡量跨语言自然语言推理能力的经典基准。下表给出了不同模型在 15 个测试语言上的准确率AccModelaverageenfresdeelbgrutrarvithzhhiswurroberta.large.mnli(TRANSLATE-TEST)77.891.382.984.381.281.783.178.376.876.674.274.177.570.966.766.8xlmr.large(TRANSLATE-TRAIN-ALL)83.689.185.186.685.785.385.983.583.283.183.781.583.781.678.078.1xlmr.xl(TRANSLATE-TRAIN-ALL)85.491.187.288.187.087.487.885.385.285.386.283.885.383.179.878.2xlmr.xxl(TRANSLATE-TRAIN-ALL)86.091.587.688.787.887.488.285.685.185.886.383.985.684.681.780.6需要说明两点实验设置的含义TRANSLATE-TEST用机器翻译把测试集翻成英文后评测代表借助翻译绕开多语言理解的基线思路如roberta.large.mnliTRANSLATE-TRAIN-ALL把训练数据翻译/扩充到所有语言直接在目标语言上评测XLM-R 系列即采用该设置。可以看到仅用英文训练数据的roberta.large.mnli平均分 77.8而xlmr.large直接跨语言评测即达 83.6xlmr.xxl进一步提升到 86.0体现出大语料 大规模对跨语言泛化的显著增益。同时模型规模越大低资源语言如 sw 斯瓦希里语、ur 乌尔都语上的提升幅度也越明显。4.2 MLQAMultilingual Question AnsweringMLQALewis et al., 2018评测跨语言抽取式问答指标为 F1 / Exact MatchEM数值格式为F1/EMModelaverageenesdearhivizhBERT-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.large70.7/52.780.6/67.874.1/56.068.5/53.663.1/43.569.2/51.671.3/50.968.0/45.4xlmr.xl73.4/55.385.1/72.666.7/46.270.5/55.574.3/56.972.2/54.774.4/52.970.9/48.5xlmr.xxl74.8/56.685.5/72.468.6/48.472.7/57.875.4/57.673.7/55.876.0/55.071.7/48.9对比mBERT平均 57.7/41.6xlmr.large达到 70.7/52.7xlmr.xxl进一步升至 74.8/56.6在阿拉伯语、印地语等低资源语言上的提升尤为突出。这些结果说明跨语言表示的质量同时受语料覆盖广度与模型容量两个因素驱动这正是 XLM-R 系列从 base 一路扩到 XXL 的动机所在。五、加载与使用 XLM-R 的完整实操5.1 通过 torch.hub 加载PyTorch 1.1最便捷的加载方式是借助 PyTorch Hub。fairseq 在 hub 中注册了xlmr.large等入口首次加载会自动下载对应模型包import torch xlmr torch.hub.load(pytorch/fairseq:main, xlmr.large) xlmr.eval() # disable dropout (or leave in train mode to finetune)这里xlmr返回的是一个RobertaHubInterface对象hub_interface.py它同时持有模型、任务task与 BPE 编码器bpe对外提供encode/decode/extract_features/predict/fill_mask等统一 API。调用eval()可关闭 dropout用于特征提取与推理若想继续微调则应保持 train 模式。5.2 通过 XLMRModel.from_pretrained 加载PyTorch 1.0 或自定义场景对于 PyTorch 1.0 或需要手动管理模型文件的场景可以使用 fairseq 的显式加载方式。首先下载并解压对应模型包如xlmr.large对应的 tar 包然后在代码中加载from fairseq.models.roberta import XLMRModel xlmr XLMRModel.from_pretrained(/path/to/xlmr.large, checkpoint_filemodel.pt) xlmr.eval() # disable dropout (or leave in train mode to finetune)从源码看XLMRModel.from_pretrained是一个类方法model_xlmr.py其关键逻辑是调用fairseq.hub_utils.from_pretrained完成 checkpoint 解析、模型构建与任务构建传入archive_mapcls.hub_models()使得第一个参数除了可以是本地目录也可以是xlmr.base/xlmr.large/xlmr.xl/xlmr.xxl这样的官方模型名加载器会自动定位对应的模型归档设置bpesentencepiece即默认使用 SentencePiece 子词编码设置load_checkpoint_headsTrue允许加载 checkpoint 中附带的下游分类头最终返回封装好的RobertaHubInterface。因此实际使用中即使不手动下载也可以直接写XLMRModel.from_pretrained(xlmr.large, checkpoint_filemodel.pt)让加载器依据hub_models()自动完成下载与装配。5.3 使用 SentencePiece 对输入文本编码与解码XLM-R 采用 SentencePieceSPM子词分词。编码时每个序列以s开头、以/s结尾encode()返回 token id 张量decode()负责还原为原始文本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同一套encode/decodeAPI 可以无缝处理英语、中文、印地语、阿拉伯语、法语等多种书写系统这正是 250k 词表的 SentencePiece 模型带来的能力。token id 序列中首尾的0和2分别是sBOS与/sEOS的 id。从实现看encode()的完整流水线是hub_interface.py调用self.bpe.encode(sentence)将原始文本切分为子词序列拼上s ... /s边界标记多句输入时使用双/s作为句间分隔符通过self.task.source_dictionary.encode_line(...)把子词序列映射为 vocab id 并返回 LongTensor。而decode()hub_interface.py会剥离s、依据连续/s切分句子、逐段调用 BPE 解码最后在只有单句时直接返回字符串、多句时返回字符串列表。5.4 从 XLM-R 提取特征XLM-R 可以像 RoBERTa 一样提取任意层的上下文表示# Extract the last layers features last_layer_features xlmr.extract_features(zh_tokens) assert last_layer_features.size() torch.Size([1, 6, 1024]) # Extract all layers features (layer 0 is the embedding layer) all_layers xlmr.extract_features(zh_tokens, return_all_hiddensTrue) assert len(all_layers) 25 assert torch.all(all_layers[-1] last_layer_features)上面示例基于xlmr.large隐层维度 1024、24 层 Transformerzh_tokens长度为 6含首尾特殊 token所以单条样本的形状是[1, 6, 1024]return_all_hiddensTrue时返回全部 25 层特征embedding 层记为 layer 0再加上 24 个 Transformer 层共 25 个且最后一层与单独取末层特征严格相等。extract_features的实现细节hub_interface.py输入为 1D 张量时会自动unsqueeze(0)补上 batch 维若序列长度超过self.model.max_positions()会抛出ValueError提示超长内部以features_onlyTrue前向模型避免额外的分类头计算返回全部隐层时会把模型输出的T x B x C内部状态转置为B x T x C的标准格式。5.5 掩码填充与分类头扩展除了编码与特征提取Hub 接口还提供了两个常用的扩展能力掩码语言建模推理fill_mask输入一段含mask的文本返回 top-k 候选词及其概率hub_interface.pyxlmr.fill_mask(Hello mask world!, topk5)注册下游分类头register_classification_head为模型追加线性分类头配合predict()完成句子级分类如情感分析、XNLI 等这与 RoBERTa 微调的标准流程完全一致hub_interface.pyxlmr.register_classification_head(sentence_classifier, num_classes3) logits xlmr.predict(sentence_classifier, tokens, return_logitsTrue)六、源码结构一次加载背后的完整调用链XLM-R 在 fairseq 中的实现由三个核心文件协作完成读懂它们即可理解整个推理链路fairseq/models/roberta/model_xlmr.py定义XLMRModel以register_model(xlmr)注册声明四个官方 hub 模型入口并实现from_pretrained类方法。由于它直接继承RobertaModel模型主体Transformer 编码器、BERT 式初始化、classification_heads模块字典全部复用 RoBERTa 的实现model.py。fairseq/models/roberta/hub_interface.py定义RobertaHubInterface是用户与模型交互的统一门面。它把cfg配置、task任务与model模型封装在一起对外暴露encode、decode、extract_features、fill_mask、predict、register_classification_head等全部常用 API。fairseq/data/encoders/sentencepiece_bpe.py实现SentencepieceBPE编码器。其encode调用了sentencepiece库的SentencePieceProcessor进行子词切分默认不启用采样可通过sentencepiece_enable_sampling与sentencepiece_alpha开启以支持子词正则化训练decode则将\u2581空格符还原为真实空格。XLM-R 的from_pretrained默认bpesentencepiece因此加载时自动装配的就是这一编码器。整体数据流可以概括为文本 → SentencePiece 切词 → 词典编码为 id → Transformer 编码器前向 → 取指定层特征/接分类头。由于XLMRModel与RobertaModel同构上述任意 API 都可以直接平移到 RoBERTa 或 CamemBERT 等姊妹模型上这也是 fairseq 中一个 Hub 接口、多模型复用的设计体现。七、引用如果在研究中使用 XLM-R请引用以下两篇论文article{conneau2019unsupervised, title{Unsupervised Cross-lingual Representation Learning at Scale}, author{Conneau, Alexis and Khandelwal, Kartikay and Goyal, Naman and Chaudhary, Vishrav and Wenzek, Guillaume and Guzm{\a}n, Francisco and Grave, Edouard and Ott, Myle and Zettlemoyer, Luke and Stoyanov, Veselin}, journal{arXiv preprint arXiv:1911.02116}, year{2019} }article{goyal2021larger, title{Larger-Scale Transformers for Multilingual Masked Language Modeling}, author{Goyal, Naman and Du, Jingfei and Ott, Myle and Anantharaman, Giri and Conneau, Alexis}, journal{arXiv preprint arXiv:2105.00572}, year{2021} }小结XLM-R 用 2.5T 单语数据与掩码语言建模这一简单目标在 100 种语言上训练出了强泛化的跨语言编码器从 base 到 XXL 的规模扩展又在 XNLI、MLQA 等基准上持续刷新了跨语言迁移的上限。借助 fairseq 中XLMRModel与RobertaHubInterface的成熟实现无论是通过 torch.hub 一行加载、手动from_pretrained装配还是提取多语言句向量、注册下游分类头你都可以快速把 XLM-R 接入自己的多语言 NLP 流水线。若需深入调试建议直接阅读上述三个源码文件并结合本文给出的 API 逐步验证编码、解码与特征提取的中间结果。【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考