温度缩放与 ECE:逐步校准模型置信度

通过 softmax,利用六个预测拟合温度,计算 ECE,并了解为什么更好的似然仍可能带来更差的分箱校准分数。

分享这篇文章

六个预测即使有四次正确,也可能讲述两种非常不同的概率故事。在下面的示例中,获胜类别从未改变。把每个 logit 除以拟合出的温度,只会降低或提高附着在每个获胜类别上的置信度。

这个小调整把平均负对数似然从 0.8230.823 提高到 0.8120.812。然后出现了一个尴尬的现象:用四个等宽分箱计算的期望校准误差,从 12.9%12.9\% 上升到 38.0%38.0\%

这套算术并不是温度缩放失败了。它揭示了一个更有用的教训:校准是预测概率与观测结果之间的关系,而 ECE 是对这种关系的一种依赖样本、依赖分箱的估计。 学完本课后,你将能够拟合温度、计算 ECE、在 Python 中重现两个结果,并解释为什么这两个数字都不能不加改变地迁移到新的部署总体。

当前的评估工作让这种区别具有实际意义。Google DeepMind 在 8 月 27 日发布的试点让专有模型权重与外部测试提示彼此保持隐藏,而 MLCommons 提供了保留的 AILuminate 子集。这些控制措施保护了测试材料,但并不决定概率应该描述哪个总体。NIST AI 800-3 对准确率提出了类似观点:固定基准问题上的表现与在更广泛的相似问题总体中的表现,是不同的测量目标。

概率预测包含一个可检验的承诺

假设一个分类器在许多相互独立的示例上以 0.80.8 的置信度预测类别 AA。校准后的置信度意味着这些预测中约有 80%80\% 是正确的。更正式地说,如果 Y^\hat{Y} 是预测类别,P^\hat{P} 是它报告的置信度,那么完美的顶层标签校准要求

Pr(Y=Y^P^=p)=p.\Pr(Y=\hat{Y}\mid \hat{P}=p)=p.

这个定义并没有说分类器是准确的。一个以 0.60.6 的置信度预测、并且 60%60\% 的时间成功的模型是经过校准的,尽管它经常出错。一个模型也可以正确地为每个示例排序,却为实际只有 80%80\% 成功率的案例报告 0.990.99。准确率问谁获胜;校准检查附带的概率是否兑现了承诺。

事件和总体都需要明确名称。“正确”可能意味着类别完全匹配、任务完成,或另一种评分结果。示例可能是使用某种语言的客户支持请求、基准问题,或明天的生产流量。改变任一方,概率陈述也会随之改变。关于这一选择背后的更广泛评估流程,请参阅评估如何塑造 AI 产品

温度转动置信度旋钮

分类器通常会输出 logit:针对 KK 个类别的无约束分数 z1,,zKz_1,\ldots,z_K。Softmax 将它们转换为概率:

pk=ezkj=1Kezj.p_k=\frac{e^{z_k}}{\sum_{j=1}^{K}e^{z_j}}.

温度缩放引入一个正数 TT

pk(T)=ezk/Tj=1Kezj/T.p_k(T)=\frac{e^{z_k/T}}{\sum_{j=1}^{K}e^{z_j/T}}.

T>1T>1 时,缩放后的 logit 之间的差距缩小,概率向量变得不那么集中。当 0<T<10<T<1 时,差距扩大,向量变得更尖锐。T=1T=1 会保持原概率不变。

对于第一个示例,logit 是 [3,1,0][3,1,0]。在求指数之前减去最大 logit,可以在不处理不必要的大数的情况下得到相同的 softmax:

softmax([3,1,0])=[1,e2,e3]1+e2+e3[0.844,0.114,0.042].\operatorname{softmax}([3,1,0]) =\frac{[1,e^{-2},e^{-3}]}{1+e^{-2}+e^{-3}} \approx[0.844,0.114,0.042].

T=1.23T=1.23 时,向量变为约 [0.779,0.153,0.068][0.779,0.153,0.068]。类别 AA 仍然获胜。事实上,任何正温度都会保留 logit 的排序,因此温度缩放不能改变预测类别或分类准确率;它只改变概率的集中程度。

根据留出的标签拟合一个标量

Guo 及其同事的同行评审校准论文在保持网络参数不变的同时,通过最小化留出验证集上的负对数似然(NLL)来拟合 TT。对于 nn 个有标签示例,目标函数是

