外观
蒸馏经典:KD 与蒸馏家族
如果说量化是「把模型压缩」,蒸馏(knowledge distillation)就是「把大模型里的知识复制到小模型」——前者改数值精度,后者改模型容量。蒸馏的哲学是:模型的大小不等于知识的多寡,知识可以被迁移。本文精读开创性的 Hinton KD,再逐一拆解 BERT 系蒸馏三兄弟(DistilBERT、TinyBERT、MiniLM)。
先读 模型压缩 建立蒸馏的工程定位,再回来读细节。
蒸馏总览:为什么软标签比硬标签信息量大
一个分类模型训练完,对输入 x 输出一个概率分布。传统训练用硬标签(one-hot,如 [0,0,1])算交叉熵;蒸馏改用 teacher 的软输出当监督信号。差别在哪?
假设判断「这张图是不是猫」:硬标签只告诉模型「是猫」。而一个训好的 teacher 会输出类似 [猫:0.7, 狗:0.2, 兔:0.1] 的分布——它隐含了「猫和狗比猫和汽车更像」这种 teacher 从数据里学到的类间相似结构。这种「软信息」在硬标签里被完全丢弃了。蒸馏 = 把这个被丢弃的信息捡回来喂给学生。
温度 T 是蒸馏的关键旋钮。teacher 输出的 logits z 经过软化后再给学生:
text
硬标签: [0, 0, 1] (one-hot,信息最少)
teacher 输出 p_i = exp(z_i / T) / Σ_j exp(z_j / T)
T = 1 : 原始 softmax,分布已能看到相对大小
T → 大 : 分布越来越「平」,类间微小的相对关系被放大暴露
T → 小 : 分布越来越「尖」,趋近 one-hot
训练时用较大的 T(如 2-8)让学生学到结构;
推理时 T=1(学生自己正常输出),温度只属于训练期。学生的总损失 = 蒸馏损失(学生软输出 vs teacher 软输出,用同一温度)+ 学生自己的硬标签交叉熵,两部分加权求和。硬标签部分防止学生学到 teacher 的偏差。
一、Hinton KD:知识蒸馏的开山之作(Hinton, Vinyals & Dean, 2015)
一句话贡献
提出用温度软化后的软标签迁移知识:小模型(学生)在软目标 + 硬标签的联合监督下,能比直接训练收敛得更好——知识蒸馏从此成为独立研究领域。
背景与动机
2015 年前后,模型压缩的主流是剪枝与量化,思路都是「在已有模型上做减法」。Hinton 提出一个更根本的视角:训练好一个大模型(或一组集成)要花海量算力,但它的「知识」能不能直接移植到一个小模型里? 论文在三个场景验证:MNIST 手写数字、语音识别(声学模型)、机器翻译(WMT 语料),均显示学生能逼近甚至达到 teacher 的表现。
方法核心
- 软标签作为监督:用温度 T 软化 teacher 输出,学生在软化分布上做交叉熵。
- T 的选择:通常先用较大的 T 训 teacher 本身(这样 teacher 的软标签更有区分度),再以相同 T 训练学生;推理时回到 T=1。
- 集成蒸馏:把多个模型的集成当 teacher,蒸馏到一个单一学生——一个学生模型就能拿到集成的精度。
text
┌─────────────────────────┐
│ Teacher(大模型/集成) │
│ 输出 logits z │
└───────────┬─────────────┘
│ softmax(z / T)
▼
软标签 p_teacher ┌─── 学生硬标签交叉熵(防偏差)
│ │
▼ ▼
学生软输出 p_student ──交叉熵── 学生自己的训练数据
│
┌────────┴─────────┐
│ 蒸馏损失 + 任务损失 │
└──────────────────┘关键结果
- MNIST:一个由 8 个模型组成的集成蒸馏到单一模型,错误率与集成相当,但推理成本只有 1/8。
- 语音识别(声学模型):集成蒸馏后的小模型达到近似集成精度。
- 结论性洞察:「模型大小」和「知识容量」是两个变量——软标签让学生能用更少的参数编码同样的知识。
局限与后续
- 当时主要验证在分类与序列模型上;对后来 Transformer 的预训练蒸馏,需要新的蒸馏目标(见下文三兄弟)。
- 蒸馏效果依赖 teacher 质量与温度超参。
- 后续直接衍生:fitnets(蒸馏中间层)、teacher assistant 两阶段蒸馏、以及 BERT 系蒸馏。
对今天的启示
KD 定义了「用训练成本换推理成本」的范式:只要你有算力训大模型(或直接用现成的大模型做离线标注),就能换一个便宜得多的小模型上线。今天 LLM 的「用大模型生成数据、训练小模型」路线(如 Alpaca、Self-Instruct),本质就是 Hinton KD 思想在生成任务上的当代版本。
二、DistilBERT:预训练阶段就蒸馏(Sanh et al., 2019)
一句话贡献
把蒸馏前移到预训练阶段:在 BERT 预训练时就用大 BERT 的软输出教小 BERT,得到 40% 更小、快 60%、保留 97% 性能 的通用模型,微调后照样好用。
背景与动机
Hinton KD 的常见用法是任务级蒸馏:训好一个任务模型,再蒸馏到小模型。但 BERT 是「预训练 + 微调」范式——如果只在微调阶段蒸馏,小模型的语言知识仍要靠自己预训练(很贵)。DistilBERT 的思路:直接在预训练阶段蒸馏,产出一个「生下来就小」的通用模型,下游微调照常。
方法核心
- 结构:BERT-base 12 层 → 学生 6 层(每 2 层取 1 层初始化),参数约 66M(原 110M)。
- Triple loss:语言建模损失(学生自己的 masked LM)+ 蒸馏损失(softmax 温度 T=2 的学生/teacher 输出交叉熵)+ 余弦距离损失(学生/teacher hidden states 方向一致)。
- 用一个 loss 把「学任务 + 学 teacher 的软目标 + 学 teacher 的表示方向」同时做掉。
关键结果
| 指标 | 数字 |
|---|---|
| 参数量 | 减少 40%(110M → 66M,6 层) |
| 性能 | 保留 97% 的语言理解能力(GLUE 多项平均) |
| 速度 | 推理 快约 60% |
| 适用性 | 微调后覆盖大多数 NLP 任务,可直接当通用模型用 |
局限与后续
- 只看输出层 soft 目标 + 一层 hidden state 对齐,没有蒸馏注意力矩阵——后来的工作认为注意力结构信息同样关键。
- 6 层是常见下探深度,更深的压缩需要更细的蒸馏目标。
对今天的启示
DistilBERT 证明了「预训练阶段蒸馏」在工程上极有价值:一次蒸馏产出通用小模型,全部门楣微调任务复用,省掉的推理成本是长期的。BERT 系部署场景里 distilbert-* 至今仍是「快 + 稳」的默认选择之一。
三、TinyBERT:两阶段 + 注意力矩阵蒸馏(Jiao et al., EMNLP 2020 Findings)
一句话贡献
把蒸馏细化到「嵌入层、注意力矩阵、隐藏状态、预测层」四层目标,并分预训练、微调两阶段做——4 层 TinyBERT 达到 BERT-base 的 96.8% 性能,却小 7.5 倍、快 9.4 倍。
背景与动机
DistilBERT 证明「输出层对齐」有效,但压缩到 4 层(深度 1/3)时,单靠输出对齐就不够了。论文观点:Transformer 的能力很大程度上来自注意力结构(每个 token 看谁、看得多重),这部分知识在 soft 标签里是隐式的。TinyBERT 直接把注意力矩阵(QK^T 的分布)拿来当蒸馏目标,让学生的注意力「长得像」teacher。
方法核心
- 蒸馏目标分四层:
- 嵌入层输出对齐;
- 注意力矩阵对齐(学生每层注意力分布 ≈ teacher 对应层,这是核心创新);
- 隐藏状态对齐(含经过线性变换的学生/teacher hidden states 对齐);
- 输出层对齐(软标签)。
- 两阶段框架:先在通用语料预训练阶段蒸馏一次(拿到通用小模型),再在任务微调阶段针对每个下游任务再蒸馏一次——「通用蒸馏打底、任务蒸馏精调」。
- 层映射:4 层学生按间隔映射到 teacher 的 12 层(如 1→[1,2,3], 2→[4,5,6]...)。
关键结果
| 指标 | 数字 |
|---|---|
| 规模 | 4 层 TinyBERT(约 14.5M)vs BERT-base(110M):小约 7.5x |
| 性能 | GLUE 上达到 teacher 的 96.8%;6 层版本与 BERT-base 持平 |
| 速度 | 推理快约 9.4x |
| 对比 | 4 层版本显著优于同期其他 4 层蒸馏模型(参数约其 28%) |
局限与后续
- 两阶段蒸馏 = 训练成本更高(预训练阶段也要跑一遍蒸馏)。
- 注意力对齐增加了超参(层映射方式、对齐权重)。
- 后续:MiniLM 指出「逐层对齐注意力」对 12→6 够用,但对更深压缩(12→4)有改进空间,并提出「只对齐最后一层」的简化。
对今天的启示
TinyBERT 是「把模型内部结构当蒸馏对象」的代表:当你要把一个模型压到原深度的 1/3 时,别只对齐输出,把注意力和表示层一起对齐。这套思想后来被几乎所有 Transformer 蒸馏沿用(包括大模型蒸馏)。
四、MiniLM:只蒸馏自注意力的内部关系(Wang et al., EMNLP 2020 Findings)
一句话贡献
蒸馏目标进一步抽象为自注意力的「内部关系」(QK^T 分布 + V^T V 相似度),且只对齐 teacher 最后一层——深度任意缩放(12→6 或 12→4),50% 参数保留 99%+ 准确率。
背景与动机
TinyBERT 逐层对齐注意力有个问题:学生的层数/层宽和 teacher 不同,逐层映射是启发式,而且每一层都要设计对齐。MiniLM 提出一个更「深度不可知」的方案:只拿 teacher 最后一层的自注意力模块当唯一蒸馏目标,学生所有层的注意力都去对齐它。
更关键的是,它蒸馏的不只是注意力分布(QK^T),还新增 V^T V——自注意力里 value 之间的关系,携带了「哪些 token 的表示应该被叠加」的结构信息。
方法核心
text
Teacher(最后一层) Student(任意层数)
│ │
自注意力模块 自注意力模块
│ │
QK^T(注意力分布) ←── 对齐 ──→ QK^T(注意力分布)
V^T V(值关系) ←── 对齐 ──→ V^T V(值关系)- 深度缩放:12 层 teacher 可以直接教 6 层或 4 层学生,不需要逐层映射。
- Teacher Assistant:当 teacher 很大(如 24 层)时,先蒸馏一个「助教」再蒸馏到学生,缩小容量鸿沟。
关键结果
| 指标 | 数字 |
|---|---|
| 规模 | 12 层 BERT-base → 6 层(50% 参数) |
| 性能 | SQuAD 2.0 与 GLUE 多项保留 99%+ 准确率 |
| 压缩方向 | 支持深度缩放(12→6、12→4)与宽度缩放,也扩展到多语言模型 |
| 与同期对比 | 同等学生规模下优于 DistilBERT、TinyBERT 等基线 |
局限与后续
- 只蒸馏了自注意力,MLP 部分的知识靠输出层软标签补,理论上仍不是全量信息。
- Teacher assistant 需要额外训练一个中间模型。
- 后续:MiniLM 的思想(关系蒸馏、深度无关对齐)被 LLM 蒸馏(如 token-level 蒸馏)大量继承。
对今天的启示
MiniLM 证明:蒸馏目标不是越全越好,而是越「结构化」越好——抓住「模型怎么组织信息」(注意力关系),比逐层逐目标对齐更高效。这给部署侧的启示是:当资源紧张时,优先保住模型的信息组织方式,而不是数值逐位对齐。
五、对比总表
| 模型 | 参数量 | 性能保留 | 推理加速 | 蒸馏目标 | 蒸馏阶段 |
|---|---|---|---|---|---|
| DistilBERT | 40%(110M→66M) | ~97% | 快 60% | 软标签 + hidden states 余弦 | 预训练 |
| TinyBERT(4 层) | 约 1/7.5(vs BERT-base) | 96.8%(6 层持平) | 快 9.4x | 嵌入+注意力矩阵+隐藏状态+输出 | 预训练 + 任务两阶段 |
| MiniLM | 50%(12→6 层) | 99%+ | 约 2x | 最后一层自注意力关系(QK^T + V^T V) | 预训练式,深度无关 |
六、蒸馏与量化:组合拳
蒸馏和量化正交,可以叠加:先蒸馏出小模型,再对小模型量化,比「直接量化大模型」通常精度更好、也比「只蒸馏不量化」更省显存。
- 为什么先蒸馏:小模型权重分布更规整、离群值更少,量化误差更可控(对照 LLM.int8 的离群值问题)。
- 工程顺序:蒸馏降容量 → 量化降位宽 → 图优化/算子融合降延迟。
- 注意:量化的校准集要来自蒸馏后模型的目标分布,别拿 teacher 的分布硬套。
部署视角的决策顺序
延迟和显存都吃紧、模型又不大(<1B):先蒸馏,不够再量化。模型很大(≥7B)且无法重训:直接量化(GPTQ/AWQ),见量化经典。
七、对 LLM 的启示:蒸馏 vs 直接用更小模型
两个常被混淆的问题:
- 蒸馏和「直接训练一个小模型」有什么区别? 直接训练小模型从头学知识;蒸馏让小模型继承大模型已经提炼过的知识(软标签 + 结构对齐),同等容量下收敛更好、效果更接近大模型。
- LLM 时代蒸馏还重要吗? 重要,但形式变了:
- 数据蒸馏:用大模型离线生成高质量数据/响应,训练小模型(Alpaca、Self-Instruct 的思路),这是当前 LLM 小模型的主流路线;
- 在线/离线生成蒸馏:让教师模型指导学生模型在生成任务上对齐(需要克服分布坍塌等新问题);
- 知识蒸馏到更强小模型:如 MiniLM 的 teacher assistant 思想在多阶段蒸馏里继续发光。
- 蒸馏 ≠ 替代量化:两者回答不同问题——蒸馏减容量、量化减位宽。容量与位宽是两个独立维度。
八、共同局限
- 训练成本前置:蒸馏本质是「用训练成本换推理成本」,预算不够时收益打折。
- 容量鸿沟:teacher 与 student 差距过大时学生学不动,需要 teacher assistant 或分阶段蒸馏。
- 任务相关性强:任务级蒸馏的结果可能在新任务上泛化差;通用蒸馏(DistilBERT/MiniLM 路线)更稳但收益更温和。
- 评估要防「贴脸」:在小测试集上学生可能过拟合 teacher 的噪声;用独立测试集 + 校准分布评估。
延伸阅读
- 模型压缩 —— 蒸馏、剪枝、低秩的工程全貌
- 量化经典:LLM.int8 / GPTQ / AWQ —— 蒸馏 + 量化的组合拳
- 论文地图 —— 蒸馏家族在领域图谱中的位置
- 模型格式与转换 —— 蒸馏产物如何导出、跨框架落地
- 从零部署一个模型 —— 把小模型完整部署上线的动手路线
参考资料
- Distilling the Knowledge in a Neural Network(arXiv 1503.02531)
- DistilBERT, a distilled version of BERT(arXiv 1910.01108)
- TinyBERT: Distilling BERT for Natural Language Understanding(arXiv 1909.10351)
- MiniLM: Deep Self-Attention Distillation for Task-Agnostic Compression of Pre-Trained Transformers(arXiv 2002.10957)