Calibration:ECE 降低后,拒答阈值就可靠吗?

Calibration:ECE 降低后,拒答阈值就可靠吗?

  • 系列:开源 AI 论文复现实验与代码解读 · 第五轮 078
  • 日期:2026-09-20
  • 读者:研究生、科研新人和工程型研究者
  • 复现范围:合成二分类上的温度拟合、校准指标与拒答协议;不复现原论文榜单。

目录

  1. 复现价值与论文假设
  2. 核心思想与公式
  3. 官方代码阅读路线
  4. 最小实验与运行方法
  5. 评测协议
  6. 实际结果与解释
  7. 失败排查与证据边界
  8. 后续科研问题
  9. 总结与参考资料

一、复现价值与论文假设

论文报告。 Guo、Pleiss、Sun、Weinberger 的 ICML 2017 论文研究神经分类器的概率校准,提出用单个温度参数做后处理,并在所测图像和文本任务上报告有效性。这是特定模型、数据和划分下的证据,不能直接替代今天任意大模型的测量。论文与全文

Geifman 与 El-Yaniv 的 NIPS 2017 工作讨论选择性分类:允许模型拒绝一部分输入,交换更低的接受集错误率。其风险控制论证依赖同分布独立采样等条件,还涉及统计上界。低 ECE 本身不构成这样的保证。论文全文

本次目标。 不训练大型网络,直接构造可追溯的分数失真,回答三个问题:能否恢复合理概率;是否改变预测答案和样本排序;校准集上的改进是否足以支持测试集拒答。这样做减少训练噪声,代价是不能据此判断真实网络为何过度自信。

二、核心思想与公式

logit 是归一化之前的类别分数。对样本的分数向量除以正温度,再经过 softmax,得到类别概率:

p i k ( T ) = exp ⁡ ( z i k / T ) ∑ j = 1 K exp ⁡ ( z i j / T ) , T ∗ = arg ⁡ min ⁡ T > 0 − 1 n ∑ i log ⁡ p i , y i ( T ) . p_{ik}(T)=\frac{\exp(z_{ik}/T)}{\sum_{j=1}^{K}\exp(z_{ij}/T)},\qquad T^*=\arg\min_{T>0}-\frac1n\sum_i\log p_{i,y_i}(T). pik(T)=∑j=1Kexp(zij/T)exp(zik/T),T∗=argminT>0−n1∑ilogpi,yi(T).

这里分数矩阵为 [n,K],标签为 [n],温度是标量;负对数似然 NLL 衡量给真实标签分配的概率。本次只用校准集拟合温度,原始分数保持不动。正温度不会改变单个样本的最大分数类别;但这不意味着所有样本之间的最大概率排序都不变。公式来源

令置信度为最大类别概率,把它分进等宽区间,期望校准误差 ECE 的样本估计为:

E C E ^ = ∑ m = 1 M ∣ B m ∣ n ∣ a c c ( B m ) − c o n f ( B m ) ∣ . \widehat{\mathrm{ECE}}=\sum_{m=1}^{M}\frac{|B_m|}{n} \left|\mathrm{acc}(B_m)-\mathrm{conf}(B_m)\right|. ECE =∑m=1Mn∣Bm∣∣acc(Bm)−conf(Bm)∣.

B_m 是第几个分数箱对应的样本集合,两个均值分别是箱内准确率和置信度;空箱贡献零。它是经过分箱的总体摘要,不是单条预测的可靠性标签。本次保存每箱样本数,并同时计算 NLL 和两类别概率平方误差之和,即本文采用的 Brier 分数。

拒答规则则是只接受置信度不低于阈值的样本:

a i = 1 c i ≥ τ , C ^ = ∑ i a i n , R ^ = ∑ i a i 1 y \^ i ≠ y i ∑ i a i . a_i=\mathbf1c_i\\ge\\tau,\quad \widehat C=\frac{\sum_i a_i}{n},\quad \widehat R=\frac{\sum_i a_i\mathbf1\\hat y_i\\ne y_i}{\sum_i a_i}. ai=1ci≥τ,C =n∑iai,R =∑iai∑iai1y\^i=yi.

C 是覆盖率,R 是接受集错误率,阈值为标量。没有任何样本被接受时,风险没有定义,代码写入 null,不能用零冒充成功。

三、官方代码阅读路线

先读作者温度缩放仓库的维护说明,再打开 temperature_scaling.py。沿着三个入口看:temperature_scale 广播标量并除 logits;set_temperature 在评估模式、无梯度状态收集验证分数,再让 LBFGS 只更新温度;_ECELoss 按左开右闭区间计算加权误差,默认十五箱。

