4. 交叉熵损失:交叉熵与KL散度的关系、硬标签损失与软标签损失的区别、在蒸馏中的角色
交叉熵损失,可以说是深度学习里最常用的损失函数之一了。但在知识蒸馏这个场景下,它的角色其实比很多人想象的要复杂一些。我刚开始做蒸馏的时候,也踩过不少坑——比如直接把硬标签的交叉熵套到软标签上,结果模型训出来效果很差。
这一节,我们就来把交叉熵和KL散度的关系理清楚,看看硬标签损失和软标签损失到底差在哪,以及它们在蒸馏中各自扮演什么角色。
4.1 交叉熵与KL散度的关系
先问一个问题:交叉熵和KL散度,到底是不是一回事?
严格来说,不是。但它们的关系非常紧密。
- 交叉熵:衡量两个分布之间的“距离”,但它不是对称的。公式是 H(p, q) = -∑ p(x) log q(x)。
- KL散度:衡量用分布q来近似分布p时,信息损失了多少。公式是 D_KL(p || q) = ∑ p(x) log (p(x)/q(x))。
你仔细看,其实交叉熵和KL散度就差了一个熵项:
D_KL(p || q) = H(p, q) - H(p)
其中 H(p) 是分布p的熵。如果p是固定的(比如真实标签分布),那 H(p) 就是个常数。这时候,最小化交叉熵等价于最小化KL散度。
我个人习惯在蒸馏场景中,把KL散度当作“软目标”的损失函数,而交叉熵则更多用在硬标签上。为什么?因为KL散度天然适合做分布之间的对齐,而交叉熵更适合做分类任务中的点估计。
核心结论:在蒸馏中,KL散度是软标签损失的理论基础,交叉熵是硬标签损失的理论基础。两者在优化方向上一致,但KL散度对分布的形状更敏感。
4.2 硬标签损失与软标签损失的区别
这个区别,说白了就是“一刀切”和“留余地”的区别。
| 对比维度 | 硬标签损失 | 软标签损失 |
|---|---|---|
| 标签形式 | one-hot 向量(如 [0, 0, 1, 0]) | 概率分布(如 [0.1, 0.2, 0.6, 0.1]) |
| 损失函数 | 交叉熵 | KL散度(或带温度的交叉熵) |
| 信息量 | 只告诉模型“正确答案是哪个” | 告诉模型“各类别的相对关系” |
| 训练难度 | 容易过拟合,尤其小模型 | 更平滑,泛化性更好 |
| 适用场景 | 标准分类任务 | 知识蒸馏、模型压缩 |
我在项目中遇到过这样一个情况:用硬标签训练一个小模型,准确率死活上不去。后来换成软标签损失,同样的模型结构,准确率直接涨了3个点。你想想看,硬标签只给了模型一个“正确答案”,但软标签却告诉了模型“猫和狗有点像,但和汽车完全不像”——这种类间关系,对小模型来说太重要了。
避坑指南:我曾经在蒸馏时直接把硬标签的交叉熵换成软标签的KL散度,结果发现模型收敛很慢。后来才意识到,软标签损失需要配合温度系数使用,而且学习率通常要比硬标签训练时小一个数量级。
4.3 交叉熵在蒸馏中的角色
在知识蒸馏的经典框架中,交叉熵其实扮演了两个角色:
- 硬标签监督:学生模型直接学习真实标签,保证基础分类能力。
- 软标签对齐:学生模型模仿教师模型的输出分布,学习类间关系。
这两个角色通常是通过一个加权损失函数来结合的:
L_total = α * L_hard + (1 - α) * L_soft
其中 L_hard 是硬标签交叉熵,L_soft 是软标签KL散度。α 是一个平衡系数,我一般设成 0.7 左右,但具体要看任务。
嗯,这里要注意:L_soft 的计算需要用到温度系数 T。教师模型和学生模型的 logits 都要先除以 T,再算 softmax,最后算KL散度。这个 T 的取值很关键,我们下一节会专门讲。
常见误区:有些同学直接把教师模型的 softmax 输出当作软标签,然后算交叉熵。这样做其实不对——因为教师模型的输出可能非常“尖锐”(接近 one-hot),这样软标签就失去了“软”的意义。正确的做法是先用温度系数软化教师输出,再和学生模型的软化输出做KL散度。
4.4 知识结构图:交叉熵在蒸馏中的完整流程
下面这张图,我把交叉熵和KL散度在蒸馏中的角色画了出来。你可以看到,硬标签和软标签分别走两条路径,最后合并成总损失。
从这张图你可以看到,蒸馏的损失函数其实是一个双通道结构。硬标签通道保证学生模型不会偏离真实答案太远,软标签通道则负责传递教师模型的“知识”。
我个人觉得,理解这个双通道结构,是掌握蒸馏损失函数调试的关键。很多同学只关注了软标签部分,忽略了硬标签的监督作用,结果模型训练不稳定。反过来,如果只重视硬标签,那蒸馏就退化成普通训练了,教师模型的价值完全没有发挥出来。
实战建议:在调试蒸馏损失时,我通常会先固定 α=0.5,然后观察两个损失项的量级。如果 L_hard 比 L_soft 大很多,说明硬标签主导了训练,需要调大 α 或者调整温度 T。反之亦然。这个平衡点,需要根据具体任务来摸索。