PaddleNLP 中的 NeZha 模型预训练权重清单与相对位置编码实现解析【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址: https://gitcode.com/gh_mirrors/pa/PaddleNLPNeZha哪吒是华为诺亚方舟实验室提出的中文预训练语言模型其核心创新在于使用**相对位置编码Relative Position Encoding**替代 BERT 使用的绝对位置编码以提升长距离依赖建模能力。本文基于 PaddleNLP 开源仓库的 NeZha 模块docs/en/model_zoo/transformers/NeZha/contents.rst完整梳理仓库当前支持的预训练权重清单并结合 源码 深入解析配置参数、相对位置编码的实现原理、分词器与六大下游任务模型类帮助读者在 PaddleNLP 中快速加载、微调与部署 NeZha。一、PaddleNLP 支持的 NeZha 预训练权重总览PaddleNLP 文档给出了一张 NeZha 模型摘要表汇总了当前支持的 NeZha 预训练模型、对应语言及架构参数。下表完整继承并整理自该文档预训练权重语言模型结构细节nezha-base-chinese中文12 层 Transformer、768 隐藏维度、12 注意力头、约 108M 参数在中文语料上训练nezha-large-chinese别名nezha-cn-12L768H中文24 层 Transformer、1024 隐藏维度、16 注意力头、约 336M 参数在中文语料上训练nezha-en-12L768H英文12 层 Transformer、768 隐藏维度、16 注意力头、约 108M 参数在英文语料上训练注文档中nezha-en-12L768H与nezha-cn-12L768H为历史命名的别名。从当前仓库源码看实际注册在配置与权重下载映射表NEZHA_PRETRAINED_INIT_CONFIGURATION与NEZHA_PRETRAINED_RESOURCE_FILES_MAP见 configuration.py中的标准模型名共有 4 个模型名hidden_size层数注意力头intermediate_size词表大小最大位置编码nezha-base-chinese7681212307221128512nezha-base-wwm-chinese7681212307221128512nezha-large-chinese10242416409621128512nezha-large-wwm-chinese10242416409621128512其中带wwm后缀的模型使用**全词掩码Whole Word Masking**策略预训练。权重以.pdparams格式存储由PretrainedModel.from_pretrained()自动下载详见下方资源映射代码片段NEZHA_PRETRAINED_RESOURCE_FILES_MAP { model_state: { nezha-base-chinese: https://bj.bcebos.com/paddlenlp/models/transformers/nezha/nezha-base-chinese.pdparams, nezha-large-chinese: https://bj.bcebos.com/paddlenlp/models/transformers/nezha/nezha-large-chinese.pdparams, nezha-base-wwm-chinese: https://bj.bcebos.com/paddlenlp/models/transformers/nezha/nezha-base-wwm-chinese.pdparams, nezha-large-wwm-chinese: https://bj.bcebos.com/paddlenlp/models/transformers/nezha/nezha-large-wwm-chinese.pdparams, } }中文模型共享同一个词表文件vocab.txt大小 21128分词器初始化配置均为do_lower_caseFalse中文无需转小写。二、NeZha 模块在仓库中的代码布局PaddleNLP 将 NeZha 作为标准 Transformer 模型族实现源码集中在paddlenlp/transformers/nezha/目录下configuration.pyNeZhaConfig配置类及预训练初始化配置、权重资源映射modeling.pyNeZhaModel骨干模型与 5 个下游任务模型类共 1179 行tokenizer.pyNeZhaTokenizer分词器init.py统一导出modeling与tokenizer中的全部符号。同时在 paddlenlp/transformers/init.py 中通过from .nezha.configuration import *等语句将NeZhaConfig、全部模型类与NeZhaTokenizer注册进paddlenlp.transformers顶层命名空间因此用户可直接from paddlenlp.transformers import NeZhaModel使用。测试用例位于 tests/transformers/nezha/包含test_modeling.py与test_tokenizer.py两个测试文件。三、NeZhaConfig核心配置参数全解析NeZhaConfig继承自PretrainedConfigmodel_type nezha。其全部构造参数及默认值如下见 configuration.py参数默认值含义vocab_size21128词表大小定义input_ids可表示的 token 种类embedding_size128词嵌入维度预训练初始化配置中未覆盖用于自定义模型hidden_size768编码器层与池化层的隐藏维度num_hidden_layers12Transformer 编码器层数num_attention_heads12每层注意力头数intermediate_size3072前馈网络中间层维度hidden_actgelu编码器与池化层激活函数hidden_dropout_prob0.1全连接层 dropout 概率attention_probs_dropout_prob0.1注意力概率 dropout 比例max_position_embeddings512最大序列长度max_relative_position64相对位置编码的最大相对距离NeZha 特有type_vocab_size2token_type_ids词表大小句对区分initializer_range0.02权重矩阵正态初始化标准差layer_norm_eps1e-12LayerNorm 分母防除零小量classifier_dropout0.1分类头 dropout 比例pad_token_id/bos_token_id/eos_token_id0 / 2 / 3特殊 token 的 IDuse_cacheTrue是否使用 KV 缓存供生成/解码场景其中max_relative_position与use_relative_position是 NeZha 区别于经典 BERT 的关键参数。当use_relative_positionTrue默认时模型不学习可训练的位置嵌入而是在注意力计算中以正弦函数形式动态注入相对位置信息。3.1 与 BERT 系配置的属性映射NeZhaConfig通过attribute_map建立兼容映射configuration.pyattribute_map: Dict[str, str] {dropout: classifier_dropout, num_classes: num_labels}这使得从其他框架如 HuggingFace 风格配置迁移权重时dropout、num_classes等字段能被自动翻译为 PaddleNLP 侧的参数名便于跨生态导入导出。四、核心机制相对位置编码在 NeZhaAttention 中的实现NeZha 最核心的差异在注意力层。NeZhaAttentionmodeling.py在标准 Self-AttentionQ/K/V 线性投影 → 缩放点积 → Softmax → 加权求和基础上额外引入了两个方向的相对位置偏置4.1 相对位置嵌入表的生成generate_relative_positions_embeddings()modeling.py以正弦/余弦函数构造大小为(2 * max_relative_position 1, head_size)的嵌入表for pos in range(vocab_size): for i in range(depth // 2): embeddings_table[pos, 2 * i] np.sin(pos / np.power(10000, 2 * i / depth)) embeddings_table[pos, 2 * i 1] np.cos(pos / np.power(10000, 2 * i / depth))同时用distance_mat range_mat - range_mat.T计算 token 两两之间的相对距离矩阵并裁剪到[-max_relative_position, max_relative_position]区间默认 ±64随后做 one-hot 编码与查表得到形状为[seq_len, seq_len, head_size]的相对位置矩阵。这个表在初始化时一次性生成、无需训练更新属于函数式位置编码Sinusoidal与裁剪相对距离的组合。4.2 双向注入key 侧与 value 侧在前向传播中modeling.py相对位置被注入两次key 侧注意力分数修正将 query 与相对位置矩阵做paddle.matmul得到key_position_scores加到原始注意力分数上再除以sqrt(head_size)、叠加 mask、过 Softmaxattention_scores attention_scores key_position_scores_r_t attention_scores attention_scores / math.sqrt(self.attention_head_size) attention_scores attention_scores attention_maskvalue 侧上下文加权修正将 Softmax 后的注意力概率与相对位置矩阵做矩阵乘得到value_position_scores再加回加权上下文context_layervalue_position_scores paddle.matmul(attentions_probs_r, relations_values) ... context_layer context_layer value_position_scores_r_t这种分数 上下文双通道注入方式正是 NeZha 论文中区别于其他相对位置编码变体的关键设计能让模型在计算注意力权重时感知 token 间相对距离同时通过 value 侧直接向输出注入位置信息缓解绝对位置编码在长序列上的外推瓶颈。4.3 嵌入层相对位置模式下的结构差异NeZhaEmbeddingsmodeling.py根据use_relative_position决定是否创建position_embeddingsif not self.use_relative_position: self.position_embeddings nn.Embedding(config.max_position_embeddings, config.hidden_size)即默认相对位置模式下嵌入层只含 word embeddings token type embeddings位置信息完全交由注意力层处理若关闭该开关则退回 BERT 式的可学习绝对位置嵌入。五、NeZhaTokenizerBasicTokenizer WordPiece 两级分词NeZhaTokenizertokenizer.py采用经典的两级流水线BasicTokenizer负责标点切分、大小写处理等基础清洗WordPieceTokenizer依据vocab.txt做子词切分未知词回退到[UNK]。其_tokenize实现tokenizer.py依次调用两级分词器并拼接子词结果。特殊 token 约定为[CLS]、[SEP]、[PAD]、[UNK]、[MASK]序列格式为单序列[CLS] X [SEP]句对[CLS] A [SEP] B [SEP]官方示例输出tokenizer.pyfrom paddlenlp.transformers import NeZhaTokenizer tokenizer NeZhaTokenizer.from_pretrained(nezha-base-chinese) inputs tokenizer(欢迎使用百度飞桨) # {input_ids: [101, 3614, 6816, 886, 4500, 4636, 2428, 7607, 3444, 8013, 102], # token_type_ids: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}中文场景下所有模型均配置do_lower_caseFalse即不做转小写处理。此外分词器还实现了build_offset_mapping_with_special_tokens、create_token_type_ids_from_sequences、get_special_tokens_mask等方法支持序列标注等需要 offset mapping 的任务。六、模型家族从骨干到六大下游任务modeling.py 定义了完整的模型层级__all__见第 46-54 行模型类用途输出头NeZhaModel骨干模型输出原始 hidden states无register_base_model注册NeZhaForPretraining预训练任务MLM NSPNeZhaLMPredictionHeadseq_relationship线性层NeZhaForSequenceClassification句子级分类/回归GLUE 类任务[CLS]池化 分类线性层NeZhaForTokenClassificationToken 级分类NER 类任务逐 token 分类线性层NeZhaForQuestionAnswering抽取式问答SQuAD 类输出start_logits/end_logitsNeZhaForMultipleChoice多项选择RocStories/SWAG 类每个选项打分6.1 骨干结构Embeddings → Encoder → PoolerNeZhaModelmodeling.py由三部分组成NeZhaEmbeddings词嵌入 token type 嵌入相对位置模式下无绝对位置嵌入NeZhaEncodernum_hidden_layers个NeZhaLayer堆叠每层含NeZhaAttention带相对位置注入 FFNhidden_size → intermediate_size → hidden_sizeGELU 激活且两个子层都采用Pre-LN 后的残差结构LayerNorm 在残差加和之后NeZhaPooler取[CLS]位置向量过nn.Tanh得到pooled_output。forward中通过output_hidden_states、output_attentions、return_dict三个开关控制返回内容可返回每层 hidden states 与注意力权重用于可视化/蒸馏也可返回BaseModelOutputWithPoolingAndCrossAttentions结构化解耦输出。6.2 权重初始化与参数共享NeZhaPretrainedModel._init_weightsmodeling.py将nn.Linear与nn.Embedding权重按initializer_range0.02的正态分布初始化并固定LayerNorm的epsilon1e-12。而NeZhaForPretraining的 MLM 预测头复用词嵌入权重embedding_weights参数指向word_embeddings.weight即经典的权重绑定设计减少参数量并提升预训练稳定性。6.3 分类模型的损失函数自动推导以NeZhaForSequenceClassificationmodeling.py为例当传入labels时模型会根据num_labels与标签 dtype 自动选择损失num_labels1用 MSE回归整型标签用交叉熵单标签分类否则用BCEWithLogitsLoss多标签分类。七、快速上手加载模型与推理7.1 加载骨干模型import paddle from paddlenlp.transformers import NeZhaModel, NeZhaTokenizer tokenizer NeZhaTokenizer.from_pretrained(nezha-base-chinese) model NeZhaModel.from_pretrained(nezha-base-chinese) inputs tokenizer(欢迎使用百度飞浆!, return_tensorspt) output model(**inputs)from_pretrained会自动从 BOS 下载model_state.pdparams与config.json到本地缓存首次运行需要网络连接。加载后可用model.config访问完整配置。7.2 直接实例化自定义配置from paddlenlp.transformers import NeZhaConfig, NeZhaModel # 基于默认 nezha-base 风格配置随机初始化 configuration NeZhaConfig() model NeZhaModel(configuration) print(model.config.model_type) # nezha7.3 加载下游任务模型以抽取式问答为例源码 docstring 示例from paddlenlp.transformers import NeZhaForQuestionAnswering, NeZhaTokenizer tokenizer NeZhaTokenizer.from_pretrained(nezha-base-chinese) model NeZhaForQuestionAnswering.from_pretrained(nezha-base-chinese) inputs tokenizer(欢迎使用百度飞浆!, return_tensorspt) outputs model(**inputs) start_logits, end_logits outputs[0], outputs[1]八、测试验证模型与分词器的一致性保障仓库为 NeZha 提供了完整的单元测试位于 tests/transformers/nezha/test_modeling.pyNeZhaModelTester构造小型随机配置NeZhaModelTest继承ModelTesterMixin验证骨干输出 shape 与数值正确性并针对序列分类、token 分类、问答、多项选择四种下游头分别编写测试test_for_sequence_classification等另含test_model_from_pretrained验证真实预训练权重可加载test_tokenizer.py验证分词、special token 拼接与 offset mapping 行为。读者在tests/transformers/nezha/目录可找到验证 NeZha 前向、反向与预训练加载的完整参考实现是深入理解各模型类输入输出约定的最佳入口。九、使用注意事项输入张量input_ids、token_type_ids需为int64形状[batch_size, sequence_length]attention_mask支持 int/float/bool 三种类型模型内部会统一转为(1.0 - mask) * -10000.0的负无穷偏置见 modeling.py。序列长度上限预训练配置的max_position_embeddings512超过该长度需自行做长文本切分或位置编码扩展。相对位置距离max_relative_position64表示模型只感知 ±64 以内的相对距离超出部分统一截断到边界值。预训练资源当前仓库注册的中文模型为 base/large 各含 wwm 变体共 4 个文档中出现的nezha-cn-12L768H、nezha-en-12L768H属于历史别名若需使用英文 NeZha 权重建议核对官方模型库的最新可用名称。不要同时传入input_ids与inputs_embeds二者互斥源码中会显式抛出ValueError。十、小结通过本文可以掌握PaddleNLP 中 NeZha 的完整预训练权重清单base/large、中文/英文、WWM 变体、NeZhaConfig每个配置参数的语义与默认值、相对位置编码在注意力层分数 上下文双向注入的源码级实现、两级分词器的行为约定以及覆盖六大任务的模型家族与对应测试。若需在中文 NLP 任务上快速获得优于传统 BERT 的基线可直接从nezha-base-chinese或nezha-large-chinese起步配合 PaddleNLP 下游任务示例 完成微调与部署。【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址: https://gitcode.com/gh_mirrors/pa/PaddleNLP创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考