1、蒸馏入门:什么是知识蒸馏?为什么需要蒸馏?蒸馏的三大范式概览
大家好,我是你们这趟模型压缩之旅的向导。今天咱们聊聊知识蒸馏——这个听起来有点玄乎,但实际非常接地气的技术。
我第一次接触蒸馏,是在一个移动端部署的项目里。模型太大,手机跑不动。剪枝、量化都试了,效果还是差口气。后来前辈甩给我一篇 Hinton 的论文,说「你试试这个」。嗯,从此就入坑了。
1.1 什么是知识蒸馏?
说白了,知识蒸馏就是「大模型教小模型」。我们有一个性能强悍但笨重的大模型(叫 Teacher),还有一个轻量但能力不足的小模型(叫 Student)。蒸馏的过程,就是让 Student 模仿 Teacher 的行为,把 Teacher 的「知识」迁移过去。
你想想看,这跟人类师徒制很像。老师傅经验丰富,带徒弟的时候,不只是告诉他对错,还会讲「为什么这么做」「哪些细节要注意」。蒸馏也是这个道理——不只是让小模型学正确答案,还要学 Teacher 的「思考过程」。
1.2 为什么需要蒸馏?
这个问题我经常被问到。其实原因很直接:
- 部署压力: 大模型动辄几百 MB,甚至几个 GB。手机、IoT 设备根本装不下。
- 推理延迟: 线上服务要求毫秒级响应,大模型跑一次要几百毫秒,用户早跑了。
- 能耗限制: 边缘设备电池有限,大模型推理一次耗电惊人。
- 数据隐私: 有些场景不能把数据传到云端,必须本地推理。
我曾经在一个安防项目里,需要把检测模型塞进一个只有 2MB 内存的摄像头芯片里。原始模型 200MB,剪枝量化后还有 50MB。最后靠蒸馏,硬是压到了 1.8MB,精度只掉了 2 个点。那一刻,我真觉得蒸馏是魔法。
1.3 蒸馏的三大范式
蒸馏发展了这么多年,主流方法可以归纳为三大类。我按自己的理解给你捋一捋。
1.3.1 Logit 蒸馏(Logit Distillation)
这是最经典、最常用的方式。Hinton 在 2015 年那篇论文里提出的。核心思想是:让 Student 的 Softmax 输出分布去拟合 Teacher 的 Softmax 输出分布。
为什么要拟合分布而不是直接学硬标签?因为分布里包含了「类间关系」。比如一张猫的图片,Teacher 输出「猫: 0.9, 狗: 0.08, 老虎: 0.02」。这个 0.08 和 0.02 就告诉 Student:猫和狗有点像,但和老虎差得远。这种「暗知识」是硬标签给不了的。
具体做法是引入一个温度参数 T:
# 伪代码示意
def distillation_loss(student_logits, teacher_logits, T=4):
# 软化概率分布
soft_student = softmax(student_logits / T)
soft_teacher = softmax(teacher_logits / T)
# 计算 KL 散度
loss = KL_divergence(soft_student, soft_teacher)
return loss
T 越大,分布越平滑,类间关系越明显。我一般习惯 T 取 3-5,效果比较稳。
1.3.2 特征蒸馏(Feature Distillation)
Logit 蒸馏只关注输出层,但 Teacher 中间层的特征图也包含丰富的语义信息。特征蒸馏就是让 Student 的中间特征去模仿 Teacher 的中间特征。
我在做目标检测蒸馏时,发现 Logit 蒸馏效果一般。后来改用特征蒸馏,让 Student 的特征图去对齐 Teacher 的特征图,mAP 直接涨了 3 个点。为什么?因为检测任务对空间位置敏感,中间层的特征图里藏着位置信息。
常用的做法包括:
- FitNet: 直接回归 Teacher 的中间特征
- AT(Attention Transfer): 对齐注意力图
- SP(Similarity-Preserving): 保持样本间的相似性关系
1.3.3 关系蒸馏(Relation Distillation)
这个范式更「高级」一点。它不关注单个样本的输出或特征,而是关注样本之间的关系。比如,两张猫的图片在 Teacher 的特征空间里距离很近,那在 Student 的特征空间里也应该很近。
关系蒸馏特别适合那些对样本间关系敏感的任务,比如:
- 人脸识别: 不同人的特征要拉开,同一个人的特征要聚拢
- 检索任务: 相似样本的距离要近
- 图数据: 节点之间的关系结构要保留
我做过一个行人重识别的蒸馏项目,用关系蒸馏比 Logit 蒸馏高了 5 个点的 Rank-1 准确率。因为行人重识别本质上就是学一个「谁和谁更像」的度量空间。
1.4 三大范式对比
| 范式 | 迁移内容 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| Logit 蒸馏 | 输出概率分布 | 实现简单,通用性强 | 忽略中间层信息 | 分类任务,通用场景 |
| 特征蒸馏 | 中间层特征图 | 保留空间/语义信息 | 需要适配层,调参复杂 | 检测、分割、细粒度分类 |
| 关系蒸馏 | 样本间关系 | 保留结构信息 | 计算量大,实现复杂 | 检索、度量学习、图数据 |
1.5 知识体系总览
下面这张图是我自己画的,把蒸馏的核心脉络串起来了。你看一眼就能明白三大范式之间的关系。
1.6 怎么选?我的建议
刚入门的时候,我建议你先从 Logit 蒸馏开始。它最简单,效果也最稳定。跑通了再尝试特征蒸馏,最后才是关系蒸馏。
具体选型可以参考:
- 分类任务: Logit 蒸馏就够了,省心省力
- 检测/分割: 特征蒸馏是主力,Logit 蒸馏做辅助
- 检索/度量学习: 关系蒸馏效果最好,但实现也最复杂