ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

PaddleNLP SqueezeBERT 模型汇总与实战指南:预训练权重、分组卷积架构与下游任务使用

2026/9/23 16:38:45 拓冰建站 浏览量
PaddleNLP SqueezeBERT 模型汇总与实战指南:预训练权重、分组卷积架构与下游任务使用 PaddleNLP SqueezeBERT 模型汇总与实战指南预训练权重、分组卷积架构与下游任务使用【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址: https://gitcode.com/gh_mirrors/pa/PaddleNLP本文以 PaddleNLP 官方模型汇总文档docs/zh/model_zoo/transformers/SqueezeBert/contents.rst为核心骨架系统梳理 PaddleNLP 支持的 SqueezeBERT 预训练权重、模型架构原理与加载使用方式。读完本文你将掌握如何在 PaddleNLP 中一键加载squeezebert-uncased等权重完成文本分类、命名实体识别与抽取式问答并理解 SqueezeBERT 以分组卷积压缩参数量的核心设计。一、SqueezeBERT 是什么SqueezeBERT 是面向高效推理设计的 BERT 变体。它与标准 BERT 一样采用 12 层 Transformer 编码器结构但核心区别在于将传统 Transformer 中占用参数最多的全连接层Q/K/V 投影、前馈网络替换为 1×1 分组卷积grouped convolution从而在保持模型能力的同时显著减少参数总量、降低计算开销。在 PaddleNLP 中SqueezeBERT 以独立子模块形式实现完整代码位于 paddlenlp/transformers/squeezebert包含三个文件文件职责configuration.pySqueezeBertConfig配置类与预训练权重清单modeling.py模型主体Embeddings、Encoder、SelfAttention 及三个下游任务头tokenizer.pySqueezeBertTokenizer分词器二、PaddleNLP 支持的 SqueezeBERT 预训练权重汇总根据官方汇总文档PaddleNLP 目前提供以下 3 个 SqueezeBERT 预训练权重均为英文English语料训练预训练权重名称语言模型细节squeezebert-uncasedEnglish12 层、768 维隐藏层、12 注意力头、约 51M 参数。SqueezeBERT Uncased 基础模型squeezebert-mnliEnglish12 层、768 维隐藏层、12 注意力头、约 51M 参数。在 MNLI自然语言推断任务上微调后的模型squeezebert-mnli-headlessEnglish12 层、768 维隐藏层、12 注意力头、约 51M 参数。去掉 MNLI 分类头的模型适合作为下游任务微调起点这三份权重在源码中的完整注册信息含默认配置与权重下载地址定义于 configuration.py 的SQUEEZEBERT_PRETRAINED_INIT_CONFIGURATION与SQUEEZEBERT_PRETRAINED_RESOURCE_FILES_MAP中。三者的基础架构配置完全一致hidden_size768、num_hidden_layers12、num_attention_heads12、intermediate_size3072区别仅在于squeezebert-mnli额外设置了num_labels3对应 MNLI 蕴含/矛盾/中立三分类squeezebert-mnli-headless与基础版配置相同但对应权重不包含分类头参数专为继续微调设计。与权重配套的分词器词表vocab.txt同样提供三个版本见 tokenizer.py 的pretrained_resource_files_map。三、SqueezeBertConfig 核心配置参数SqueezeBertConfig继承自PretrainedConfig用于实例化SqueezeBertModel并控制模型输出。除了 BERT 常见的标准参数vocab_size、hidden_size、num_hidden_layers、num_attention_heads、intermediate_size、hidden_act、hidden_dropout_prob、attention_probs_dropout_prob、max_position_embeddings、type_vocab_size、initializer_range、layer_norm_eps、pad_token_id等SqueezeBERT 特有的核心参数是六个分组数groups参数它们直接决定了各层分组卷积的分组规模是压缩参数量的关键参数默认值作用embedding_size768词嵌入向量维度q_groups4Q 投影层的分组数k_groups4K 投影层的分组数v_groups4V 投影层的分组数post_attention_groups1注意力后第一个前馈层post-attention的分组数intermediate_groups4第二个前馈层intermediate的分组数output_groups4第三个前馈层output的分组数分组卷积的参数压缩原理当输入输出通道数均为 768 时普通卷积层参数量为768 × 768而分组数g4的分组卷积参数量降为768 × 768 / 4。注意post_attention_groups默认值为 1即该层退化为标准全连接不分组因为此层的输入输出通道数相等分组压缩收益有限。在 configuration.py 中SqueezeBertConfig还通过attribute_map将num_classes映射为num_labels便于不同框架权重的统一加载。四、源码级架构解析分组卷积如何落地阅读 modeling.py 可以清晰看到分组卷积的实现细节4.1 卷积基础构件ConvActivation封装 1×1 卷积 激活函数用于 FFN 的 intermediate 层ConvDropoutLayerNorm封装 1×1 卷积 Dropout 残差连接 LayerNorm用于 post-attention 与 output 层SqueezeBertLayerNorm由于卷积在[N, C, W]通道在中间布局上计算LayerNorm 前先做维度转置归一化后再转置回原布局。4.2 Self-Attention 的卷积化SqueezeBertSelfAttention 将标准 BERT 的 Q/K/V 线性投影全部替换为分组卷积self.query nn.Conv1D(in_channelscin, out_channelscin, kernel_size1, groupsq_groups) self.key nn.Conv1D(in_channelscin, out_channelscin, kernel_size1, groupsk_groups) self.value nn.Conv1D(in_channelscin, out_channelscin, kernel_size1, groupsv_groups)随后通过transpose_for_scores/transpose_key_for_scores将[N, C, W]布局的卷积输出重排为多头注意力所需的[N, heads, W, head_size]结构再进行标准的缩放点积注意力除以sqrt(attention_head_size)、softmax、Dropout 与加权求和。4.3 单层结构与整体编码器SqueezeBertLayer 的通道流转为hidden_size → (attention) → hidden_size → (post_attention) → intermediate_size → (output) → hidden_size即c0 c1 c3 hidden_sizec2 intermediate_size对应上文的三个前馈分组层。SqueezeBertEncoder 堆叠num_hidden_layers个SqueezeBertLayer并在首层前断言embedding_size hidden_size——若两者不等源码注释提示需要在第一个 SqueezeBertLayer 前插入 Conv1D 层调整通道数。4.4 可用的模型类PaddleNLP 为 SqueezeBERT 提供了 4 个可直接使用的模型类定义于 modeling.py模型类用途输出SqueezeBertModel基础编码器register_base_model(sequence_output, pooled_output)可选各层 hidden states 与注意力分数SqueezeBertForSequenceClassification句级分类如 GLUE[batch_size, num_classes]的 logitsSqueezeBertForTokenClassification词级分类如 NER[batch_size, sequence_length, num_classes]的 logitsSqueezeBertForQuestionAnswering抽取式问答如 SQuAD(start_logits, end_logits)这些类均已注册进 Auto 体系AutoConfig通过squeezebert映射到SqueezeBertConfig见 paddlenlp/transformers/auto/configuration.pyAutoModel映射到SqueezeBertModel见 paddlenlp/transformers/auto/modeling.pyAutoTokenizer映射到SqueezeBertTokenizer见 paddlenlp/transformers/auto/tokenizer.py。五、快速上手加载模型与分词器5.1 加载预训练模型使用from_pretrained即可自动下载并加载上述任一权重import paddle from paddlenlp.transformers import SqueezeBertModel, SqueezeBertTokenizer # 加载模型与配套分词器 model SqueezeBertModel.from_pretrained(squeezebert-uncased) tokenizer SqueezeBertTokenizer.from_pretrained(squeezebert-uncased) # 构造输入 inputs tokenizer(He was a puppeteer, return_tensorspd) # 前向推理 sequence_output, pooled_output model(**inputs) print(sequence_output.shape) # [batch_size, seq_len, hidden_size] print(pooled_output.shape) # [batch_size, hidden_size]5.2 分词器行为SqueezeBertTokenizer 采用与 BERT 一致的「BasicTokenizer WordPieceTokenizer」两段式流程先做标点切分与小写化do_lower_case默认为True再做 WordPiece 子词切分。文档示例from paddlenlp.transformers import SqueezeBertTokenizer tokenizer SqueezeBertTokenizer.from_pretrained(squeezebert-uncased) tokens tokenizer(He was a puppeteer) # 结果为 [he, was, a, puppet, ##eer] tokenizer.convert_tokens_to_string(tokens) # 结果为 he was a puppeteer特殊 token 格式与 BERT 一致单句为[CLS] X [SEP]句对为[CLS] A [SEP] B [SEP]见 build_inputs_with_special_tokens并实现了create_token_type_ids_from_sequences、get_special_tokens_mask、build_offset_mapping_with_special_tokens等完整接口可直接对接 PaddleNLP 的 Trainer 训练流程。六、下游任务实战示例6.1 序列分类基于 MNLI 权重squeezebert-mnli已带 3 分类头可直接用于 MNLI 推理也可以加载基础权重后接自定义分类器微调from paddlenlp.transformers import SqueezeBertForSequenceClassification # 加载 MNLI 微调权重num_labels3 model SqueezeBertForSequenceClassification.from_pretrained(squeezebert-mnli) # 或在基础权重上微调自己的分类任务 model SqueezeBertForSequenceClassification.from_pretrained( squeezebert-uncased, num_labels2 )前向时模型内部取[CLS]位置的池化输出经 Dropout 后送入nn.Linear(hidden_size, num_classes)得到[batch_size, num_classes]的 logits见 SqueezeBertForSequenceClassification。6.2 抽取式问答SqueezeBertForQuestionAnswering 在序列输出上接线性层输出被拆分为start_logits与end_logits对应答案区间的起止位置from paddlenlp.transformers import SqueezeBertForQuestionAnswering model SqueezeBertForQuestionAnswering.from_pretrained(squeezebert-uncased) start_logits, end_logits model(input_ids, token_type_ids) # start_logits / end_logits 形状均为 [batch_size, sequence_length]6.3 词级分类NERSqueezeBertForTokenClassification 在每个 token 的隐状态上接分类器输出[batch_size, sequence_length, num_classes]的 logits适用于命名实体识别等序列标注任务。七、测试与验证仓库提供了完整的单元测试可用于验证模型与分词器行为tests/transformers/squeezebert/test_modeling.py通过SqueezeBertModelTester构造小规模配置如hidden_size32、num_hidden_layers5、num_attention_heads4覆盖SqueezeBertModel、SqueezeBertForSequenceClassification、SqueezeBertForTokenClassification、SqueezeBertForQuestionAnswering四个模型类的前向与输出形状验证tests/transformers/squeezebert/test_tokenizer.py验证分词器的切分、特殊 token 与还原逻辑。此外PaddleNLP 还通过 Sphinx 为 SqueezeBERT 生成了 API 文档见 docs/zh/source/paddlenlp.transformers.squeezebert.rst 及其 modeling/tokenizer 子页面其中以 automodule 方式索引了全部公开类与方法可作为查阅 API 详情的入口。八、总结PaddleNLP 以 3 个官方预训练权重完整支持 SqueezeBERT 模型squeezebert-uncased适合作为通用微调起点squeezebert-mnli可直接用于自然语言推断squeezebert-mnli-headless则适合追求灵活性的微调场景。三者均基于 12 层、768 维、12 头、约 51M 参数的统一架构。从源码看SqueezeBERT 通过将 Q/K/V 与 FFN 中的线性层替换为 1×1 分组卷积在保证 Transformer 表达能力的框架内显著压缩了参数量。配合 PaddleNLP 统一的from_pretrained接口与 Auto 体系开发者可以用极少的代码完成加载、推理与下游任务微调。【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址: https://gitcode.com/gh_mirrors/pa/PaddleNLP创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考