1、蒸馏入门:什么是知识蒸馏?为什么需要蒸馏?蒸馏的三大范式概览

大家好,我是你们这趟模型压缩之旅的向导。今天咱们聊聊知识蒸馏——这个听起来有点玄乎,但实际非常接地气的技术。

我第一次接触蒸馏,是在一个移动端部署的项目里。模型太大,手机跑不动。剪枝、量化都试了,效果还是差口气。后来前辈甩给我一篇 Hinton 的论文,说「你试试这个」。嗯,从此就入坑了。

1.1 什么是知识蒸馏?

说白了,知识蒸馏就是「大模型教小模型」。我们有一个性能强悍但笨重的大模型(叫 Teacher),还有一个轻量但能力不足的小模型(叫 Student)。蒸馏的过程,就是让 Student 模仿 Teacher 的行为,把 Teacher 的「知识」迁移过去。

你想想看,这跟人类师徒制很像。老师傅经验丰富,带徒弟的时候,不只是告诉他对错,还会讲「为什么这么做」「哪些细节要注意」。蒸馏也是这个道理——不只是让小模型学正确答案,还要学 Teacher 的「思考过程」。

核心定义: 知识蒸馏是一种模型压缩技术,通过让轻量学生模型模仿大型教师模型的输出分布或中间特征,从而在保持较高精度的前提下大幅减小模型体积和计算量。

1.2 为什么需要蒸馏?

这个问题我经常被问到。其实原因很直接:

  • 部署压力: 大模型动辄几百 MB,甚至几个 GB。手机、IoT 设备根本装不下。
  • 推理延迟: 线上服务要求毫秒级响应,大模型跑一次要几百毫秒,用户早跑了。
  • 能耗限制: 边缘设备电池有限,大模型推理一次耗电惊人。
  • 数据隐私: 有些场景不能把数据传到云端,必须本地推理。

我曾经在一个安防项目里,需要把检测模型塞进一个只有 2MB 内存的摄像头芯片里。原始模型 200MB,剪枝量化后还有 50MB。最后靠蒸馏,硬是压到了 1.8MB,精度只掉了 2 个点。那一刻,我真觉得蒸馏是魔法。

我的经验: 蒸馏不是万能的。如果 Teacher 本身精度就很差,那教出来的 Student 也好不到哪去。先确保 Teacher 足够强,再谈蒸馏。

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): 保持样本间的相似性关系
注意: Teacher 和 Student 的中间层尺寸往往不同,需要加一个适配层(Adaptation Layer)来对齐维度。我曾经忘了加这个,结果 loss 一直不降,排查了半天才发现。

1.3.3 关系蒸馏(Relation Distillation)

这个范式更「高级」一点。它不关注单个样本的输出或特征,而是关注样本之间的关系。比如,两张猫的图片在 Teacher 的特征空间里距离很近,那在 Student 的特征空间里也应该很近。

关系蒸馏特别适合那些对样本间关系敏感的任务,比如:

  • 人脸识别: 不同人的特征要拉开,同一个人的特征要聚拢
  • 检索任务: 相似样本的距离要近
  • 图数据: 节点之间的关系结构要保留

我做过一个行人重识别的蒸馏项目,用关系蒸馏比 Logit 蒸馏高了 5 个点的 Rank-1 准确率。因为行人重识别本质上就是学一个「谁和谁更像」的度量空间。

1.4 三大范式对比

范式 迁移内容 优点 缺点 适用场景
Logit 蒸馏 输出概率分布 实现简单,通用性强 忽略中间层信息 分类任务,通用场景
特征蒸馏 中间层特征图 保留空间/语义信息 需要适配层,调参复杂 检测、分割、细粒度分类
关系蒸馏 样本间关系 保留结构信息 计算量大,实现复杂 检索、度量学习、图数据

1.5 知识体系总览

下面这张图是我自己画的,把蒸馏的核心脉络串起来了。你看一眼就能明白三大范式之间的关系。

知识蒸馏三大范式总览 教师模型 (Teacher) 学生模型 (Student) Logit 蒸馏 输出概率分布对齐 特征蒸馏 中间层特征对齐 关系蒸馏 样本间关系对齐 核心思想 让轻量学生模型模仿大型教师模型的行为 三大范式分别从输出层、中间层、样本关系三个层面进行知识迁移

1.6 怎么选?我的建议

刚入门的时候,我建议你先从 Logit 蒸馏开始。它最简单,效果也最稳定。跑通了再尝试特征蒸馏,最后才是关系蒸馏。

具体选型可以参考:

  • 分类任务: Logit 蒸馏就够了,省心省力
  • 检测/分割: 特征蒸馏是主力,Logit 蒸馏做辅助
  • 检索/度量学习: 关系蒸馏效果最好,但实现也最复杂
一个小技巧: 实际项目中,我经常把 Logit 蒸馏和特征蒸馏结合起来用。两个 loss 加权求和,权重一般设 0.7 和 0.3。效果比单独用任何一个都好。