这里输入必须是 logits,不能把已经归一化的概率当分数再做一次 softmax。当前源码还有显式 CUDA 调用,温度本身是直接声明的参数,没有正值重参数化。本地实现改用正的逆温度区间求根;这是算法层面的对应,没有宣称运行旧版官方环境。两个仓库均按检索时的 master 阅读,未锁定提交,后续版本兼容性待人工核验。

再读选择性分类仓库risk_control.py:先确认 residuals 中一代表错误,再追踪排序、候选阈值与二项分布上界。本文采用的经验风险网格选择没有实现该上界,不能借用论文的高概率保证。

四、最小实验与运行方法

图中的三个数据入口分别承担拟合温度、选择阈值和最终评估;测试标签不会回流到前两步。锁表示温度与阈值已经冻结,右侧是两个不同的评估视角,不是保证通过的认证。

本次构造三维标准正态输入,令线性信号为 s=1.5x₁−0.8x₂+0.5x₃。同分布标签按 sigmoid(s) 抽样,冻结打分器输出 [0,3s],人为放大三倍造成过度自信。这个数据机制下温度三有明确意义,但有限校准样本估计不会恰好等于三。

分布变化组保持输入分布不变,只把标签概率改为 sigmoid(0.5s−1),即条件分布发生变化。这不是随机打乱标签,也不是自然语言领域迁移。设置在查看结果前固定;没有根据测试分数修改系数或挑种子。

每个种子生成校准集、阈值集各一千零二十四条,以及同分布、变化分布测试集各四千零九十六条;种子固定为 78、79、80。每组数据独立生成并检查完整输入行不重复。没有模型训练集,因为打分函数预先指定,唯一拟合参数是温度。

在文章目录运行:

bash 复制代码
python3 -m pip install -r code/requirements.txt
python3 code/calibration.py
python3 code/audit.py

依赖与文件解释见 运行说明。实际环境为 Python 3.12.14、NumPy 2.3.5、CPU、双精度。程序打印 [1024,2] 分数与 [1024] 标签形状;逆温度在固定正区间内二分八十步求 NLL 导数的零点,保存轨迹。若根不在区间内会报错,避免静默输出边界解。

五、评测协议

先拟合温度,再分别对原始分数和校准分数在阈值集上扫描 0.50...0.99,步长零点零一。要求至少接受一百条且经验风险不超过一成,从可行候选中选择覆盖率最大者;无解则全部拒答。这里的一成只是选择条件,不是测试风险承诺。

两种策略冻结后,同时报告完整测试集准确率、NLL、Brier、五/十/十五/三十箱 ECE。对拒答,既报告统一的数值阈值零点九,也报告各自选出的阈值,始终成对报告风险和覆盖率。日志保存接受数、错误数和每条预测,避免只剩一个漂亮比例。

不要把校准集上的拟合损失直接当作泛化成绩。本文将温度拟合与阈值选择分开,仍然不能消除反复比较阈值带来的选择偏差;最终成绩只在独立测试集读取。若以后增加校准方法,方法选择也需要额外验证数据或嵌套划分,不能在当前测试集上挑最低 ECE 的方案。

二分类正温度缩放保持绝对 logit 差的顺序,因此按置信度排名截取相同数量样本,接受集合应一致。程序逐条比较排序和整条风险---覆盖率曲线;这个检查可以分辨概率刻度改善与筛选能力改善。多分类不能套用这一结论。

六、实际结果与解释

本次实际验证。 三次拟合温度为 2.7000、3.0224、3.0529。下表是三种数据种子的算术平均,误差项是种子间样本标准差,不是置信区间;完整结果见 实验记录

测试分布与分数 全集准确率 NLL 十五箱 ECE
同分布,原始 0.7558 0.7202 0.1451 ± 0.0016
同分布,校准 0.7558 0.4958 0.0174 ± 0.0058
条件变化,原始 0.6363 1.3834 0.2671 ± 0.0088
条件变化,校准 0.6363 0.7192 0.1310 ± 0.0120

固定阈值零点九时,同分布风险从 0.1623 降至 0.0579,覆盖率同时从 0.6799 降至 0.2206。校准后并没有突然会做更多题,而是同一个数值门槛变得严格。实际排序完全一致,相同覆盖率下风险曲线重合。

独立阈值集选出的校准阈值为 0.85、0.77、0.83,同分布测试风险平均 0.0987,覆盖率 0.4032。但种子 79 的风险为 0.1168,已经高于选择时的一成条件;不能用总体均值掩盖它。迁移到条件变化测试集后,平均风险升至 0.2769,覆盖率仍有 0.4176。

