1. 蒸馏初探

各位同学好,欢迎来到这门课的第一章。

知识蒸馏(Knowledge Distillation),说白了就是让一个小模型去模仿一个大模型的行为。我刚开始接触这个概念时,觉得它有点像「师傅带徒弟」——老师傅经验丰富,但行动慢;年轻人学得快,但缺火候。蒸馏要解决的,正是这个矛盾。

1.1 一个真实场景:为什么我们需要蒸馏?

想象一下,你训练了一个 ResNet-152,在 ImageNet 上准确率 78%。但部署时发现:

  • 模型太大(200+ MB),手机 App 装不下
  • 推理太慢(单张图 50ms),实时视频流扛不住
  • 功耗太高,边缘设备电池撑不过 2 小时

怎么办?直接换小模型?MobileNet 倒是快,但准确率掉到 68%,业务方不接受。

知识蒸馏就是来救场的。它让你保留大模型(教师)的「知识」,训练一个小模型(学生)去逼近教师的性能。我在一个工业质检项目里遇到过类似问题:大模型检测缺陷准确率 99.2%,但产线要求每张图 10ms 内出结果。蒸馏后,学生模型跑到 8ms,准确率只掉了 0.3%。嗯,这个 trade-off 是可以接受的。

1.2 教师-学生网络架构:直观理解

先看一张图,把整体结构刻在脑子里。

教师-学生网络蒸馏架构 教师网络(大模型) 学生网络(小模型) 输入数据(图片/文本/特征) 教师输出(软标签 + 硬标签) 学生输出(软标签 + 硬标签) 蒸馏损失(KL散度) 真实标签(Ground Truth) 学生损失(交叉熵) 总损失 = α × 蒸馏损失 + β × 学生损失 教师提供软标签作为「暗知识」,学生同时学习软标签和真实标签

这张图里,教师网络(蓝色)和学生网络(绿色)共享同一个输入。教师输出「软标签」——就是经过 softmax 后的概率分布,比如 [0.7, 0.2, 0.1]。学生不仅要拟合真实标签(红色箭头),还要拟合教师的软标签(红色虚线箭头)。

核心洞察:软标签比硬标签信息量更大。硬标签只说「这是猫」,软标签还告诉你「它有点像狗,但绝对不是汽车」。这种「类间相似度」就是教师传授的暗知识。

1.3 蒸馏的数学直觉

你可能要问:软标签到底怎么用?

关键在 softmax 的温度参数 T。公式很简单:

softmax(z_i, T) = exp(z_i / T) / Σ_j exp(z_j / T)

当 T=1 时,就是普通 softmax。T 越大,输出分布越「软」——概率值更均匀,类间关系更明显。

温度 T 输出分布示例(3 类) 信息特点
T=1 [0.98, 0.01, 0.01] 几乎只有正确类信息
T=3 [0.70, 0.20, 0.10] 保留类间相似度
T=10 [0.40, 0.35, 0.25] 分布平滑,暗知识丰富

我个人习惯用 T=3 到 T=5 之间。T 太低,软标签跟硬标签没区别;T 太高,分布太平,噪声太多。我曾经试过 T=20,结果学生模型学了一堆噪声,准确率反而下降了。

1.4 蒸馏的三种典型场景

  1. 模型压缩:大模型 → 小模型。最常见,比如 BERT-large 蒸馏到 TinyBERT。
  2. 集成蒸馏:多个教师 → 一个学生。把多个模型的「共识」教给学生。
  3. 自蒸馏:自己教自己。先用大模型训练,再用它教一个小版本。

我的经验:如果你刚入门,先从「单教师 → 单学生」开始。集成蒸馏虽然效果好,但调试复杂度翻倍。我第一个蒸馏项目就踩了这个坑——同时用了 3 个教师,结果学生不知道该听谁的,收敛极慢。

1.5 什么时候该用蒸馏?

不是所有场景都需要蒸馏。我列个清单帮你判断:

  • ✅ 适合用蒸馏:你有现成的大模型(或能训练大模型),但部署资源受限;你需要同时保持高精度和低延迟;你的数据量足够(至少几万张图)。
  • ❌ 不适合用蒸馏:你的小模型已经够用(比如 MobileNet 跑在 95% 准确率上);你只有几百条数据(蒸馏需要教师提供稳定的软标签分布);你的教师模型本身就不准(准确率低于 80% 的教师教不出好学生)。

避坑指南:我曾经在一个小样本场景(2000 张图)硬上蒸馏,结果学生模型比直接训练还差。后来分析发现,教师模型在数据稀疏区域输出不稳定,软标签方差太大,学生反而学到了错误的知识。所以,数据量不够时,别急着蒸馏。

1.6 本章小结

知识蒸馏的核心就三句话:

  • 教师网络提供软标签,传递类间相似度信息
  • 学生网络同时学习软标签和真实标签
  • 温度 T 控制软标签的「软硬程度」