ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

深入解析 X-MOD:基于语言 Adapter 的模块化多语言 Transformer(Hugging Face Transformers 实践指南)

深入解析 X-MOD:基于语言 Adapter 的模块化多语言 Transformer(Hugging Face Transformers 实践指南) 深入解析 X-MOD基于语言 Adapter 的模块化多语言 TransformerHugging Face Transformers 实践指南【免费下载链接】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导读X-MODCross-lingual Modular Transformer是 Meta AI 提出的一种模块化多语言预训练模型其核心创新是在共享 Transformer 主干之外为每一种语言配置独立的轻量语言适配器language adapter从而在预训练阶段就从根源上缓解多语言模型的多语言诅咒curse of multilinguality。本篇文章以 xmod.md 为主线结合 modeling_xmod.py、configuration_xmod.py 与 test_modeling_xmod.py 的源码实现完整讲解在 Transformers 中使用 X-MOD 进行推理、微调、跨语言迁移的步骤与原理读完你将掌握如何指定输入语言、如何冻结 Embedding 与语言 Adapter、如何验证零样本跨语言迁移并理解其底层模块化结构。一、X-MOD 是什么从多语言诅咒到模块化设计1.1 动机与背景传统的多语言预训练模型如 XLM-R在覆盖语言数量不断增多时会出现多语言诅咒受限于固定的模型容量语言之间互相干扰、抢占参数导致每种语言的平均表现随语言覆盖范围扩大而下降。X-MOD 的论文提出了一种解决方法——在预训练阶段就为模型引入语言专属的模块化组件语言适配器而不是像后续的 MAD-X 等方案那样在预训练完成后事后补学语言模块。其核心收益由论文摘要总结为三点在总模型容量增长的同时保持每种语言可训练参数数量不变在多语言自然语言推理NLI、命名实体识别NER与问答QA实验中既缓解了语言间的负向干扰又促成了正向迁移positive transfer提升了单语与跨语言表现支持事后追加新语言而不产生可测得的性能回退模型使用不再被限定在预训练语言集合内。从源码结构看X-MOD 的整体骨架与 XLM-R/BERT 高度相似XmodEmbeddings、XmodSelfAttention等大量模块直接标注 Copied from transformers.models.roberta...差异核心在于每一层 Transformer 块中注入的XmodAdapter语言模块与配套的配置字段。Hugging Face 端对该模型的贡献者是 jvamvas原始实现基于 fairseq。1.2 在仓库中的落地位置当前仓库中 X-MOD 的实现集中在一个目录下可以对照阅读模型代码src/transformers/models/xmod/modeling_xmod.py约 1386 行含全部 6 个任务头配置类src/transformers/models/xmod/configuration_xmod.py官方 checkpoint 转换脚本src/transformers/models/xmod/convert_xmod_original_pytorch_checkpoint_to_pytorch.py完整测试套件tests/models/xmod/test_modeling_xmod.pyfrom transformers import XmodConfig, XmodModel # 以 facebook/xmod-base 风格的配置初始化随机权重 configuration XmodConfig() model XmodModel(configuration) configuration model.config # 访问模型配置二、使用要点Usage Tips与 XLM-R 的差异在于必须告知输入语言X-MOD 的每一层都维护多个语言 Adapter模型必须知道当前样本属于哪种语言才能激活正确的 Adapter。这与 XLM-R 开箱即用不区分语言的行为形成关键区别。主模型覆盖 81 种语言base 与 large 两个主模型为 81 种语言各配备一个 Adapter语言代码采用类似en_XX、de_DE的格式。可以当编码器也可以当解码器用配置中is_decoderTrue即可加入因果掩码与跨注意力add_cross_attentionTrue时进一步支持 Seq2Seq 场景见 modeling_xmod.py 的文档说明。三、XmodConfig 核心配置与默认值X-MOD 的配置在 configuration_xmod.py 中定义。除继承自 BERT/XLM-R 风格的结构参数如hidden_size768、num_hidden_layers12、num_attention_heads12、intermediate_size3072、hidden_actgelu、vocab_size30522、max_position_embeddings512、pad_token_id1、bos_token_id0、eos_token_id2等外X-MOD 独有的参数如下表它们直接控制语言 Adapter 的形态与归一化位置配置参数默认值含义与影响pre_normFalse是否在每个 Transformer 块前应用 LayerNormPost-LN / Pre-LN 结构切换。fairseq 原始 checkpoint 转换时会读取encoder_normalize_before决定adapter_reduction_factor2Adapter 瓶颈维度相对hidden_size的缩小倍数即bottleneck_size hidden_size // adapter_reduction_factoradapter_layer_normFalse是否在 Adapter 模块前新建一个所有语言共享的LayerNorm 层adapter_reuse_layer_normTrue是否复用第二层 LayerNormFFN 输出后的 LN并同样应用于 Adapter 模块之前ln_before_adapterTrue是否在 Adapter 的残差连接之前应用 LayerNormlanguages(en_XX,)需要初始化为 Adapter 模块的语言代码集合会逐个展开为XmodAdapterdefault_languageNone默认语言代码。当 forward 不显式传入语言索引时模型会假定输入属于该语言其中default_language与languages的组合在代码层有强校验在 XmodPreTrainedModel.set_default_language 中若目标语言不在config.languages内会直接抛出ValueError并列出支持的语种。这一行为有对应的单元测试覆盖test_modeling_xmod.py。从结构上推断所有语言 Adapter 共享同一个XmodOutput层通过nn.ModuleDict以语言代码为键挂载因此新增语言等价于向该字典追加一个规模极小约hidden_size/adapter_reduction_factor的瓶颈宽度的模块这正对应论文以极低成本扩展模型容量的设计。四、Adapter 使用指南语言激活的两种方式4.1 指定输入语言的两种方式X-MOD 在XmodModel.forward中通过lang_ids参数决定每个样本激活哪个语言 Adapter见 modeling_xmod.py。官方文档提供了两种方式方式一使用前设置默认语言适合单语言场景from transformers import XmodModel model XmodModel.from_pretrained(facebook/xmod-base, device_mapauto) model.set_default_language(en_XX)该方式把语言记录进model.config.default_language。此后不传lang_ids调用时源码会取出第一个 Transformer 层 Adapter 模块字典的键计算默认语言在其中的索引并整批填充lang_ids default_lang_id * torch.ones(batch_size, devicedevice)。方式二对每个样本显式传入语言 Adapter 索引适合多语言混合 batchimport torch from transformers import XmodModel input_ids torch.tensor( [ [0, 581, 10269, 83, 99942, 136, 60742, 23, 70, 80583, 18276, 2], [0, 1310, 49083, 443, 269, 71, 5486, 165, 60429, 660, 23, 2], ] ) lang_ids torch.LongTensor( [ 0, # en_XX 8, # de_DE ] ) output model(input_ids, lang_idslang_ids)需要特别说明的是虽然forward的 docstring 将lang_ids描述为(batch_size, sequence_length)形状但从实现看lang_ids实际是逐样本batch 级的语言索引向量在 XmodOutput.lang_adapter 中代码对每个 Adapter 逐一执行lang_mask lang_ids adapter_idx随后用hidden_states[lang_mask]只取出属于该语言的样本做 Adapter 前向再按掩码写回new_hidden_states最后统一执行 dropout 并做残差相加。测试 test_multilingual_batch 正是利用这一特性验证了lang_ids[0, 8, 8, 0]时索引 0 与 2 的英文样本、索引 1 与 3 的德文样本其输出逐位一致——证明相同语言的样本走了同一 Adapter。4.2 Adapter 的微观结构XmodAdaptermodeling_xmod.py是一个标准的 bottleneck 双层结构dense1将hidden_size压到hidden_size // adapter_reduction_factor激活函数默认取config.hidden_actgeludense2再映射回hidden_size。在层内的注入位置为 FFN 输出之后XmodOutput内残差路径上再叠一层语言无关的共享层attention、FFN与语言专属的 Adapter 由此解耦。4.3 语言索引与语种的对应语言 Adapter 在nn.ModuleDict中的键值顺序即索引顺序索引从 0 开始。若要精确对照索引与语言代码可直接读取模型第一层的字典或参考模型卡片中给出的 81 语种顺序表。指定语言时建议使用官方文档与测试中采用的已知映射如0→en_XX、8→de_DE并尽量通过set_default_language/ 字符串代码做校验以免发生 Adapter 错配。五、微调 X-MOD冻结 Embedding 与语言 Adapter5.1 为什么冻结、怎么冻结论文建议在微调阶段冻结词嵌入层embedding layer与全部语言 Adapter——冻结共享参数与语言模块只训练任务头与中间的共享 Transformer 参数既降低显存占用又防止灾难性遗忘。官方提供了一键式方法model.freeze_embeddings_and_language_adapters() # 在此之后继续微调模型...5.2 方法在源码中的具体行为从 XmodPreTrainedModel.freeze_embeddings_and_language_adapters 的实现可见该方法会遍历并置requires_grad False的对象是self.roberta.embeddings的全部参数word / position / token_type 三个 Embedding 与 LayerNorm每一层layer.output.adapter_modules的全部 Adapter 参数若adapter_layer_norm is not None连共享的adapter_layer_norm也一并冻结。对应测试 test_freeze_embeddings_and_language_adapters 会断言调用后相关子模块内不存在任何仍可训练的requires_gradTrue参数。5.3 完整微调范式推理/验证示例以掩码语言建模头的填充为例与测试 test_end_to_end_mask_fill 同源X-MOD 可直接复用 XLM-R 的 tokenizer并通过from_pretrained的default_language关键字一步完成加载即指定语言from transformers import XLMRobertaTokenizer, XmodForMaskedLM tokenizer XLMRobertaTokenizer.from_pretrained(FacebookAI/xlm-roberta-base) model XmodForMaskedLM.from_pretrained(facebook/xmod-base, default_languageen_XX) model.freeze_embeddings_and_language_adapters() inputs tokenizer(Hello, my dog is a little mask., return_tensorspt) outputs model(**inputs) probs outputs.logits.softmax(dim-1)六、跨语言迁移Cross-lingual Transfer微调完成后做零样本跨语言评估的方式非常直观保持任务头不变仅把默认语言切换到目标语言让目标语言的 Adapter 接管特征变换model.set_default_language(de_DE) # 在德语样本上评估...从源码看set_default_language(de_DE)只是写入配置真正的语言切换发生在forward中lang_ids is None时模型会依据新的config.default_language重新解析出对应 Adapter 索引并作用于整批样本modeling_xmod.py。这意味着你可以在同一个推理脚本里反复切换目标语言而无需重新加载权重非常适合在 XNLI、WikiANN、XQuAD 等多语言评测基准上依次跑遍多种语言。测试中的对照用例也印证了这一模式test_modeling_xmod.py先设en_XX取输出再切到de_DE取另一组输出比较二者的行为差异以验证跨语言迁移与语言开关生效。七、预训练 Checkpoint 的转换可选进阶若希望从 fairseq 原始 checkpoint 导入仓库提供了转换脚本 convert_xmod_original_pytorch_checkpoint_to_pytorch.py它需要fairseq版本要求在0.12.2 v 2环境会读取 fairseq 的 XMODModel并依据encoder_embed_dim、encoder_layers、bottleneck、languages等字段重建XmodConfig最终导出XmodForMaskedLM或带mnli分类头的XmodForSequenceClassification格式的 checkpoint。其中值得注意的映射细节包括max_position_embeddings514与layer_norm_eps1e-5对齐 fairseq 的 PyTorch 默认值。一般用户使用from_pretrained加载 hub 上的现成权重即可无需自行转换。八、X-MOD 系列 API 总览与任务场景X-MOD 在 Transformers 中提供了与 XLM-R 对齐的完整任务头家族均可在文档对应自动生成的 API 页中查看forward细节本文对每类给出加载与使用要点API 类主要用途任务示例XmodModel裸主干可选 pooler支持 encoder/decoder自定义任务、特征抽取XmodForCausalLM因果语言建模头需config.is_decoderTrue自回归生成XmodForMaskedLM掩码语言建模头默认双向is_decoderFalseMLM 预训练/填充XmodForSequenceClassification池化输出 分类/回归头含 GLUE 风格句子分类、情感分析XmodForMultipleChoice多选打分头SWAG 等多项选择任务XmodForTokenClassification逐 token 分类头NER、词性标注XmodForQuestionAnsweringstart/end span 双头抽取式问答几个工程细节供参考Causal LM 需显式改配置。官方示例见 XmodForCausalLM.forward 的 docstring演示了加载后设置config.is_decoder True再实例化模型使其具备从左到右的因果掩码否则加载时会打印警告。注意力后端丰富XmodPreTrainedModel声明了_supports_flash_attn True、_supports_sdpa True、_supports_flex_attn Truemodeling_xmod.py意味着在硬件支持时可无缝切换 Flash Attention 2 / SDPA / FlexAttention 加速路径supports_gradient_checkpointing True表明大模型训练可开启梯度检查点。文本分类、token 分类、问答、语言建模含 MLM/CLM、多项选择等任务的完整 Trainer 教程可继续阅读仓库中的任务指南文本分类任务指南、Token 分类任务指南、问答任务指南、因果语言建模任务指南、掩码语言建模任务指南、多项选择任务指南。与姊妹模型 XLM-R 的文档对读xlm-roberta 模型文档可以更清楚地看出共享主干 逐语言 Adapter到底新增了哪些行为开关。X-MOD 的定位是需要在多语言之间进行低成本扩展、或追求各语言公平性能的研究与业务场景——例如在多语种 NER/QA 服务中将新增语种作为一个瓶颈极小的 Adapter 增量挂载而无需整体重训大模型。【免费下载链接】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),仅供参考
返回列表