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,概率分布会变得更「平滑」——最大值变小,其他类别的概率变大。这个平滑后的分布,就是软标签。

为什么需要平滑?因为硬标签只告诉你「这是猫」,但软标签告诉你「这有点像猫,也有点像狗,但完全不像汽车」。这种「类间相似度」信息,是小模型最需要学习的东西。

我的经验: 温度 T 一般设置在 3~10 之间。分类数越多、任务越细粒度,T 可以设得高一些。我曾经在细粒度鸟类分类任务上试过 T=20,效果反而更好。但 T 太高会把分布抹平到接近均匀分布,信息就没了。

1.4 蒸馏流程:训练阶段与推理阶段

整个流程分两步走:

  1. 训练教师模型: 用标准方式训练一个大模型,直到收敛。这一步没什么特别的,就是常规训练。
  2. 蒸馏学生模型: 固定教师模型权重,用教师输出的软标签 + 真实硬标签,联合训练学生模型。

蒸馏时的损失函数通常由两部分组成:

Loss = α * KL(教师软标签 || 学生软标签) + (1-α) * CE(学生硬输出, 真实标签)

其中:

  • KL 散度: 让学生软标签逼近教师软标签。温度 T 在这里起作用。
  • 交叉熵: 让学生硬输出逼近真实标签。保证学生不会偏离 ground truth。
  • α: 平衡系数,通常 0.7~0.9。我个人习惯设 0.8,大部分任务都适用。
避坑指南: 我曾经在蒸馏时忘记把教师模型设为 eval 模式,结果教师还在更新 BatchNorm 统计量,导致软标签不稳定,学生模型训练震荡。记得用 teacher.eval()。

1.5 知识蒸馏整体流程图

下面这张图展示了蒸馏的核心流程。你可以看到教师模型和学生模型如何协同工作。

知识蒸馏核心流程 教师模型 (Teacher) 学生模型 (Student) 输入数据 (Input) 软标签 (Soft Labels) 学生软输出 温度系数 T (Temperature Scaling) 蒸馏损失 = α·KL + (1-α)·CE 真实标签 (GT) 反向传播 → 更新学生模型参数 教师模型固定权重,只参与前向传播;学生模型通过蒸馏损失更新参数

1.6 蒸馏的几种常见形式

根据知识迁移的方式,蒸馏可以分成几类。我简单列一下:

  • Logit 蒸馏: 直接匹配教师和学生的输出 logits 或 softmax 概率。最经典,Hinton 2015 年那篇论文用的就是这种。
  • 特征蒸馏: 让学生中间层的特征图去匹配教师中间层的特征图。适合需要迁移空间信息的任务,比如目标检测、语义分割。
  • 关系蒸馏: 不匹配单个样本的输出,而是匹配样本之间的关系(比如样本间的距离矩阵)。适合小样本场景。

我个人用得最多的是 Logit 蒸馏,简单稳定。特征蒸馏调起来比较麻烦,需要对齐中间层的维度,而且不是所有层都适合做匹配。

选型建议: 如果你是第一次做蒸馏,从 Logit 蒸馏开始。调好温度 T 和 α 之后,再考虑要不要加特征蒸馏。别一上来就搞太复杂。

1.7 本章小结

知识蒸馏不是什么神秘的技术。它就是一个「大模型带小模型」的训练范式。核心就三点:

  • 用教师模型的软标签提供额外监督信号
  • 用温度系数 T 控制软标签的平滑程度
  • 用 KL 散度 + 交叉熵联合优化学生模型