L(T)=1ni=1nlogpi,yi(T),\mathcal{L}(T)=-\frac{1}{n}\sum_{i=1}^{n}\log p_{i,y_i}(T),

其中 pi,yi(T)p_{i,y_i}(T) 是分配给示例 ii 真实类别的缩放后概率。自信的错误会受到很大惩罚,因为真实类别的概率很小。

下面是完整的合成验证集。标签 AABBCC 代表三个任意类别;其中不涉及私人或高风险预测。

示例Logit真实类别预测类别正确?T=1T=1 时的置信度T=1.23T=1.23 时的置信度
1[3,1,0][3,1,0]AA0.8440.779
2[2.5,1,0][2.5,1,0]AA0.7660.701
3[3,0.5,0][3,0.5,0]BA0.8830.821
4[1.5,2,0][1.5,2,0]BB0.5740.537
5[0.5,0,1.5][0.5,0,1.5]CC0.6290.575
6[2,2.2,0][2,2.2,0]AB0.5180.496

搜索正温度得到 T1.22975T\approx1.22975。平均 NLL 从 T=1T=1 时的 0.822780.82278 降到拟合值处的 0.812430.81243。正如保留的类别排序所预期的,准确率仍为 4/64/6

这个集合有意做得很小,便于计算。它并不足以批准一个已部署的校准器,而且使用同样的六行来拟合 TT 并报告性能,会产生对泛化能力过于乐观的估计。

ECE 压缩可靠性图

可靠性图也叫校准曲线,它按置信度对预测分组。对于每个分箱 BmB_m,计算

acc(Bm)=1BmiBm1(y^i=yi)\operatorname{acc}(B_m) =\frac{1}{|B_m|}\sum_{i\in B_m}\mathbf{1}(\hat{y}_i=y_i)

以及

conf(Bm)=1BmiBmp^i.\operatorname{conf}(B_m) =\frac{1}{|B_m|}\sum_{i\in B_m}\hat{p}_i.

指示函数 1(y^i=yi)\mathbf{1}(\hat{y}_i=y_i) 在预测正确时为 11,否则为 00。当一个分箱的准确率等于其平均置信度时,它位于理想对角线上。

期望校准误差对各分箱的绝对差距取样本加权平均:

ECE=m=1MBmnacc(Bm)conf(Bm).\operatorname{ECE} =\sum_{m=1}^{M}\frac{|B_m|}{n} \left|\operatorname{acc}(B_m)-\operatorname{conf}(B_m)\right|.

下面的计算使用四个固定的等宽置信区间:[0,0.25)[0,0.25)[0.25,0.50)[0.25,0.50)[0.50,0.75)[0.50,0.75)[0.75,1][0.75,1]。空分箱不产生贡献。

六个样本计算的四分箱可靠性图。温度缩放使置信度向中间移动,但样本也跨越了分箱边界,因此分箱 ECE 估计反而变差。
温度缩放前后的可靠性点 对角线表示完美校准。缩放前,两个圆点分别位于平均置信度 0.574、准确率 0.667 和置信度 0.831、准确率 0.667。缩放后,三个方点分别位于置信度 0.496、准确率 0,置信度 0.604、准确率 1,以及置信度 0.800、准确率 0.500。小样本和跨分箱使 ECE 从 12.9% 增加到 38.0%。
图中所表示的精确分箱统计
温度置信度区间样本数平均置信度准确率
1.00[0.50, 0.75)30.5740.667
1.00[0.75, 1.00]30.8310.667
1.23[0.25, 0.50)10.4960.000
1.23[0.50, 0.75)30.6041.000
1.23[0.75, 1.00]20.8000.500

缩放前,[0.50,0.75)[0.50,0.75) 中的三个预测贡献

360.6670.5740.047,\frac{3}{6}|0.667-0.574|\approx0.047,

[0.75,1][0.75,1] 中的三个预测贡献约为 0.0820.082。两者相加为 ECE0.129\operatorname{ECE}\approx0.129,即 12.9%12.9\%

缩放后,一个预测跨到了 0.500.50 以下,其他示例组成大小为三个和两个的分组。三个分箱贡献约为 0.0830.0830.1980.1980.1000.100,得到 ECE0.380\operatorname{ECE}\approx0.380,即 38.0%38.0\%

更好的似然,更差的 ECE

