📑 本页目录(点开跳转)
预训练模型详解
⏱ 30 分钟 | ⭐ NLP 赛的起点
🎯 一句话
NLP 竞赛里,选对预训练模型带来的提升,通常大于后面所有调参的总和。这一章的实用价值集中在两点:各家模型的适用场景,和「模型规模 vs 收益」的性价比拐点——不是越大越好,尤其在小数据赛题上。
一、主流预训练模型对比
1.1 模型特性总览
| 模型 | 核心改进 | 参数量 | 中文支持 | 竞赛推荐度 |
|---|---|---|---|---|
| BERT | 双向Transformer编码器 | Base: 110M / Large: 340M | bert-base-chinese | 基线首选 |
| RoBERTa | 动态Mask + 更大语料 + 去NSP | 同BERT | roberta-wwm-ext | 强于BERT |
| DeBERTa V2/V3 | 注意力解耦 + 增强型Mask解码器 | Base/Large/XLarge | deberta-v3-base | 天花板最高 |
| MacBERT | MLM as correction + 全词Mask | 同BERT | macbert-base | 中文优化 |
| ERNIE | 知识增强(实体/短语级Mask) | Base: 110M | ernie-3.0-base | 中文知识密集 |
| NEZHA | 相对位置编码 + 全词Mask | 同BERT | nezha-base-wwm | 中文长文本 |
1.2 选型决策树
二、BERT架构详解
2.1 核心组件
| 组件 | 说明 |
|---|---|
| Input Embedding | Token Embedding + Segment Embedding + Position Embedding |
| Transformer Encoder | Multi-Head Self-Attention + FFN + LayerNorm + Residual |
| [CLS] Token | 句子级表征,用于分类任务 |
| [SEP] Token | 句子分隔符 |
| [MASK] Token | 预训练时的掩码标记 |
2.2 预训练任务
| 任务 | 说明 | BERT使用 | RoBERTa改进 |
|---|---|---|---|
| MLM | 随机遮蔽15%的Token并预测 | 静态Mask | 动态Mask |
| NSP | 判断两个句子是否相邻 | 使用 | 弃用(无收益) |
| SOP | 判断两个句子顺序是否被交换 | 不使用 | ALBERT使用 |
三、DeBERTa核心创新
3.1 注意力解耦(Disentangled Attention)
| 维度 | 说明 |
|---|---|
| 传统注意力 | 内容-内容交互:Q_c * K_c^T |
| 解耦注意力 | 三重交互:内容-内容 + 内容-位置 + 位置-内容 |
| 位置编码 | 相对位置编码,而非绝对位置编码 |
| 优势 | 更好地捕捉Token间的相对位置关系,对长距离依赖建模更强 |
3.2 增强型Mask解码器(EMD)
| 维度 | 说明 |
|---|---|
| 问题背景 | 解耦注意力在输出层缺少绝对位置信息 |
| 解决方案 | 在Softmax之前注入绝对位置信息 |
| 效果 | 弥补解耦注意力对绝对位置的忽视 |
3.3 DeBERTa V3改进
| 维度 | 说明 |
|---|---|
| RTD(Replaced Token Detection) | 替代MLM,检测哪些Token被替换 |
| Generator-Discriminator | 生成器替换Token,判别器检测替换 |
| 共享Embedding | 生成器和判别器共享Token Embedding |
| 优势 | 比MLM更高效的预训练信号 |
四、RoBERTa改进要点
| 改进 | 说明 | 效果 |
|---|---|---|
| 动态Mask | 每个Epoch重新生成Mask模式 | 比静态Mask更优 |
| 去NSP | 去掉Next Sentence Prediction任务 | NSP无收益甚至有害 |
| 更大语料 | 使用160GB文本语料 | 更强的语言理解能力 |
| 更长训练 | 更多的训练步数和更大的Batch Size | 更充分的预训练 |
| 全词Mask(wwm) | 中文场景下遮蔽完整词而非单字 | 中文任务提升显著 |
| BPE分词 | Byte-level BPE,词表更大 | 覆盖更多Unicode字符 |
Byte-level BPE详解
| 维度 | 说明 |
|---|---|
| 传统BPE | 基于字符级别构建词表,处理未知词能力有限 |
| Byte-level BPE | 以字节为基本单位构建词表,天然覆盖所有Unicode字符 |
| 词表大小 | 基础词表仅256个字节,通过合并操作扩展到50K+ |
| 优势 | 无需未知词标记,任何语言的文本都能编码 |
| RoBERTa应用 | RoBERTa使用Byte-level BPE,词表大小50265 |
五、中文预训练模型对比
5.1 MacBERT
| 维度 | 说明 |
|---|---|
| 核心改进 | 用同义词替换[MASK],而非直接用[MASK]标记 |
| MLM as Correction | 预训练任务变为"纠错"而非"填空",更接近Fine-tuning场景 |
| 全词Mask | 中文场景下遮蔽完整词 |
| Ngram Mask | 按Ngram概率遮蔽(1-gram: 80%, 2-gram: 15%, 3-gram: 5%) |
| 优势 | 消除预训练与微调之间的Mask差异 |
5.2 ERNIE
| 维度 | 说明 |
|---|---|
| 知识增强 | 实体级Mask + 短语级Mask,而非Token级Mask |
| 多语言版本 | ERNIE 2.0 / ERNIE 3.0 |
| 持续学习框架 | 通过多任务持续学习框架增量注入知识 |
| 适用场景 | 知识密集型任务(如实体识别、关系抽取) |
5.3 NEZHA
| 维度 | 说明 |
|---|---|
| 相对位置编码 | 使用相对位置编码替代绝对位置编码 |
| 全词Mask | 中文场景下遮蔽完整词 |
| 优势 | 对长文本和位置敏感任务更优 |
六、预训练模型微调范式
6.1 标准微调流程
1. 加载预训练权重
2. 添加任务特定的分类头
3. 冻结/解冻策略选择
4. 设置分层学习率
5. 训练并保存最优权重
6.2 冻结策略
| 策略 | 说明 | 适用场景 |
|---|---|---|
| 全参数微调 | 所有参数参与训练 | 数据充足时 |
| 冻结底层 | 只训练顶层和分类头 | 数据较少时 |
| 渐进解冻 | 从顶到底逐步解冻 | 中等数据量 |
| Adapter | 插入小参数Adapter模块 | 多任务场景 |
6.3 分层学习率设置
| 层 | 学习率 | 说明 |
|---|---|---|
| Embedding层 | 1e-5 ~ 2e-5 | 预训练知识丰富,少动 |
| Transformer层 | 2e-5 ~ 5e-5 | 逐层递增 |
| 分类头 | 1e-4 ~ 5e-4 | 随机初始化,需快速学习 |
七、模型规模与性能权衡
| 模型规模 | 参数量 | 推理速度 | 显存需求 | 性能天花板 |
|---|---|---|---|---|
| Base | ~110M | 快 | 低 | 中等 |
| Large | ~340M | 中 | 中 | 较高 |
| XLarge | ~900M | 慢 | 高 | 最高 |
| 多模型融合 | N倍 | N倍慢 | 需进程隔离 | 最高 |
实战建议
| 维度 | 说明 |
|---|---|
| 起步阶段 | 用Base模型快速验证思路,确认数据管线无误 |
| 中期阶段 | 切换Large模型,配合对抗训练和混合池化 |
| 冲刺阶段 | 使用XLarge + 多折 + 多模型融合 |
| Code Submission | 考虑模型蒸馏或Self-Distillation压缩模型 |
八、其他重要预训练模型
ELECTRA
| 维度 | 说明 |
|---|---|
| 核心思想 | 生成器替换部分Token,判别器检测哪些Token被替换(RTD) |
| 与BERT区别 | BERT只学习被Mask的15%Token,ELECTRA学习全部Token |
| 参数效率 | 在相同计算量下,ELECTRA Small超越BERT Small |
| 竞赛应用 | 适合计算资源有限时,同等参数量下效果更好 |
ALBERT
| 维度 | 说明 |
|---|---|
| 核心改进 | 跨层参数共享 + 嵌入分解,大幅减少参数量 |
| 参数量 | ALBERT-xxLarge仅235M参数,但效果接近甚至超过BERT-Large |
| SOP任务 | 用Sentence Order Prediction替代NSP |
| 竞赛应用 | 显存受限时可选,但推理速度不比BERT快(层数未减少) |
XLNet
| 维度 | 说明 |
|---|---|
| 核心改进 | 排列语言模型(PLM),自回归方式学习双向上下文 |
| 相对位置编码 | 使用Transformer-XL的相对位置编码和片段循环机制 |
| 与BERT区别 | BERT的[MASK]标记在微调时不存在(预训练-微调差异),XLNet无此问题 |
| 竞赛应用 | 长文本任务中有优势,但训练资源消耗大 |
Longformer / BigBird
| 维度 | 说明 |
|---|---|
| 核心改进 | 稀疏注意力机制,支持4096+长度输入 |
| Longformer | 滑动窗口注意力 + 全局注意力(关键Token) |
| BigBird | 随机注意力 + 滑动窗口 + 全局注意力 |
| 竞赛应用 | 长文档分类、长文本NER等超过512 Token限制的任务 |
九、参数高效微调(PEFT)
LoRA(Low-Rank Adaptation)
| 维度 | 说明 |
|---|---|
| 核心思想 | 冻结原始权重,在Attention层旁路添加低秩矩阵A和B |
| 公式 | h = Wx + BAx,其中B∈R^(d×r),A∈R^(r×d),r远小于d |
| 秩r | 通常4~16,越大表达能力越强但参数越多 |
| 参数量 | 仅增加0.1%~1%参数即可达到全参数微调效果 |
| 竞赛应用 | 多任务场景下为每个任务训练一个LoRA,推理时切换 |
| 实现 | peft.LoraConfig + get_peft_model() |
P-Tuning / Prefix Tuning
| 方法 | 核心思想 | 可训练参数 |
|---|---|---|
| P-Tuning | 在输入前添加可学习的连续Prompt向量 | Prompt向量参数 |
| Prefix Tuning | 在每层Attention的Key/Value前添加可学习前缀 | 前缀向量参数 |
| Prompt Tuning | 仅在输入Embedding层添加可学习Prompt | 最少参数 |
| P-Tuning v2 | 每层都添加可学习Prompt,效果接近全参数微调 | 适中 |
Adapter
| 维度 | 说明 |
|---|---|
| 核心思想 | 在Transformer层中插入小型瓶颈结构(Down→ReLU→Up) |
| 参数量 | 仅增加2%~5%参数 |
| 优势 | 多任务场景下每个任务只训练一个Adapter,共享主模型 |
| 劣势 | 增加推理延迟(额外前向传播) |
PEFT方法选择
| 场景 | 推荐方法 | 理由 |
|---|---|---|
| 显存不足 | LoRA | 参数最少,无推理延迟 |
| 多任务切换 | Adapter / LoRA | 每任务独立参数,共享主模型 |
| 追求极致性能 | 全参数微调 | 表达能力最强 |
| 快速实验 | Prompt Tuning | 最少参数,最快训练 |
十、领域自适应预训练(DAPT)
| 维度 | 说明 |
|---|---|
| 核心思想 | 在目标领域的无标注语料上继续预训练通用模型 |
| 适用场景 | 医疗、法律、金融等特定领域,通用模型表现差时 |
| 语料要求 | 至少需要数GB级别的领域语料,太少容易过拟合 |
| 训练方式 | 继续MLM任务,学习率设为1e-5~5e-5,训练1~3个epoch |
| 与任务微调关系 | DAPT → Task Fine-tuning,两阶段训练 |
| 竞赛经验 | 医疗NER等强领域任务中,DAPT可带来1~3个百分点的提升 |
DAPT实战流程
1. 收集领域无标注语料(如医疗文本、法律文书)
2. 加载通用预训练模型(如bert-base-chinese)
3. 在领域语料上继续MLM预训练(1~3 epoch, lr=1e-5)
4. 保存领域预训练模型
5. 在任务数据上微调(标准流程)
🔗 这一章连到哪里
| 去哪 | 为什么 |
|---|---|
| 大模型导论 02 Transformer 原理 | BERT / RoBERTa / DeBERTa 的共同底座,注意力和位置编码在这里 |
| 大模型导论 04 训练三阶段 | 预训练→微调这个范式本身是怎么来的 |
| 大模型导论 05 微调与 LoRA | PEFT / LoRA / Adapter 的原理与显存账 |
| ML基础 14 通往 Transformer | 从 RNN 到注意力的过渡,想补更前面的基础走这条 |
✅ 检查点
- BERT、RoBERTa、DeBERTa 的关键差异是什么?竞赛里通常怎么选?
- 为什么说「不是模型越大越好」?拐点大致在哪?
- 什么是领域自适应预训练(DAPT)?它在什么赛题上收益最大?
- PEFT(参数高效微调)在竞赛里的典型用途是什么?
- 中文赛题选模型时要额外注意什么?
👀 答案
- RoBERTa 是 BERT 的训练配方优化(去掉 NSP、更大 batch、动态 mask、更多数据);DeBERTa 的核心创新是解耦的注意力(内容和位置分开算)+ 增强的掩码解码器,在多数 NLP 榜单上明显更强。竞赛里通常先用 DeBERTa-v3 起手,再用 RoBERTa 等作为融合的多样性来源。
- 因为大模型需要更多数据才能把它的容量用起来。小数据赛题上,large 相比 base 的提升可能还不如它带来的过拟合和训练不稳定的损失。拐点大致在几万条训练样本——低于这个量级时,base 尺寸 + 多种子融合,常常优于单个 large。
- 在赛题领域的无标注语料上继续做预训练(MLM),再去微调。收益最大的场景:领域和通用语料差异大(医学、法律、化工、代码、社交媒体黑话),且手上有大量无标注领域文本——竞赛里测试集的文本本身往往就是最好的语料。
- 在显存受限时微调更大的模型(用 LoRA 微调一个 large,显存开销接近微调 base);以及低成本地产出多样性——同一个基座挂不同的 LoRA,融合时算作不同模型。
- ①分词粒度(字级 vs 词级)会显著影响下游表现 ②词表覆盖——领域黑话、繁体、生僻字是否在词表里 ③国产系列(如 RoBERTa-wwm、MacBERT、ERNIE)在中文任务上通常优于直接用多语言模型 ④全词掩码(wwm)版本在中文上一般更好。
🛑 可以停在这里
先记住这几件事
- 预训练模型先按任务、语种、输入长度和资源条件筛选。
- 模型大小与领域适配需要通过自己的验证集比较。
- 继续预训练和参数高效微调各有用途,使用额外数据前确认比赛规则。