4. 温度系数 T 的数学原理:Softmax 回顾与温度调优

温度系数 T,说白了就是知识蒸馏里那个「拧阀门」的东西。你拧得大一点,概率分布就变软;拧得小一点,就变硬。我刚开始接触蒸馏时,总觉得这玩意儿不就是个超参数嘛,随便设个 1 或者 5 就完事了。直到有一次,我调了整整两天,模型就是不收敛……后来才发现,是 T 设得太离谱了。

这一章,咱们就把 T 的数学底裤扒干净。从 Softmax 函数开始,一步步看 T 到底怎么影响概率分布,高温和低温下模型的行为到底差在哪。

4.1 Softmax 函数回顾

先回到最基础的东西。Softmax 函数,说白了就是把一组实数(logits)变成概率分布。公式长这样:

Softmax(z_i) = exp(z_i) / Σ_j exp(z_j)

其中 z_i 是第 i 个类别的 logit 值。这个函数有几个特点:

  • 输出值都在 0 到 1 之间
  • 所有输出加起来等于 1
  • 指数运算放大了大 logit 和小 logit 之间的差距

举个例子。假设我们有三个类别的 logits:z = [2.0, 1.0, 0.1]。算一下 Softmax:

exp(2.0) = 7.389
exp(1.0) = 2.718
exp(0.1) = 1.105
总和 = 11.212

概率 = [7.389/11.212, 2.718/11.212, 1.105/11.212]
     = [0.659, 0.242, 0.099]

你看,最大的 logit 2.0 对应的概率是 0.659,占了将近三分之二。这就是 Softmax 的「赢家通吃」效应——它会让大的更大,小的更小。

关键点:Softmax 的本质是一个「软化的 argmax」。它保留了最大值的相对优势,但不像 argmax 那样直接丢掉所有其他信息。

4.2 温度 T 如何改变概率分布

现在引入温度系数 T。带温度的 Softmax 公式变成:

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

T 是一个正数。T 越大,logits 被压缩得越厉害;T 越小,logits 被放大得越厉害。就这么简单。

我习惯把 T 理解成一个「放大镜」:

  • T > 1:把 logits 缩小,相当于用广角镜看,差异变小了
  • T = 1:原样输出,就是标准的 Softmax
  • T < 1:把 logits 放大,相当于用显微镜看,差异变大了

咱们用刚才的例子,看看不同 T 下的效果:

温度 T 类别 1 概率 类别 2 概率 类别 3 概率 分布特点
T = 0.5 0.880 0.108 0.012 极度尖锐,几乎 one-hot
T = 1.0 0.659 0.242 0.099 标准 Softmax
T = 2.0 0.457 0.315 0.228 分布变软,差距缩小
T = 5.0 0.366 0.332 0.302 接近均匀分布
T → ∞ 0.333 0.333 0.334 完全均匀

看到没?T 从 0.5 变到 5.0,概率分布从「一家独大」变成了「三足鼎立」。这就是温度系数的魔力——它控制着模型对自己预测结果的「自信程度」。

我的经验:在实际项目中,我一般把 T 的范围定在 1 到 10 之间。T 太小(比如 0.1)会让分布几乎变成 one-hot,学生模型学不到类别间的相似关系;T 太大(比如 20)会让分布太平,学生模型学到的全是噪声。

4.3 高温与低温下的行为差异

为什么蒸馏时要用高温?为什么推理时又用低温?这里面的门道,我花了好一阵子才真正搞明白。

低温(T < 1):尖锐模式

低温下,Softmax 的输出接近 one-hot 向量。模型几乎只关注最大概率的那个类别,其他类别的信息被压缩到几乎为零。

  • 优点:分类决策清晰,适合推理阶段
  • 缺点:丢失了类别间的相似性信息
  • 适用场景:模型推理、硬标签训练

举个例子。一张猫的图片,低温下模型输出可能是 [0.98, 0.01, 0.01]。你只知道它「是猫」,但不知道它「有点像狗,但更像猫」。这种信息对学生模型来说太「硬」了。

高温(T > 1):软化模式

高温下,Softmax 的输出变得平滑。模型不仅告诉你「最可能是猫」,还告诉你「第二可能是狗,第三可能是狐狸」。这些「软标签」包含了丰富的类别间关系。

  • 优点:保留了类别间的相似性结构
  • 缺点:温度太高会引入噪声
  • 适用场景:知识蒸馏的训练阶段

