1. 知识蒸馏概述

各位同学好,我是这门课的主讲。今天咱们聊聊知识蒸馏——这个在模型压缩领域绕不开的话题。

先讲个我自己的经历。几年前我在做移动端人脸识别模型时,遇到了一个典型困境:大模型精度高,但跑在手机上卡得要命;小模型倒是快,可精度掉得让人心疼。后来我试了知识蒸馏,效果出乎意料——小模型精度提升了将近 5 个点,推理速度却几乎没变。嗯,从那时起我就知道,这玩意儿是工程落地的利器。

1.1 什么是知识蒸馏?

知识蒸馏,说白了就是“大模型教小模型”。

你想想看,一个训练好的大模型(我们叫它教师网络),它不光能给出正确答案,还能给出“这个答案有多确定”——比如分类猫和狗,教师网络可能输出“猫 0.9,狗 0.1”。但更关键的是,它还会输出“猫 0.7,狗 0.2,老虎 0.1”——这种软标签里藏着类别之间的相似关系。

小模型(学生网络)直接学这些软标签,比学硬标签(猫就是猫,狗就是狗)学得更快、更稳。这就是蒸馏的核心思想。

核心公式(简化版):

蒸馏损失 = α * 硬标签损失 + (1-α) * 软标签损失

其中软标签损失用 KL 散度衡量,温度系数 T 控制软标签的“软硬程度”。

1.2 为什么需要知识蒸馏?

我归纳了三个最直接的理由:

  • 模型太大,跑不动——BERT、ViT 这些动辄上亿参数的模型,手机、IoT 设备根本扛不住。
  • 数据标注太贵——蒸馏可以用教师网络的预测结果当“伪标签”,减少人工标注成本。
  • 小模型自己学不动——小模型直接训练容易过拟合或欠拟合,蒸馏相当于给了它一个“导航仪”。

我曾经在一个工业质检项目里试过:直接用 MobileNet 训练,精度只有 82%;用 ResNet-50 蒸馏后,同样大小的 MobileNet 精度飙到了 91%。你说香不香?

1.3 知识蒸馏的三大范式

蒸馏不是只有一种玩法。根据教师和学生网络的训练方式,我把它分成三类:

范式 教师网络 学生网络 典型场景
离线蒸馏 预训练好,固定不动 从头训练 大模型压缩、部署到移动端
在线蒸馏 与学生同步训练 同步训练 多任务学习、实时场景
自蒸馏 学生自己当老师 自己学自己 无额外教师、数据受限

1.3.1 离线蒸馏

这是最常用的方式。你先训练一个强大的教师网络,然后冻结它,用它生成的软标签去训练学生网络。

我习惯的做法是:教师网络用大模型(比如 ResNet-152),学生网络用小模型(比如 MobileNetV3)。训练时,学生同时学硬标签(真实标签)和软标签(教师输出)。

避坑指南:我曾经把温度系数 T 设得太大(T=20),结果软标签太“软”,学生学成了一团浆糊。后来我总结:分类任务 T 取 3~8 比较合适,检测任务可以适当调低。

1.3.2 在线蒸馏

在线蒸馏里,教师和学生一起训练。教师网络可能比学生大,但两者同步更新。

这种方式的优点是:教师能根据学生的反馈动态调整“教学重点”。缺点是训练成本高,两个网络同时跑,显存压力大。

我记得有个项目需要实时蒸馏,我用了在线蒸馏的变体——协同蒸馏,两个网络互相学习,效果比单方向蒸馏好了不少。

1.3.3 自蒸馏

自蒸馏有点意思——没有外部教师,学生自己当自己的老师。

具体做法:训练过程中,把模型早期的输出(或者深层的特征)当作“教师信号”,去指导后期的输出。这相当于让模型自己跟自己对齐。

我试过在 Transformer 上用自蒸馏,效果居然和用大模型蒸馏差不多。嗯,省去了训练教师网络的成本,真香。

1.4 核心概念详解

这几个概念你必须吃透,不然后面代码写起来容易懵。

1.4.1 教师网络与学生网络

  • 教师网络:通常是参数量大、精度高的模型。它负责提供“知识”,但不参与部署。
  • 学生网络:参数量小、推理快的模型。它负责学知识,最终部署到目标设备上。

选教师网络时,我建议不要选太复杂的——教师精度太高反而可能过拟合,学生学不到泛化能力。我一般选比学生大 3~5 倍的模型就够了。

1.4.2 温度系数 T

温度系数控制软标签的“软硬程度”。

公式很简单:

softmax(x_i / T)

当 T=1 时,就是普通的 softmax。T 越大,输出分布越平滑(类别间差异变小);T 越小,输出越尖锐(接近 one-hot)。

我个人的经验:

  • T 太小(< 2):软标签几乎变成硬标签,蒸馏效果不明显。
  • T 太大(> 10):软标签太均匀,学生学不到类别间的细微差异。
  • 推荐范围:分类任务 3~8,检测任务 2~5。

注意:温度系数只在计算软标签损失时使用。硬标签损失(比如交叉熵)不受 T 影响。

1.4.3 软标签 vs 硬标签

类型 含义 例子(三分类) 信息量
硬标签 one-hot 编码,只有正确类别为 1 [0, 1, 0] 低
软标签 概率分布,包含类别间相似关系 [0.1, 0.7, 0.2] 高

软标签的价值在于:它告诉学生“猫和狗更像,猫和汽车不像”。这种知识硬标签给不了。

1.5 知识蒸馏整体流程

下面这张图概括了蒸馏的完整流程:

知识蒸馏整体流程 教师网络 (大模型,预训练) 学生网络 (小模型,待训练) 训练数据 软标签(概率分布) 含类别间相似关系 学生输出(概率分布) 模仿教师分布 蒸馏损失 = α·硬标签损失 + (1-α)·软标签损失 软标签损失使用 KL 散度 + 温度系数 T 硬标签(真实标签) 反向传播 → 更新学生网络 💡 关键点 教师网络不参与反向传播 只更新学生网络参数

1.6 什么时候该用蒸馏?

我列了几个典型场景,你可以对照看看:

  • 模型部署到手机/嵌入式设备——蒸馏几乎是标配。
  • 数据量少,标注成本高——用教师网络生成伪标签。
  • 小模型训练不收敛——蒸馏提供额外的监督信号。
  • 需要同时保持精度和速度——蒸馏是性价比最高的方案之一。

我的建议:如果你手头有现成的大模型,别犹豫,直接上离线蒸馏。这是最稳、最可控的方式。在线蒸馏适合研究场景,自蒸馏适合没有额外教师资源的情况。

好了,这一章的内容就到这里。蒸馏的核心思想其实不复杂——就是让大模型当老师,小模型当学生。后面的章节我们会深入代码实现、调参技巧和工程落地细节。到时候咱们再细聊。