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 教师-学生网络架构:直观理解
先看一张图,把整体结构刻在脑子里。
这张图里,教师网络(蓝色)和学生网络(绿色)共享同一个输入。教师输出「软标签」——就是经过 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 蒸馏的三种典型场景
- 模型压缩:大模型 → 小模型。最常见,比如 BERT-large 蒸馏到 TinyBERT。
- 集成蒸馏:多个教师 → 一个学生。把多个模型的「共识」教给学生。
- 自蒸馏:自己教自己。先用大模型训练,再用它教一个小版本。
我的经验:如果你刚入门,先从「单教师 → 单学生」开始。集成蒸馏虽然效果好,但调试复杂度翻倍。我第一个蒸馏项目就踩了这个坑——同时用了 3 个教师,结果学生不知道该听谁的,收敛极慢。
1.5 什么时候该用蒸馏?
不是所有场景都需要蒸馏。我列个清单帮你判断:
- ✅ 适合用蒸馏:你有现成的大模型(或能训练大模型),但部署资源受限;你需要同时保持高精度和低延迟;你的数据量足够(至少几万张图)。
- ❌ 不适合用蒸馏:你的小模型已经够用(比如 MobileNet 跑在 95% 准确率上);你只有几百条数据(蒸馏需要教师提供稳定的软标签分布);你的教师模型本身就不准(准确率低于 80% 的教师教不出好学生)。
避坑指南:我曾经在一个小样本场景(2000 张图)硬上蒸馏,结果学生模型比直接训练还差。后来分析发现,教师模型在数据稀疏区域输出不稳定,软标签方差太大,学生反而学到了错误的知识。所以,数据量不够时,别急着蒸馏。
1.6 本章小结
知识蒸馏的核心就三句话:
- 教师网络提供软标签,传递类间相似度信息
- 学生网络同时学习软标签和真实标签
- 温度 T 控制软标签的「软硬程度」