拟合出的温度优化的是 NLL,而不是四分箱 ECE。NLL 评估分配给每个真实类别的完整概率,并且随 TT 平滑变化。ECE 把预测丢进区间,丢弃分箱内的细节,并在置信度越过边界时突然变化。

六个示例放大了这种不稳定性。一个单样本分箱中的错误会带来 0%0\% 的准确率;一个正确结果会让同一个分箱达到 100%100\% 的准确率。移动边界或选择不同数量的分箱,可能在不改变任何预测的情况下产生不同的 ECE。Guo 等人明确指出,ECE 是分箱近似,结果可能受到分箱方案影响。scikit-learn 的校准指南同样把曲线与直方图放在一起,因为没有样本计数的单个点很容易被过度解读。

因此,这个例子支持三个彼此独立的陈述:

  • 选定的 TT 改善了这六行上的 NLL;
  • 温度缩放让它们的预测类别和准确率保持不变;
  • 四分箱 ECE 在同样的行上变差。

这些都不能说明校准器会改善新样本的概率。这个问题需要从部署决策所涉及总体中抽取的、未触碰的评估数据。

用 NumPy 重现每个数字

下面的程序对一个正标量进行密集搜索。这个网格有意保持透明;生产代码可以使用有界标量优化器,并且应保留独立的最终评估集。

import numpy as np

logits = np.array([
    [3.0, 1.0, 0.0],
    [2.5, 1.0, 0.0],
    [3.0, 0.5, 0.0],
    [1.5, 2.0, 0.0],
    [0.5, 0.0, 1.5],
    [2.0, 2.2, 0.0],
])
labels = np.array([0, 0, 1, 1, 2, 0])

def probabilities(temperature):
    scaled = logits / temperature
    scaled -= scaled.max(axis=1, keepdims=True)
    exp = np.exp(scaled)
    return exp / exp.sum(axis=1, keepdims=True)

def nll(temperature):
    p = probabilities(temperature)
    return -np.log(p[np.arange(len(labels)), labels]).mean()

temperatures = np.linspace(0.25, 4.0, 15_001)
temperature = temperatures[np.argmin([nll(t) for t in temperatures])]

def ece(temperature, edges=np.linspace(0.0, 1.0, 5)):
    p = probabilities(temperature)
    predictions = p.argmax(axis=1)
    confidence = p.max(axis=1)
    correct = predictions == labels
    total = 0.0
    for lower, upper in zip(edges[:-1], edges[1:]):
        in_bin = (confidence >= lower) & (confidence < upper)
        if upper == 1.0:
            in_bin = (confidence >= lower) & (confidence <= upper)
        if in_bin.any():
            total += in_bin.mean() * abs(
                correct[in_bin].mean() - confidence[in_bin].mean()
            )
    return total

print(f"T={temperature:.5f}")
print(f"NLL: {nll(1.0):.5f} -> {nll(temperature):.5f}")
print(f"ECE: {ece(1.0):.3f} -> {ece(temperature):.3f}")

预期输出约为:

T=1.22975
NLL: 0.82278 -> 0.81243
ECE: 0.129 -> 0.380

校准器属于一个测量契约

一份可辩护的校准记录应说明模型检查点、未缩放的 logits、结果定义、总体、数据时间窗口、划分方法、拟合出的 TT、优化目标、可靠性分箱边界、分箱计数,以及至少一种 NLL 这样的适当评分规则。在用来训练分类器之外的示例上拟合校准器,然后在未触碰的数据上评估它。

分布偏移是决定性的边界情况。在干净的基准问题上拟合的温度,对于短提示、另一种语言、新的类别混合,或产品变更后收集的输入,可能是错误的。温度缩放无法修复糟糕的类别排序,无法检测未见过的领域,也无法证明系统安全。它只会在拟合一个数字时所使用的验证假设下重新缩放 logits。

因此,部署评审应把可靠性曲线和样本计数放在 ECE 旁边,而不是把这个标量当作证书。如果新的群组让这些点偏离对角线,下一步不是为旧 ECE 辩护,而是确定哪个总体发生了变化,收集足够标签来测量变化,并决定校准契约是否仍然描述正在使用的系统。

资料来源

  1. On Calibration of Modern Neural Networks
  2. NIST AI 800-3 expands the AI evaluation toolbox
  3. scikit-learn probability calibration documentation
  4. Google DeepMind's double-blind AI evaluation pilot
  5. MLCommons on AILuminate's double-blind reliability evaluation