我做过一个实验:用 ResNet-50 蒸馏一个 MobileNet,T=1 时学生准确率只有 68%,T=4 时提升到了 73%。为什么?因为高温下教师模型告诉学生「猫和狗其实挺像的,但猫和汽车完全不像」。这种结构化的知识,比单纯的硬标签有用得多。

避坑指南:我曾经在一个细粒度分类任务上把 T 设到了 8,结果学生模型学出来全是「和稀泥」——所有类别的概率都差不多。后来才发现,细粒度分类的类别本身就很相似,高温会把它们彻底搅成一锅粥。对于这类任务,T 设在 2-3 之间比较合适。

4.4 温度 T 的数学直觉

咱们从数学上再深挖一层。为什么 T 能控制分布的「软硬」?

关键在指数函数的曲率上。当 T 很大时,z_i / T 的值变得很小,指数函数 exp(z_i / T) 近似于 1 + z_i / T(泰勒展开的一阶近似)。这时候 Softmax 退化成:

Softmax(z_i / T) ≈ (1 + z_i / T) / Σ_j (1 + z_j / T)
                = (1 + z_i / T) / (K + Σ_j z_j / T)

其中 K 是类别数。当 T → ∞ 时,所有类别的概率都趋近于 1/K,也就是均匀分布。

反过来,当 T → 0 时,z_i / T 变得极大,指数函数会「爆炸」。最大的那个 logit 对应的概率趋近于 1,其他趋近于 0。这就是 one-hot 分布。

说白了,温度 T 就是在「均匀分布」和「one-hot 分布」之间插值。T 越大,越均匀;T 越小,越尖锐。

核心公式:带温度的 Softmax 可以写成:

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

当 T → 0 时,p_i → one-hot;当 T → ∞ 时,p_i → 1/K。

4.5 知识蒸馏中的温度策略

蒸馏时,温度 T 的设定直接影响训练效果。我总结了一套经验法则:

  1. 教师模型生成软标签时:用较高的 T(通常 3-8),让分布充分软化
  2. 学生模型训练时:用相同的 T 计算软标签的损失,同时用 T=1 计算硬标签的损失
  3. 学生模型推理时:用 T=1,恢复标准的分类决策

为什么训练和推理要用不同的 T?因为训练时我们想让学生学到类别间的相似性,推理时我们只需要它做出正确的分类决策。这两个目标,用同一个 T 是搞不定的。

下面这张图展示了温度 T 对概率分布的影响:

温度 T 对 Softmax 概率分布的影响 低温 T=0.5 猫 狗 狐 0.88 0.11 0.01 中温 T=1.0 猫 狗 狐 0.66 0.24 0.10 高温 T=5.0 猫 狗 狐 0.37 0.33 0.30 温度越低,分布越尖锐,模型越「自信」 温度越高,分布越平滑,模型越「保守」 温度 T 的核心作用 • 低温(T < 1):放大 logits 差异,输出接近 one-hot,适合推理 • 中温(T = 1):标准 Softmax,平衡分布 • 高温(T > 1):压缩 logits 差异,输出平滑分布,适合蒸馏训练

我的调参习惯:对于大多数分类任务,我会先试 T=4。如果学生模型学到的软标签分布太均匀(所有类别概率都差不多),就降低 T;如果分布太尖锐(几乎 one-hot),就升高 T。调 T 的过程,本质上是在「信息量」和「噪声」之间找平衡。

4.6 温度 T 与 KL 散度的关系

蒸馏损失函数的核心是 KL 散度。它衡量教师模型和学生模型输出分布之间的差异。温度 T 通过改变分布的形状,直接影响 KL 散度的值。

KL 散度的公式:

KL(p || q) = Σ_i p_i * log(p_i / q_i)

其中 p 是教师模型的软标签,q 是学生模型的输出。当 T 很大时,p 和 q 都接近均匀分布,KL 散度会变得很小,梯度信号弱,学生模型学得慢。当 T 很小时,p 接近 one-hot,KL 散度主要关注最大概率类别,忽略了类别间关系。

所以,T 的选择就是在「梯度强度」和「信息丰富度」之间做 trade-off。我一般用 T=4 作为起点,然后根据验证集的表现微调。

注意:不要忘了在计算 KL 散度时,两个分布要用相同的 T。我曾经犯过这个错——教师用 T=4,学生用 T=1,结果梯度方向完全不对,模型直接崩了。