3. 知识蒸馏基础理论:软标签与硬标签;温度系数 T 的作用;KL 散度损失函数详解

知识蒸馏,说白了就是让一个小模型(学生)去模仿一个大模型(老师)的行为。我刚开始接触这个方向时,总觉得这不就是“抄作业”吗?后来在工业界做模型压缩,才真正体会到——抄作业也是有技巧的,抄得好不好,直接决定你上线后的推理速度和精度。

这一节,我们先把蒸馏最核心的三个概念讲透:软标签 vs 硬标签、温度系数 T 到底在干嘛、以及那个让两个分布对齐的 KL 散度损失函数。

3.1 软标签与硬标签:老师到底教什么?

先看一个最简单的分类场景。假设老师模型要区分猫、狗、兔子三类。输入一张图片,老师输出的 logits 是 [5.0, 1.2, 0.8]。

硬标签就是 one-hot 向量:猫是 1,其他是 0。你想想看,这种标签只告诉学生“这是猫”,但没告诉学生“这猫长得有点像狗,但绝对不是兔子”。信息量太少了。

软标签则是经过 softmax 后的概率分布,比如 [0.88, 0.08, 0.04]。它保留了类间相似性信息。猫和狗的概率接近,说明这两个类别在特征空间里挨得近;兔子的概率低,说明它离得远。

我个人习惯把软标签比作“老师的解题思路”,硬标签只是“标准答案”。学生光看答案,遇到新题还是不会;但看了老师的思路,就能举一反三。

核心区别:
  • 硬标签:只包含类别信息,信息熵低,容易过拟合。
  • 软标签:包含类间相似性,信息熵高,泛化能力更强。

我在项目中遇到过一个问题:直接用硬标签训练学生模型,精度总是比老师差一大截。后来换成软标签,学生模型在 30% 参数量下,只掉了不到 1 个点的精度。这就是软标签的价值。

3.2 温度系数 T:把分布“摊开”来看

软标签虽好,但有个问题——老师输出的概率分布往往太“尖锐”了。比如 [0.98, 0.01, 0.01],非目标类概率几乎为 0,类间相似性信息被淹没了。

这时候就需要 温度系数 T 出场。它的公式很简单:

q_i = exp(z_i / T) / Σ_j exp(z_j / T)

其中 z_i 是 logits,T 是温度系数。T 越大,分布越平滑;T 越小,分布越尖锐。

为什么会这样?你想想看,除以 T 相当于把 logits 的差距缩小了。原本 5.0 和 1.2 差 3.8,除以 T=5 后变成 1.0 和 0.24,差 0.76。softmax 后,非目标类的概率就明显抬高了。

T 值 猫 狗 兔子 特点
T=1 0.88 0.08 0.04 标准 softmax,分布尖锐
T=5 0.45 0.30 0.25 分布平滑,类间关系清晰
T=20 0.36 0.33 0.31 接近均匀分布,信息稀释

我一般建议 T 取 2~8 之间。太小了没效果,太大了会把噪声也放大。嗯,这里要注意:训练时用高温蒸馏,推理时学生模型用 T=1。这个切换千万别忘了。

经验之谈: 我曾经在 BERT 蒸馏时试过 T=20,结果学生模型学了一堆噪声,精度反而下降了。后来改成 T=4,效果立竿见影。温度不是越高越好,要找到那个“既能看到类间关系,又不被噪声淹没”的平衡点。

3.3 KL 散度损失函数:让两个分布对齐

蒸馏的核心损失函数就是 KL 散度。它衡量的是两个概率分布之间的差异。公式如下:

KL(P || Q) = Σ_i P(i) * log(P(i) / Q(i))

其中 P 是老师模型的软标签分布,Q 是学生模型的软标签分布。KL 散度越小,说明学生越像老师。

你可能会问:为什么不用交叉熵?其实 KL 散度和交叉熵本质上是等价的,只差一个常数项。但 KL 散度有更直观的物理意义——它表示用 Q 来编码 P 时,额外需要的比特数。

完整的蒸馏损失函数通常长这样:

L = α * KL(P_teacher || P_student) + (1-α) * CE(y_hard, y_true)

第一项是蒸馏损失,让学生模仿老师的软标签;第二项是硬标签损失,让学生不偏离真实标签。α 是平衡系数,我一般设 0.7 左右。

避坑指南: 我曾经在蒸馏时只用了 KL 散度,没加硬标签损失。结果学生模型虽然模仿了老师的分布,但对真实标签的拟合很差,精度掉了 3 个点。后来加上硬标签损失,问题就解决了。两个损失缺一不可。

3.4 知识蒸馏核心流程

把上面三个概念串起来,蒸馏的完整流程就清晰了。我画了一张图,帮你理清逻辑:

知识蒸馏核心流程 老师模型(大) 学生模型(小) 输入数据(同源) 软标签(T>1) 软标签(T>1) KL 散度损失 硬标签交叉熵损失 总损失 = α·KL + (1-α)·CE 反向传播更新学生 💡 关键点: ① 老师和学生用相同输入,但老师不更新参数;② 蒸馏时用高温 T,推理时学生用 T=1;③ α 通常取 0.5~0.9。

流程其实不复杂:输入数据同时喂给老师和学生 → 老师生成软标签(高温) → 学生也生成软标签(高温) → 计算 KL 散度 → 加上硬标签交叉熵 → 反向传播更新学生参数。

3.5 蒸馏 vs 普通训练:一张表说清楚

对比维度 普通训练 知识蒸馏
监督信号 硬标签(one-hot) 软标签 + 硬标签
损失函数 交叉熵 KL 散度 + 交叉熵
温度系数 无 T > 1(训练时)
信息量 低(只有类别) 高(含类间关系)
泛化能力 一般 更强
参数量 大模型直接训练 小模型模仿大模型

看到这里,你应该明白了:蒸馏不是简单的“让学生背答案”,而是让学生理解老师的“解题思路”。软标签提供了丰富的类间关系,温度系数让这些关系变得可读,KL 散度则量化了学生和老师之间的差距。