Skip to content

蒸馏经典:KD 与蒸馏家族

本页速览 蒸馏(knowledge distillation)用大模型教小模型,是部署场景中「用训练成本换推理成本」的核心手段。本文精读 Hinton KD 与 BERT 系蒸馏(DistilBERT、TinyBERT、MiniLM)。

蒸馏经典: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。

方法核心

  • 蒸馏目标分四层
    1. 嵌入层输出对齐;
    2. 注意力矩阵对齐(学生每层注意力分布 ≈ teacher 对应层,这是核心创新);
    3. 隐藏状态对齐(含经过线性变换的学生/teacher hidden states 对齐);
    4. 输出层对齐(软标签)。
  • 两阶段框架:先在通用语料预训练阶段蒸馏一次(拿到通用小模型),再在任务微调阶段针对每个下游任务再蒸馏一次——「通用蒸馏打底、任务蒸馏精调」。
  • 层映射: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 证明:蒸馏目标不是越全越好,而是越「结构化」越好——抓住「模型怎么组织信息」(注意力关系),比逐层逐目标对齐更高效。这给部署侧的启示是:当资源紧张时,优先保住模型的信息组织方式,而不是数值逐位对齐

五、对比总表

模型参数量性能保留推理加速蒸馏目标蒸馏阶段
DistilBERT40%(110M→66M)~97%快 60%软标签 + hidden states 余弦预训练
TinyBERT(4 层)约 1/7.5(vs BERT-base)96.8%(6 层持平)快 9.4x嵌入+注意力矩阵+隐藏状态+输出预训练 + 任务两阶段
MiniLM50%(12→6 层)99%+约 2x最后一层自注意力关系(QK^T + V^T V)预训练式,深度无关

六、蒸馏与量化:组合拳

蒸馏和量化正交,可以叠加:先蒸馏出小模型,再对小模型量化,比「直接量化大模型」通常精度更好、也比「只蒸馏不量化」更省显存。

  • 为什么先蒸馏:小模型权重分布更规整、离群值更少,量化误差更可控(对照 LLM.int8 的离群值问题)。
  • 工程顺序:蒸馏降容量 → 量化降位宽 → 图优化/算子融合降延迟。
  • 注意:量化的校准集要来自蒸馏后模型的目标分布,别拿 teacher 的分布硬套。

部署视角的决策顺序

延迟和显存都吃紧、模型又不大(<1B):先蒸馏,不够再量化。模型很大(≥7B)且无法重训:直接量化(GPTQ/AWQ),见量化经典

七、对 LLM 的启示:蒸馏 vs 直接用更小模型

两个常被混淆的问题:

  1. 蒸馏和「直接训练一个小模型」有什么区别? 直接训练小模型从头学知识;蒸馏让小模型继承大模型已经提炼过的知识(软标签 + 结构对齐),同等容量下收敛更好、效果更接近大模型。
  2. LLM 时代蒸馏还重要吗? 重要,但形式变了:
    • 数据蒸馏:用大模型离线生成高质量数据/响应,训练小模型(Alpaca、Self-Instruct 的思路),这是当前 LLM 小模型的主流路线;
    • 在线/离线生成蒸馏:让教师模型指导学生模型在生成任务上对齐(需要克服分布坍塌等新问题);
    • 知识蒸馏到更强小模型:如 MiniLM 的 teacher assistant 思想在多阶段蒸馏里继续发光。
  3. 蒸馏 ≠ 替代量化:两者回答不同问题——蒸馏减容量、量化减位宽。容量与位宽是两个独立维度

八、共同局限

  • 训练成本前置:蒸馏本质是「用训练成本换推理成本」,预算不够时收益打折。
  • 容量鸿沟:teacher 与 student 差距过大时学生学不动,需要 teacher assistant 或分阶段蒸馏。
  • 任务相关性强:任务级蒸馏的结果可能在新任务上泛化差;通用蒸馏(DistilBERT/MiniLM 路线)更稳但收益更温和。
  • 评估要防「贴脸」:在小测试集上学生可能过拟合 teacher 的噪声;用独立测试集 + 校准分布评估。

延伸阅读

参考资料