Temperature Scaling
温度缩放在 softmax 之前将模型的 logits 除以一个拟合值,使置信度与准确率相符,同时保持预测结果不变。
温度缩放是一种事后校准方法:在应用softmax之前,用一个正数 T 除以训练完成的分类器的 logits;T 根据留出数据选择,使模型的置信度与实际正确率相符。温度大于 1 会降低过度自信的概率值,温度小于 1 则会提高置信度不足的概率值。用同一个正数除以所有 logit 不会改变它们的顺序,因此预测类别不会变化,准确率也完全保持不变。在题为《现代神经网络的校准》的研究中,Guo 及其同事发现,现代深度网络的校准效果很差,而温度缩放作为 Platt 缩放的一种单参数变体,在他们测试的大多数数据集上都能有效校准模型,效果出人意料地好。
温度缩放的工作原理#
缩放后的 softmax 会将类别 i 的概率计算为 exp(z_i / T) / Σ_j exp(z_j / T),其中 z 是 logits。当 T = 1 时,模型保持不变;随着 T 增大,概率会趋近均匀分布;当 T 趋近于 0 时,最高类别的概率会趋近于 1。模型训练完成后,在冻结网络权重的情况下,使用留出的验证集最小化负对数似然(NLL)来拟合 T;NLL 与作为训练损失的交叉熵相同。由于只有一个参数,拟合只需几秒,而且验证集被过拟合的空间很小。下面的 PyTorch脚本会为 logits 放大了三倍的模型拟合 T:
import torch
import torch.nn.functional as F
# Held-out logits for 5,000 images and 10 classes from an overconfident model:
# labels are drawn so that softmax(logits / 3) is perfectly calibrated
torch.manual_seed(0)
logits = 9 * torch.randn(5000, 10)
labels = torch.multinomial(F.softmax(logits / 3, dim=1), 1).squeeze(1)
# Fit the single temperature that minimizes negative log-likelihood (NLL) on the held-out set
temperatures = torch.linspace(0.5, 6.0, 551)
nll = torch.stack([F.cross_entropy(logits / t, labels) for t in temperatures])
T = temperatures[nll.argmin()]
# Accuracy depends only on the argmax, which dividing by T never changes
accuracy = (logits.argmax(1) == labels).float().mean()
before = F.softmax(logits, dim=1).max(1).values.mean()
after = F.softmax(logits / T, dim=1).max(1).values.mean()
print(f"T = {T:.2f}, accuracy {accuracy:.3f}")
print(f"Mean confidence: {before:.3f} before, {after:.3f} after")拟合得到的 T 为 2.98,与真实的 3 倍系数接近。准确率保持在 0.663,而平均置信度从 0.880 降至 0.664,因此缩放后,模型的平均置信度与准确率相符。
网络为何会过度自信#
交叉熵训练会持续奖励网络在已经正确分类的训练样本上输出更大的 logit,因此即使新数据上的准确率已趋于稳定,模型的置信度仍会继续上升。Guo 及其同事指出,深度、宽度、权重衰减和批归一化都是影响校准偏差的重要因素。校准效果可以通过可靠性图衡量:该图按区间绘制准确率与置信度的关系;也可以通过期望校准误差(ECE)衡量:对各区间中的置信度与准确率之差求平均,并按落入各区间的预测数量加权。NLL 和 Brier 分数也会奖励校准效果。只要分数被当作概率解读,校准就很重要,例如转诊所有风险超过 30% 病例的医疗分诊规则、将不确定预测交由人工处理的系统,或选择置信度最低图像进行标注的主动学习循环。
目标检测器的温度缩放#
检测器通常使用独立的 sigmoid为每个类别打分,而非使用 softmax;温度的应用方式相同,即 sigmoid(z / T)。当 T 大于 1 时,分数会向 0.5 移动:高分降低,低分提高。在 YOLO26中,每个框的置信度是类别 logit 经过 sigmoid 后的结果,并在预测时与 conf 阈值 0.25 进行比较。因此,使用留出图像拟合的温度会改变哪些框能够超过该阈值,同时保持所有框的排序不变;平均精度均值(mAP)等排序指标正是依赖这种排序。
其他设置中的温度#
- 大语言模型(LLMs):采样温度以相同方式将每个下一词元的 logit 向量除以 T,用户手动设置该值,以在多样性和确定性之间权衡。当 T 接近 0 时,采样会接近贪心解码,即始终选择概率最高的词元。
- 知识蒸馏:Hinton 及其同事提出的蒸馏方法会提高教师模型和学生模型 softmax 输出的温度,让学生模型学习教师模型对错误类别给出的相对概率。
- 对比学习:CLIP 等模型会在 softmax 之前用学习到的温度除以图文相似度分数,从而控制损失函数将匹配对与其他样本区分得有多明显。
温度缩放与相关方法的比较#
- Platt 缩放:在 sigmoid 之前,为二分类器的分数拟合斜率和截距。温度缩放将其扩展到多类别情形,使用一个共享斜率 1 / T,且不含截距。
- 向量缩放和矩阵缩放:为每个类别分别学习权重和偏置,或在 logits 上学习一个完整矩阵。这些方法灵活性更高,也更容易过拟合,而且可能改变预测类别。
- 保序回归:一种从分数到概率的非参数单调映射,可与 Platt 缩放一起用于scikit-learn 的校准工具。
- 标签平滑:软化训练目标,例如将真实类别的目标值设为 0.9 而不是 1.0,以降低训练期间的过度自信。温度缩放只改变已训练完成模型的输出。
- 保形预测:将分数转换为预测集合,使集合以有保证的概率包含真实标签,例如在可交换数据上有 90% 的时间包含真实标签。










