1. 知识蒸馏概述
1.1 什么是知识蒸馏?
知识蒸馏,说白了就是「大模型教小模型」。
你训练了一个巨大的神经网络——比如 ResNet-152 或者 BERT-Large——它在 ImageNet 或某个 NLP 任务上表现很好。但模型太大,手机装不下,推理速度也慢。这时候你让这个大模型(我们叫它 Teacher)去「教」一个小模型(Student),让小模型学到大模型的「知识」。这个过程,就是知识蒸馏。
我最早接触这个概念是在 2018 年,当时做移动端图像分类。大模型精度 92%,但 200MB 的权重文件根本没法上线。后来用蒸馏,小模型只有 5MB,精度掉了不到 1%。嗯,从那以后我就再也没裸训过小模型。
1.2 为什么需要知识蒸馏?
直接训练一个小模型不行吗?我试过,效果差很多。原因其实很直观:
- 容量差距: 大模型参数量大,能学到更丰富的特征表示。小模型参数少,自己学容易陷入局部最优。
- 软标签的信息量: 大模型输出的概率分布(比如猫 0.7、狗 0.2、老虎 0.1)比硬标签(猫 1、狗 0、老虎 0)包含更多信息。它告诉你「猫和狗有点像,但和老虎更接近」——这种关系硬标签完全体现不了。
- 部署约束: 边缘设备、手机、IoT 芯片,算力和内存都有限。大模型跑不动,小模型精度又不够。蒸馏是平衡精度和效率的最佳方案之一。
我举个例子。之前做一个实时视频分析项目,要求 30fps 以上。大模型单帧推理 200ms,完全不行。蒸馏后的小模型 15ms,精度只降了 0.3%。客户很满意。
| 对比维度 | 直接训练小模型 | 知识蒸馏小模型 |
|---|---|---|
| 训练数据需求 | 需要大量标注数据 | 可利用教师模型的软标签 |
| 泛化能力 | 一般,容易过拟合 | 强,继承了教师的泛化模式 |
| 收敛速度 | 慢 | 快,因为有教师指导 |
| 最终精度 | 通常低于蒸馏模型 | 接近甚至持平教师模型 |
1.3 核心思想:软标签与温度系数
蒸馏最核心的两个概念:软标签和温度系数 T。
你想想看,一个分类模型最后一层是 Softmax,输出的是概率。如果温度 T=1,就是标准的 Softmax。但如果 T>1,概率分布会变得更「平滑」——最大值变小,其他类别的概率变大。这个平滑后的分布,就是软标签。
为什么需要平滑?因为硬标签只告诉你「这是猫」,但软标签告诉你「这有点像猫,也有点像狗,但完全不像汽车」。这种「类间相似度」信息,是小模型最需要学习的东西。
1.4 蒸馏流程:训练阶段与推理阶段
整个流程分两步走:
- 训练教师模型: 用标准方式训练一个大模型,直到收敛。这一步没什么特别的,就是常规训练。
- 蒸馏学生模型: 固定教师模型权重,用教师输出的软标签 + 真实硬标签,联合训练学生模型。
蒸馏时的损失函数通常由两部分组成:
Loss = α * KL(教师软标签 || 学生软标签) + (1-α) * CE(学生硬输出, 真实标签)
其中:
- KL 散度: 让学生软标签逼近教师软标签。温度 T 在这里起作用。
- 交叉熵: 让学生硬输出逼近真实标签。保证学生不会偏离 ground truth。
- α: 平衡系数,通常 0.7~0.9。我个人习惯设 0.8,大部分任务都适用。
1.5 知识蒸馏整体流程图
下面这张图展示了蒸馏的核心流程。你可以看到教师模型和学生模型如何协同工作。
1.6 蒸馏的几种常见形式
根据知识迁移的方式,蒸馏可以分成几类。我简单列一下:
- Logit 蒸馏: 直接匹配教师和学生的输出 logits 或 softmax 概率。最经典,Hinton 2015 年那篇论文用的就是这种。
- 特征蒸馏: 让学生中间层的特征图去匹配教师中间层的特征图。适合需要迁移空间信息的任务,比如目标检测、语义分割。
- 关系蒸馏: 不匹配单个样本的输出,而是匹配样本之间的关系(比如样本间的距离矩阵)。适合小样本场景。
我个人用得最多的是 Logit 蒸馏,简单稳定。特征蒸馏调起来比较麻烦,需要对齐中间层的维度,而且不是所有层都适合做匹配。
1.7 本章小结
知识蒸馏不是什么神秘的技术。它就是一个「大模型带小模型」的训练范式。核心就三点:
- 用教师模型的软标签提供额外监督信号
- 用温度系数 T 控制软标签的平滑程度
- 用 KL 散度 + 交叉熵联合优化学生模型