深入解析 Transformers 中的 XLM 模型:跨语言预训练原理、配置与任务头实战

发布时间:2026/9/9 12:43:22
深入解析 Transformers 中的 XLM 模型:跨语言预训练原理、配置与任务头实战 深入解析 Transformers 中的 XLM 模型跨语言预训练原理、配置与任务头实战【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformersXLMCross-lingual Language Model是 Facebook AI 提出、并已在 Hugging Face Transformers 中完整落地的跨语言预训练模型它通过因果语言建模CLM、掩码语言建模MLM与翻译语言建模TLM三种目标让单一模型可以同时服务多种语言的编码与理解任务。本篇以 XLM 官方文档 为骨架结合当前仓库中 XLM 的 配置类、分词器 与 模型实现 源码讲解如何用 Pipeline、AutoModel 快速上手并逐项解读XLMConfig、XLMTokenizer与各类任务头分类、抽取式问答、多项选择、序列标注、语言模型的用法与底层原理。一、XLM 模型概览从跨语言预训练到多语言任务XLM 论文于 2019-01-22 发布在 HF papers 上并在 2020-11-16 被贡献到 Hugging Face Transformers。其核心思路是用跨语言预训练目标打破语言边界具体包含两条技术路线无监督的单语预训练只使用单语数据通过掩码语言建模MLM等目标学习语言内部的表示有监督的多语预训练使用两种及以上语言的平行语料通过翻译语言建模TLM目标训练TLM 是 BERT 掩码语言建模目标向多语言输入的扩展——模型会看到来自不同语言的平行片段并依据其他语言提供的上下文预测被掩码的词从而让语言间共享上下文知识。因此 XLM 模型原生支持三类目标因果语言建模causal language modeling对应causal配置项、掩码语言建模masked language modeling以及翻译语言建模translation language modeling即 MLM 的多语言扩展。所有原始 XLM 检查点托管在 Facebook AI 社区典型模型包括FacebookAI/xlm-mlm-en-2048英语、2,048 维等。在 Transformers 中XLM 的完整代码位于 src/transformers/models/xlm/ 目录包含文件职责configuration_xlm.pyXLMConfig配置类tokenization_xlm.pyXLMTokenizerBPE 分词器modeling_xlm.pyXLMModel及全部任务头模型convert_xlm_original_pytorch_checkpoint_to_pytorch.py官方原始检查点转换脚本在下文中凡涉及跨语言分类、翻译、问答等任务的更多用法都可以围绕上述两个任务族的官方模型xlm-mlm-*与xlm-clm-*展开。二、快速上手三分钟完成掩码词预测文档给出了三种使用路径Pipeline、AutoModelAutoTokenizerAutoModelForMaskedLM以及命令行。下面先复现文档示例再做源码级解读。2.1 方式一使用 Pipelinefrom transformers import pipeline pipeline pipeline( taskfill-mask, modelfacebook/xlm-roberta-xl, device0 ) pipeline(Bonjour, je suis un modèle mask.)device0表示将模型放到第一块 GPU 上运行。fill-mask任务要求输入的句子中包含掩码 tokenpipeline 会输出多个候选词的分数与预测。2.2 方式二使用 AutoModel 与 AutoTokenizerimport torch from transformers import AutoModelForMaskedLM, AutoTokenizer tokenizer AutoTokenizer.from_pretrained( FacebookAI/xlm-mlm-en-2048, ) model AutoModelForMaskedLM.from_pretrained( FacebookAI/xlm-mlm-en-2048, device_mapauto, ) inputs tokenizer(Hello, Im a mask model., return_tensorspt).to(model.device) with torch.no_grad(): outputs model(**inputs) predictions outputs.logits.argmax(dim-1) predicted_token tokenizer.decode(predictions[0][inputs[input_ids][0] tokenizer.mask_token_id]) print(fPredicted token: {predicted_token})几个值得注意的细节device_mapauto会自动将模型分配到可用设备CPU/GPU因此后续需要把输入inputs通过.to(model.device)移到与模型相同的设备上解码预测词时先通过tokenizer.mask_token_id定位input_ids中掩码 token 所在的位置再对该位置的 logits 做argmaxXLM 的掩码 token 默认是special1见下文XLMTokenizer部分XLMTokenizer会自动在词表中识别它。2.3 方式三命令行文档同时提示可直接点击右侧模型列表中的 XLM 模型查看将 XLM 应用于分类、翻译、问答等跨语言任务的更多示例也可以通过transformers-cli环境运行同类命令。三、XLMConfig逐项拆解配置参数XLMConfig继承自PreTrainedConfig源码定义于 configuration_xlm.py。它的model_type xlm并定义了到通用命名空间的attribute_map例如把hidden_size映射到emb_dim、num_attention_heads映射到n_heads、num_hidden_layers映射到n_layers、n_words映射到vocab_size、bos_index/eos_index/pad_index分别映射到bos_token_id/eos_token_id/pad_token_id——这意味着在外部以通用参数名如hidden_size传参时会被自动映射到 XLM 的原生参数。从 配置类 可以看到完整默认值下面分四类说明。3.1 结构与激活参数默认值说明vocab_size30145词表大小原生名n_wordsemb_dim2048词嵌入与隐层维度即通用hidden_sizen_layers12Transformer 层数通用num_hidden_layersn_heads16注意力头数通用num_attention_heads要求emb_dim可被n_heads整除dropout0.1全连接层与残差路径的 dropout 比例attention_dropout0.1注意力权重上的 dropout 比例gelu_activationTrue是否使用 GELU 激活为False时使用 ReLUlayer_norm_eps1e-12LayerNorm 的 epsiloninit_std0.02权重初始化标准差max_position_embeddings512位置嵌入最大长度3.2 编码器/解码器与注意力形态参数默认值说明causalFalse是否以因果方式运行。若为True使用三角注意力掩码即每个位置只能看到左侧上下文而非双向上下文is_encoderTrue初始化为 Transformer 编码器还是解码器。注意当前 XLMModel 在构造解码器时会直接抛出NotImplementedError即现阶段 XLM 只能作为编码器使用sinusoidal_embeddingsFalse是否使用正弦位置嵌入Vaswani et al. 方式替代可学习绝对位置嵌入。仓库测试中有专门用例test_modeling_xlm.py 中XLMConfig(sinusoidal_embeddingsTrue)验证该开关3.3 多语言相关参数默认值说明n_langs1模型支持的语言数量单语模型设为 1use_lang_embTrue是否使用额外的语言嵌入。当n_langs 1时模型会维护一张n_langs × emb_dim的lang_embeddings表单语场景不会创建该表lang_id0生成文本时指定的目标语言 ID配合mask_token_id使用见 3.4在模型前向实现中可以看到词嵌入之后按顺序叠加位置嵌入、语言嵌入当传入langs且n_langs 1且use_lang_emb为真时、token type 嵌入最后过 LayerNorm 与 dropout。语言嵌入由词级张量langs形状(batch_size, sequence_length)逐位置索引——这意味着同一句话里可以按 token 粒度混合多种语言。3.4 特殊 token 索引、初始化与序列摘要summary参数默认值说明unk_index3词表中未知 token 的索引mask_index5词表中掩码 token 的索引mask_token_id0模型无关参数用于在 MLM 语境中生成文本时标记被掩码的位置pad_token_id2padding token IDbos_token_id0序列开始 token IDeos_token_id1序列结束 token IDembed_init_std2048^-0.5初始化嵌入矩阵时截断正态分布的标准差tie_word_embeddingsTrue是否将输出预测层与输入嵌入权重绑定summary_typefirst序列摘要方式last取最后 tokenXLNet 风格、first取首 tokenBERT 风格、mean所有 token 均值、cls_index按给定分类 token 位置取值、attn预留用多头注意力暂未实现summary_use_projTrue向量提取后是否再接一层投影summary_activation无传tanh时对输出做 tanh 激活其它值不激活summary_proj_to_labelsTrue投影输出维度取num_labels还是hidden_sizesummary_first_dropout0.1投影与激活之后的 dropout 比例start_n_top5SQuAD 评估脚本中用到的起始位置 beam 数end_n_top5SQuAD 评估脚本中用到的结束位置 beam 数其中start_n_top/end_n_top与 SQuAD 风格的抽取式问答输出直接相关见第六节XLMForQuestionAnswering的输出字段。summary_*系列参数则由分类与多项选择模型的XLMSequenceSummary模块消费。四、XLMTokenizerBPE 与多语言分词管线XLMTokenizer基于 Byte-Pair EncodingBPE其内部使用vocab.json词表与merges.txt合并规则两个文件见 tokenization_xlm.py。它继承自PreTrainedTokenizer绝大多数主方法由父类提供自身重点实现了分词细节与特殊 token 逻辑。4.1 完整分词管线分词过程遵循以下步骤源码注释对大部分受支持语言使用Moses 预处理与分词通过sacremoses库必须先pip install sacremoses否则会抛出 ImportError对中zh、日ja、泰th语使用语言专属分词器中文默认使用rjieba日文使用MykyteaKyTea 的 Python 封装泰文使用pythainlp可选地对全部输入执行小写化与去重音do_lowercase_and_remove_accentTrue时通过 NFD 归一化丢弃Mn类别字符即组合变音符对已分词结果执行BPE 子词切分词末用/w标记词边界支持用special_tokens参数与set_special_tokens方法向词表追加额外符号例如__classify__。在_tokenize方法中源码可以看到语言代码不是zh/th/ja时走 Moses 管线其中罗马尼亚语ro会额外应用romanian_preprocessing对应FacebookAI/xlm-mlm-enro-1024检查点。bypass_tokenizerTrue时只按空格切分并直接进入 BPE方便用户使用 XLM 原始预处理脚本在外部完成分词后接入。4.2 语言映射与特殊 tokenlang2id把语言名映射为 ID 的字典id2lang反向映射。两者对多语预训练词表会自动加载例如FacebookAI/xlm-mlm-100的config.lang2id/config.id2lang会完整覆盖其支持的 100 种语言。构造 tokenizer 时两者必须等长源码中有assert len(lang2id) len(id2lang)。默认特殊 token 约定unk_tokenunk、bos_tokens、sep_token/s、pad_tokenpad、cls_token/s、mask_tokenspecial1并预置special0~special9十个额外特殊 token。这也是为什么预训练模型把special1当作掩码符号——模型配置中的mask_index5与分词器的掩码 token 定义在加载预训练词表后保持一致。4.3 特殊 token 拼装格式build_inputs_with_special_tokens定义了两类序列格式源码单序列s X /s序列对s A /s B /s对应地get_special_tokens_mask会为上述格式返回1/0掩码1表示特殊 tokensave_vocabulary则会把vocab.json与merges.txt保存到指定目录供再次加载或共享使用。五、XLMModel 与 XLMWithLMHeadModel模型结构与前向原理5.1 XLMModel编码器主体XLMModel源码在__init__中按如下结构搭建嵌入层position_embeddingsmax_position_embeddings × emb_dim、可选的lang_embeddingsn_langs × emb_dim仅n_langs 1且use_lang_embTrue时创建、embeddings词嵌入n_words × emb_dim以pad_index作为 padding index以及嵌入后的layer_norm_embTransformer 层堆叠每层依次为MultiHeadAttention后接layer_norm1与TransformerFFN后接layer_norm2采用 Pre-LN 风格残差FFN 隐藏维度取emb_dim * 4前向时默认按(input_ids ! pad_index)求和得到各句长度lengths再由工具函数get_masks生成掩码causalFalse时注意力掩码与 padding 掩码一致causalTrue时生成形状(batch, slen, slen)的下三角掩码get_masks。前向输入除了input_ids/attention_mask/inputs_embeds等通用字段外还有两个 XLM 特色参数langs形状(batch_size, sequence_length)的语言 ID 张量按词级为每个 token 指定语言ID 可由model.config.lang2id语言名 → ID与model.config.id2langID → 语言名互转lengths形状(batch_size,)的句长张量可避免在 padding 位置计算注意力attention_mask可以达到同样效果此参数仅为兼容原版 XLM 保留。从结构还可以推断XLM 的注意力单元支持 K/V 缓存前向签名包含cache这为以掩码生成方式做解码加速预留了接口。默认返回BaseModelOutputlast_hidden_state、可选hidden_states、attentions也可以return_dictFalse得到元组。5.2 XLMWithLMHeadModel语言模型头XLMWithLMHeadModel源码在编码器之上叠加XLMPredLayer作为预测头当config.asmFalse默认时预测层是一个线性投影nn.Linear(emb_dim, n_words)且通过_tied_weights_keys与输入嵌入权重绑定共享词嵌入tie_word_embeddings当config.asmTrue时使用AdaptiveLogSoftmaxWithLoss自适应 log-softmax 投影替代线性层用于超大词表场景的高效 softmax。因为 XLM 生成属于掩码填充式masked 自编码式而非自回归式prepare_inputs_for_generation源码会在输入末尾自动追加一个mask_token_id的掩码 token并用config.lang_id填充对应位置的langs——这样解码器只需预测该掩码位置即可这也是配置中mask_token_id与lang_id的用武之地。前向时labels会在模型内部完成移位也就是说可以直接传labelsinput_ids-100位置的 label 会被忽略、不计入 loss。logits_to_keep参数允许只对最后若干位置计算 logits以节约显存。六、XLM 的下游任务头族文档中还列出了覆盖常见 NLP 任务的各任务头模型它们共享同一个XLMModel主干只是顶部分别换成序列摘要、分类或指针式抽取头。测试文件 tests/models/xlm/test_modeling_xlm.py 同时验证了这些类与 pipeline 的映射关系模型类对应 Pipeline 任务头结构说明XLMModelfeature-extraction纯编码器输出 token 级隐状态XLMWithLMHeadModelfill-mask、text-generation掩码预测线性头 / 自适应 softmaxXLMForSequenceClassificationtext-classification、zero-shotXLMSequenceSummary池化 线性分类层适配 GLUE 类任务XLMForMultipleChoice—对每个选项独立编码后经序列摘要打分XLMForTokenClassificationtoken-classification直接在最后一层隐状态上接线性分类层XLMForQuestionAnsweringSimple—简单的起止位置 pointer 抽取头XLMForQuestionAnswering—SQuAD 2.0 风格头输出束搜索式的 top-k 起止位置与is_impossible判断6.1 序列分类GLUE 风格XLMForSequenceClassification源码把编码器输出交给XLMSequenceSummary其行为完全由summary_type、summary_use_proj、summary_activation、summary_first_dropout等配置决定再做线性投影。文档注释明确指出它适配 GLUE 类任务支持num_labels个分类类别传入labels时用交叉熵或 MSE用于回归计算 loss。6.2 抽取式问答Simple 与 SQuAD 两种形态仓库中保留了两套问答头XLMForQuestionAnsweringSimple输入start_positions/end_positions计算标准抽取式问答 loss输出为通用QuestionAnsweringModelOutputXLMForQuestionAnswering为 SQuAD 2.0 设计的带束搜索 top-k 变体输出专用结构XLMForQuestionAnsweringOutput源码。当不提供起止位置标注时该输出包含以下字段这也是 XLM 独有的 output 类型start_top_log_probs形状(batch, start_n_top)束搜索得到的 top-k 起始位置对数概率start_top_indextop-k 起始位置索引end_top_log_probs形状(batch, start_n_top * end_n_top)top-k 结束位置对数概率end_top_indextop-k 结束位置索引cls_logits形状(batch,)答案is_impossible问题无答案的对数概率loss当同时提供start_positions、end_positions以及可选的is_impossible时为起始、结束以及不可回答分类损失之和。6.3 Token 分类与多项选择XLMForTokenClassification对每个 token 做分类适合命名实体识别NER、词性标注等序列标注任务输出TokenClassifierOutputXLMForMultipleChoiceforward接收多个选项的输入与labels输出MultipleChoiceModelOutput适合多项选择阅读理解。七、从源码与测试中验证的工程要点Pipeline 支持面测试文件 test_modeling_xlm.py 中把feature-extraction、fill-mask、text-classification、text-generation、token-classification、zero-shot六类任务与上述模型一一对应说明 XLM 可以直接在这些标准 pipeline 中使用端到端可用性同文件还包含XLMModelLanguageGenerationTest使用FacebookAI/xlm-mlm-en-2048实测语言生成以及XLMModelTest对正弦位置嵌入等配置开关的专项用例社区检查点导入若持有官方 XLM 原始 PyTorch 检查点可借助 convert_xlm_original_pytorch_checkpoint_to_pytorch.py 中的convert_xlm_checkpoint_to_pytorch函数完成格式转换配置项对照XLMConfig的attribute_map使模型可以兼容 BERT 等模型通用的hidden_size/num_hidden_layers/num_attention_heads/vocab_size参数名降低从其他架构迁移的成本。八、小结与使用建议回顾全篇XLM 在 Transformers 中的正确打开方式可归纳为四点选模型纯单语如xlm-mlm-en-2048直接用于英语的 MLM/分类多语如xlm-mlm-100进行跨语言迁移或零样本评测配分词使用多语模型时注意让XLMTokenizer自动加载lang2id/id2lang并按需传入词级langs张量才能吃到语言嵌入调结构通过XLMConfig控制激活函数、位置嵌入、注意力形态与summary_type并按需开启asm自适应 softmax 处理超大词表选任务头文本分类走XLMForSequenceClassification配 zero-shot pipeline 可做零样本分类序列标注走XLMForTokenClassification抽取式问答按是否需要 SQuAD 束搜索输出在Simple与完整版之间选择生成类任务则由XLMWithLMHeadModel承担。如果要在多语环境下微调或推理请记住一个前提当前仓库中的XLMModel只支持编码器形态构造解码器会触发NotImplementedError因此凡是需要自回归解码的用法都应把 XLM 当作掩码填充式语言模型来使用这也正是prepare_inputs_for_generation会自动补mask_token_id的原因。【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询