拓冰建站拓冰建站
首页 / 资讯中心 / 正文

PaddleNLP 中 RemBERT 多语言模型的原理与 XTREME 任务微调实战

人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载RemBERTRethinking embedding coupling in pre-trained language models是 Google Research 提出的一类基于解耦词嵌入思想的多语言预训练模型其论文发表于 arXiv 2010.12821。本文以 RemBERT 使用文档 为主体结合 PaddleNLP 仓库中 RemBERT 的模型实现modeling.py、配置configuration.py、分词器tokenizer.py以及 XTREME 微调示例slm/model_zoo/rembert系统讲解 RemBERT 的核心设计动机并给出在 XTREME-XNLI 与 XTREME-PAWS-X 两个多语言下游任务上完整可复现的训练、评估流程。读完本文你将掌握RemBERT 架构与标准 BERT 式模型的差异、PaddleNLP 中 RemBERT 的源码级结构以及如何用一条命令完成多语言文本分类模型的微调与精度复现。RemBERT 核心思想解耦词嵌入带来的参数效率标准预训练语言模型通常让输入词嵌入与输出词嵌入共享同一份参数即词嵌入耦合。RemBERT 的作者指出分离词嵌入为语言模型建模提供了更好的灵活性能够显著提高多语言模型中输入词嵌入参数的分配效率。具体来说通过把原本喂给输入词嵌入的部分参数重新分配进 Transformer 编码器层在参数量完全相同的情况下RemBERT 在多语言自然语言理解任务上取得了优于同规模模型的性能。文档还总结了作者的两个关键发现增大输出词嵌入维度可以提升模型性能即使预训练结束后输出词嵌入被丢弃这一收益在微调阶段依然能够保持更大的输出词嵌入具有正则化效果可以防止模型在预训练数据集上过拟合并增强模型在其他 NLP 数据集上的泛化能力。这两点带来的实际收益是可以训练出性能更强的模型而无需在微调阶段增加任何参数。这正是解耦嵌入在参数效率上的核心价值——把参数花在真正影响建模能力的地方。PaddleNLP 中的 RemBERT配置与源码结构解读预训练模型配置一览PaddleNLP 通过RemBertConfig与REMBERT_PRETRAINED_INIT_CONFIGURATION定义了官方rembert预训练模型的全部超参数见 configuration.py配置项取值说明vocab_size250300词表大小SentencePiece 词表input_embedding_size256输入嵌入维度核心特征远小于 hidden_sizehidden_size1152编码器隐藏层维度num_hidden_layers32Transformer 编码器层数num_attention_heads18每层注意力头数intermediate_size4608FFN 中间层维度4 × hidden_sizehidden_actgeluFFN 激活函数hidden_dropout_prob0全连接层 dropout 概率attention_probs_dropout_prob0注意力概率 dropoutmax_position_embeddings512最大序列长度type_vocab_size2token_type 数量句子 A/Binitializer_range0.02参数初始化标准差pad_token_id0padding token 的 idlayer_norm_eps1e-12LayerNorm epsilon注意到一个关键细节input_embedding_size 256远小于hidden_size 1152。这正是 RemBERT 参数重新分配思想的直接体现——输入嵌入只保留较小的维度省下的参数被分配到更深更宽的 Transformer 编码器中。网络结构源码解读RemBERT 的模型主体定义在 paddlenlp/transformers/rembert/modeling.py整体结构与 BERT 式模型一致但嵌入层有本质区别RemBertEmbeddingsmodeling.py#L64-L103词嵌入、位置嵌入、token_type 嵌入的维度均为config.input_embedding_size256而非hidden_size维度映射层RemBertEncoder在进入 32 层 Transformer 之前先用一个nn.Linear(config.input_embedding_size, config.hidden_size)的embedding_hidden_mapping_in将 256 维映射到 1152 维modeling.py#L256-L260标准编码器随后是 32 层由自注意力query/key/value 线性层 softmax dropout、FFNgelu 激活与残差连接 LayerNorm 构成的RemBertLayerPooler取序列首 token[CLS]的隐藏状态经过一层 Linear Tanh 得到池化输出modeling.py#L106-L118。围绕RemBertModel基座仓库提供了 5 种下游任务头全部定义在 modeling.py 的__all__中RemBertForSequenceClassification文本分类本文微调示例所用在[CLS]池化输出上加 dropout 与Linear(hidden_size, num_classes)RemBertForQuestionAnswering阅读理解输出 span 的 start/end logitsRemBertForMaskedLM掩码语言模型RemBertForTokenClassification序列标注如 NERRemBertForMultipleChoice多选题型分类。此外RemBertLMPredictionHead的 decoder 被实现为Linear(config.hidden_size, config.hidden_size)modeling.py#L527-L548即 LM 预测头不再与输入嵌入矩阵共享权重从源码层面印证了解耦嵌入的设计理念。分词器RemBertTokenizertokenizer.py基于SentencePiece词表文件sentencepiece.modeldo_lower_caseFalse特殊 token 为[CLS]、[UNK]、[SEP]、[PAD]、[MASK]最大输入长度 512。句子对编码格式为[CLS] A [SEP] B [SEP]句子 A 的 token_type 为 0、句子 B 为 1。该分词器对应的测试用例位于 tests/transformers/rembert/test_tokenizer.py。快速开始自动下载模型与分词器在运行微调脚本前需要先安装 PaddlePaddle 与 PaddleNLP。PaddleNLP 的from_pretrained(rembert)会自动完成预训练权重与分词器资源的下载模型权重model_state.pdparams资源地址配置在 configuration.py#L44-L48 的REMBERT_PRETRAINED_RESOURCE_FILES_MAP中分词器sentencepiece.model资源地址配置在 tokenizer.py#L74-L79。可以先用下面这段代码快速验证模型能否正确加载并前向推理源自 modeling.py 中的使用示例import paddle from paddlenlp.transformers import RemBertModel, RemBertTokenizer tokenizer RemBertTokenizer.from_pretrained(rembert) model RemBertModel.from_pretrained(rembert) inputs tokenizer(欢迎使用百度飞桨!) inputs {k: paddle.to_tensor([v]) for (k, v) in inputs.items()} output model(**inputs)数据集准备XTREME-XNLI 与 XTREME-PAWS-XRemBERT 微调示例使用 XTREME 基准中的两个多语言自然语言理解任务数据文件的读取逻辑由 data_processor.py 中的XNLIProcessor与MrpcProcessor实现。XTREME-XNLI训练集来自XNLI-MT-1.0.zip解压后位于XNLI-MT-1.0/multinli/multinli.train.en.tsv测试集来自XNLI-1.0.zip文件为xnli.test.tsv。对应到代码中data_processor.py#L75-L112XNLIProcessor的训练、验证、测试文件分别为multinli.train.en.tsv、xnli.dev.tsv、xnli.test.tsv标签空间为[neutral, entailment, contradictory]共 3 类。训练样本从 tsv 的第 1、2 列读取句子对、第 3 列读取标签测试样本从第 7、8 列读取句子对、第 2 列读取标签并将contradiction统一映射为contradictory。XTREME-PAWS-X解压后每种语言包含train、dev、test开头的 tsv 文件由于该任务需要在多语言上进行测试请将全部语言的测试集合并到一个文件。对应到代码中data_processor.py#L37-L62MrpcProcessor读取的合并后文件为train.tsv训练、dev_2k.tsv验证、test_2k.tsv测试标签为二分类[0, 1]。两个数据处理器都会使用RemBertTokenizer将文本逐条 token 化并交由 main.py 中的DataGenerator封装成 PaddleDataset。下游任务微调XTREME-XNLI在slm/model_zoo/rembert目录下以 XTREME-XNLI 为例运行以下命令即可训练并评估 RemBert 在 XNLI 数据集上的精度文档原文命令中--device gpu一行缺少续行符此处已修正python -m paddle.distributed.launch main.py \ --model_type rembert \ --data_dir data/ \ --output_dir output/ \ --device gpu \ --learning_rate 1e-5 \ --num_train_epochs 3 \ --train_batch_size 16 \ --do_train \ --do_eval \ --task xnli \ --eval_step 500说明README 中给出的示例路径为examples/language_model/rembert/main.py在本仓库中的实际位置为 slm/model_zoo/rembert/main.py运行时请以实际路径为准。训练过程中会周期性地在测试集上评估模型并保存当前最优精度对应的 checkpoint。训练结束后将看到如下结果Accuracy 0.8089XTREME-XNLI 数据集内部处理细节从 main.py 的load_example与collate_fn可以看到数据流水线的关键步骤根据--task选择处理器xnli→XNLIProcessorpaws→MrpcProcessor训练集使用DistributedBatchSampler按--train_batch_size分片、shuffle验证/测试集使用普通DataLoader按--eval_batch_sizecollate_fn将 batch 内文本按最长序列动态 padding句子 A 的 token_type 补 0句子 B 补 1拼接text_a与text_b后统一截断到--max_seq_length默认 512每个 epoch 的步数按len(dataloader) // gradient_accumulation_steps计算main.py#L144。下游任务微调XTREME-PAWS-X在 PAWS-X 数据集上训练使用如下命令学习率改为 8e-6任务切换为pawspython -m paddle.distributed.launch main.py \ --model_type rembert \ --data_dir data/ \ --output_dir output/ \ --device gpu \ --learning_rate 8e-6 \ --num_train_epochs 3 \ --train_batch_size 16 \ --do_train \ --do_eval \ --task paws \ --eval_step 500训练结束后模型会在测试集上完成评估你将看到如下结果Accuracy 0.8778命令行参数详解以下参数定义均可从 main.py#L32-L73 的 argparse 中逐一对应参数说明默认值model_type预训练模型类型当前支持rembertrembertdata_dir数据集路径包含上述 tsv 文件无需指定task训练任务xnli或paws无必填output_dir模型预测结果与 checkpoint 保存路径outputsdevice设备类型脚本支持cpu、gpuREADME 亦提及 XPU 场景当前脚本的 choices 限定为 cpu/gpugpulearning_rate基础学习率与 scheduler 输出相乘得到实际学习率XNLI 用 1e-5PAWS-X 用 8e-68e-6num_train_epochs训练 epoch 数3train_batch_size每次迭代每张卡上的样本数目16eval_batch_size评估时每张卡上的 batch size16max_seq_lengthtoken 化后输入最大长度超长截断、不足 padding512gradient_accumulation_steps梯度累积步数loss 会除以该值再反传2warmup_proportion线性学习率 warmup 所占训练步数比例0.02weight_decayAdamW 权重衰减系数0.01seed随机种子同时设置 paddle / random / numpy42eval_step每训练多少步在测试集上评估一次模型2000do_train是否开启训练关闭do_eval是否开启评估加载output_dir中模型在测试集评估关闭其中两点值得注意多 GPU 训练--device gpu配合python -m paddle.distributed.launch即可分布式启动main.py#L140-L142 中当nranks 1时会初始化并行环境并用paddle.DataParallel包装模型可通过环境变量CUDA_VISIBLE_DEVICES指定使用的 GPU id类数自动推导RemBertForSequenceClassification.from_pretrained(args.model_type, num_classesnum_label)中的num_label取自processor.get_labels()的长度XNLI 为 3PAWS-X 为 2无需手动指定。训练器源码视角优化器、混合精度与评估逻辑微调脚本的训练逻辑封装在 trainer.py几个关键实现细节如下优化器AdamWbeta10.9、beta20.99梯度裁剪ClipGradByNorm(clip_norm1.0)权重衰减只作用于非 bias、非 LayerNorm 的参数trainer.py#L85-L99学习率调度LinearDecayWithWarmup线性 warmup 线性衰减warmup 比例默认 0.02混合精度paddle.amp.decorate(levelO2)开启 AMP O2 训练配合GradScaler(init_loss_scaling1024)与paddle.amp.auto_cast完成前向与梯度缩放trainer.py#L47-L66评估与保存策略每eval_step步在测试集上计算一次Accuracy只有当精度超过历史最优值时才model.save_pretrained(output_dir)保存模型训练结束时output_dir中保留的即是最优 checkpointtrainer.py#L71-L77。参考资料RemBERT 原论文的 BibTeX 引用如下源自 README 的 Reference 部分article{chung2020rethinking, title{Rethinking embedding coupling in pre-trained language models}, author{Chung, Hyung Won and Fevry, Thibault and Tsai, Henry and Johnson, Melvin and Ruder, Sebastian}, journal{arXiv preprint arXiv:2010.12821}, year{2020} }如需进一步深入可以继续阅读仓库中的以下文件微调入口 main.py、数据与分词处理 data_processor.py、训练器 trainer.py、模型实现 modeling.py、配置 configuration.py、分词器 tokenizer.py 以及分词器测试 test_tokenizer.py。赞分享人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载相关推荐PaddleNLP RemBERT 模型源码解析与实战从轻量词嵌入到多任务微调PaddleNLP RemBERT 模型源码解析与实战从轻量词嵌入到多任务微调 本篇技术指南以 PaddleNLP 中 RemBERT 模型的 modelin人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPPaddleNLP 中的 ERNIE-M 多语言预训练模型从回译预训练原理到跨语言任务实战PaddleNLP 中的 ERNIE M 多语言预训练模型从回译预训练原理到跨语言任务实战 导读 ERNIE M 是百度提出的一种基于回译机制的多语言语言模型人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPPaddleNLP 中的 ERNIE-M 多语言预训练模型权重清单、架构解析与跨语言微调实战PaddleNLP 中的 ERNIE M 多语言预训练模型权重清单、架构解析与跨语言微调实战 ERNIE M 是百度提出的多语言预训练语言模型通过在大规模单人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLP上一篇3步打造专业音效Equalizer APO免费调音全指南下一篇如何在ComfyUI中部署Florence2从安装到运行的5分钟快速入门创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门