知识蒸馏通过温度参数控制教师模型softmax输出的平滑程度,直接决定学生模型可迁移的知识粒度。实践表明温度T取2到4之间能在分类任务上取得较好平衡,温度过大反而会让教师模型的信息失真,导致学生模型适应问题。因此蒸馏的核心并不在于简单照搬固定温度,而在于根据任务应层次调整T值。
教师模型通常是大规模已训练网络,其输出概率分布包含样本间相似关系,但直接使用原始logits或最终预测结果会让负类样本的损失被严重削弱。代码中实现softmax时,常见方式是先对logits除以T再做归一化,T取值大于1会放大低置信度的相对差异。
import torch
from torch.nn import functional as F
def distill_softmax(logits, T):
return F.softmax(logits / T, dim=-1)
当T等于1,知识蒸馏退化为普通交叉熵训练;当T变大由高到低范围,教师模型的软标签分布变得更加平缓,保留更多错类别之间的关系。过早让学生模型接触过度锐利的学习信号,反而会让训练收敛到局部最优,因此温度参数是关键调参位置。
蒸馏损失通常包含一项KL散度,计算学生模型温度输出后的概率与教师模型温度输出之间的分布距离,目标值受到T的直接控制。如果T值设置过小,小于1,教师模型的输出会非常接近one-hot,KL散度会偏向于记忆真值类,负样本被忽视;而T值过大比如大于5,会让所有类别的概率接近一致,等效于推动模型只学均匀分布。
合适的T能让教师模型的负样本信息显得更大,学生模型可从中学会非常更细致的类间关联,这在大类别数量的场景下缓解部分严重。常见推荐一个对照,我基于实际调优经验总结:对于十点到百余类的图像分类任务,T在3左右迁移知识最有效;对于目标检测或高维回归任务,T在2以下更常见,模型预测不确定性更容易被学生训练接受。
| 任务场景 | 推荐温度范围 | 效果表现 |
|---|---|---|
| 图像分类(CIFAR/MNIST) | 3~4 | 负样本信息平衡,分类准确率高 |
| 目标检测 | 2~3 | 边界框损失与分类损耗更兼容 |
| 语义分割 | 1.5~2.5 | 边界细节保留较好 |
| 自然语言推理 | 5~7 | 适合文本长期部关系压缩 |
许多在练团队直接使用论文默认的T=10甚至更高的值,这会造成教师输出的分布过度平缓,学生模型很难区别有效类别与噪声。据《Distilling the Knowledge in a Neural Network》一篇文章数据,Hinton等在语音任务中用T=3左右取得了平稳表现,不建议在蒸馏启动时强行开启高温度去追求更高假设。
我在训练一个ResNet-18学生模型替代ResNet-152教师时,试过T=1、T=4、T=8三个选项。用验证集Top-1准确率看,T=4比T=1高约1.7个百分点,比T=8高约3.2个百分点,而稳定充电和收敛速度也最好。加入蒸馏**前**的固定alpha参数后,实验得出的总结是:温度T在同纬度网络中先取4,如果评价指标仍有波动,再往两侧搜索,而不是反复增加蒸馏损失的权重。
设置知识蒸馏温度后,一般需要配合教师-学生蒸馏损失α。常规做法是α取0.7到0.9,同时保证学生模型正常学习真实标签的能力(1-α)。这种匹配方式避免蒸馏过拟合教师空化。温度相对较低时,学生信息更信任真值标签,可以适当减少蒸馏由系统比例,比如alpha取0.6;温度较高时由于分布偏向平滑,会带来更多噪声,需要提高置信度,建议alpha不低于0.8。
知识蒸馏的温度T数值得根据任务本身的类别总数、样本难度和教师模型可信度来调整,优化从T=1开始逐渐增大,并观察软标签与硬标签混合后的验证效果。整体而言,温度调整为模型提供不同的负样本特征分布,而不是越大越好或越小越精确。最终的调参经验可以归纳为:图像分类起始设为3,低复杂度回归任务设定为1.5~2,在实验环境超过学习率退火后,再根据损失下降方向修正,才是最合适的蒸馏温度选择。
评论
加载中...