原始分数在种子 80 的预设网格中没有可行阈值,因此该策略覆盖率为零、风险未定义;更靠近一的阈值没有搜索,不能断言所有阈值都无解。这个差异还提醒我们:相同数值网格不代表相同候选接受集合,不能仅据网格结果宣布校准改善了排序。

七、失败排查与证据边界

先查统计定义。 附带二十条手工样例:十条置信度为零点六、九条答对;另十条置信度为零点九、六条答对。合成一个箱时 ECE 约为零,十箱时却为零点三。误差在大箱内相互抵消,足以说明单一分箱结果会隐藏问题;这不是本次模型的测试数据。

再查不变量。 温度为正时答案改变,应检查温度符号、类别轴、标签映射或浮点并列。多分类样例 [2,0,0][1.5,1.4,-10] 在温度一时最大概率分别约 0.787、0.525,温度十时约 0.379、0.434,跨样本顺序反转,却没有改变各自预测类别。

最后查证据范围。 两个脚本通过语法和 CPU 检查;独立标量审计重算保存的概率、各箱指标、阈值选择与风险曲线。开发时汇总器曾尝试对未定义风险取均值,已修正为保留空值,并记录有效种子数。详见 验证记录

另外,生成标签的概率是实验者已知的,但温度拟合只读取抽样标签,不能偷看真实概率。这保留了有限样本估计的不确定性。三组种子一起改变了输入和标签,因此标准差描述的是本合成机制下的重复采样变化,不能解释成真实任务上的稳定性保证。

本次没有执行官方网络、真实数据集、GPU 或自由文本回答评测,也没有实现带置信上界的拒答算法。大模型自述"有九成把握"、某个 token 的概率和整段答案正确率是不同对象,迁移实验前必须先固定预测单位和正确性标签。

八、后续科研问题

作者推断。 下一步优先保持模型冻结,换入真实分类 logits,按来源、时间或主体分组划分数据,考察校准误差是否集中在小群体。需要保留组内样本量,避免把少量错误解释成稳定规律。

这些方向还需要区分总体校准与条件校准。即使整体分数对得上,也可能存在某一类别过度自信、另一类别不够自信的抵消。可以先报告预测类别或数据来源分组的可靠性表,再讨论是否需要分别拟合;分组参数更多,必须同步评估小样本过拟合。

第二步可在相同候选接受集合上比较经验阈值选择和统计风险上界,分别记录可行率、覆盖率与独立测试风险。第三步再研究多分类样本排序反转是否改变拒答效果。每一步只改变一个因素,才能判断收益来自概率校准、筛选顺序还是阈值搜索范围。

九、总结

温度缩放是理解校准的好入口:参数少、原理清楚、容易检查。但 ECE、完整集准确率和接受集风险回答不同问题。可复用的研究产物应同时保留温度拟合轨迹、分箱计数、阈值选择依据、逐样本预测和分布变化结果,让"分数更合理"成为可检查的陈述。

参考资料

以下一手来源均于 2026-09-20 实际检索并打开;仓库 master 未锁定提交,动态版本待人工核验。

  1. Chuan Guo, Geoff Pleiss, Yu Sun, Kilian Q. Weinberger. On Calibration of Modern Neural Networks . ICML 2017, PMLR 70:1321--1330。会议页全文。支撑校准定义、温度目标与分箱指标。
  2. 作者官方 temperature_scaling 仓库核心源码。支撑维护状态、logits 输入、温度优化和区间边界阅读。
  3. Yonatan Geifman, Ran El-Yaniv. Selective Classification for Deep Neural Networks . NIPS 2017。会议页全文。支撑风险、覆盖率及同分布保证的条件。
  4. 作者官方 selective_deep_learning 仓库risk_control.py。支撑经验错误与二项上界的区别。
相关推荐
霍格沃兹测试学院-小舟畅学1 小时前
Google 开源 ARTEMIS:AI Agent 如何接管 Android 真机测试?
人工智能·测试工具
烈风逍遥1 小时前
SSE(Server-Sent Event) 介绍
人工智能·后端
u1301301 小时前
GitHub 热榜项目:周榜(2026-09-20)
人工智能·github
烈风逍遥1 小时前
AI大模型中fetch 和 ReadableStream为啥一起出现
前端·人工智能
袁俪1 小时前
AI智能体 :
人工智能
Pioneer000011 小时前
我用 Redis + 网关做多模型 API 路由:缓存命中率 95%+ 的工程实践
人工智能·redis·后端·缓存·性能优化·架构
空奈qwq1 小时前
机器学习入门:从核心概念到建模全流程
人工智能·python·机器学习
半甜柠檬1 小时前
Claude Code支持AGENTS.md了_真正的重点藏在mods里
人工智能·ai助手