校准与不确定性¶
模型给出答案,还需要知道何时值得相信、何时应请求更多证据或 abstain。校准评测比较“预测置信度”与“经验正确率”;它不等于提高准确率,也不保证分布外风险被识别。
协议¶
先定义概率对应的事件:
single-label answer is correct
generated answer passes verifier
atomic claim is supported
tool action reaches target state
safety classifier label is correct
置信度来源可以是 class probability、sequence score、verbalized probability、采样一致性、judge 分数或独立 calibrator。它们不是同一量,不能混在一条 calibration curve 中。
评测冻结 model/checkpoint、prompt、temperature、candidate set、parser、verifier 和数据时间窗;若正确性标签有噪声,校准上限也受 evaluator 限制。
分母与缺失¶
每个预测保存 \((p_i,y_i)\),其中 \(p_i\in[0,1]\),\(y_i\in\{0,1\}\)。还要保留:
abstain before prediction
invalid confidence
invalid answer
verifier / judge missing
timeout / infrastructure error
只在“模型愿意给置信度且 parser 成功”的样本上画曲线会产生选择偏差。至少报告 confidence coverage 和端到端 coverage。
Proper scoring rules¶
Negative log-likelihood¶
二元 NLL 为
NLL 对高置信错误惩罚很强。实现需对 \(p=0,1\) 做数值裁剪,但报告裁剪阈值;过强裁剪会隐藏极端错误。
Brier score¶
Brier 有界、易解释,同时混合 calibration 与 discrimination。模型排序能力更强但未校准时,单个 Brier 不能说明问题来源。
Expected Calibration Error¶
将样本按置信度分箱 \(B_1,\ldots,B_K\):
ECE 简单但不是 proper scoring rule,并且对 bin 数、边界、样本量和空 bin 敏感。报告时需给出:
- equal-width 或 equal-mass;
- \(K\) 与空 bin 处理;
- 每箱样本数和置信区间;
- overall 与关键 slice;
- reliability diagram,而不只一个数。
不同实现的 ECE 不宜直接比较。
下面把 equal-width ECE、Brier 和 risk–coverage 排序放在同一接口中。confidence 是最终预测正确的概率,correct 是该预测是否正确;两者必须逐 item 对齐。ECE 的 bin 规则是接口的一部分,不能只保存最终标量。
import torch
def calibration_summary(confidence, correct, bins=10):
confidence, correct = confidence.float(), correct.float()
if (confidence.ndim != 1 or confidence.shape != correct.shape or confidence.numel() == 0
or not isinstance(bins, int) or bins <= 0):
raise ValueError("aligned non-empty observations and positive integer bins required")
if (not torch.isfinite(confidence).all() or torch.any((confidence < 0) | (confidence > 1))
or not torch.all((correct == 0) | (correct == 1))):
raise ValueError("confidence must lie in [0, 1] and outcomes must be binary")
bucket = torch.bucketize(
confidence, torch.linspace(0, 1, bins + 1, device=confidence.device)[1:-1])
ece = confidence.new_zeros(())
for k in range(bins):
mask = bucket == k
if mask.any():
gap = (correct[mask].mean() - confidence[mask].mean()).abs()
ece += mask.float().mean() * gap
order = confidence.argsort(descending=True)
_, counts = torch.unique_consecutive(confidence[order], return_counts=True)
end = counts.cumsum(0) - 1
cumulative_error = (1 - correct[order]).cumsum(0)
coverage = (end + 1) / len(order)
risk = cumulative_error[end] / (end + 1)
brier = ((confidence - correct) ** 2).mean()
return {"brier": brier, "ece": ece, "coverage": coverage, "risk": risk}
perfect = calibration_summary(torch.tensor([0., 1.]), torch.tensor([0, 1]), bins=2)
assert perfect["brier"] == 0 and perfect["ece"] == 0
tie = calibration_summary(torch.tensor([.5, .5]), torch.tensor([1, 0]))
flipped = calibration_summary(torch.tensor([.5, .5]), torch.tensor([0, 1]))
torch.testing.assert_close(tie["risk"], flipped["risk"])
torch.testing.assert_close(tie["risk"], torch.tensor([.5]))
try: calibration_summary(torch.tensor([]), torch.tensor([]))
except ValueError: pass
else: raise AssertionError("empty calibration data must be rejected")
曲线只在唯一置信度阈值的组末端报告点,因此同分 item 会一起纳入,结果不依赖它们在输入中的先后顺序。每个点表示保留不低于当前阈值的全部样本;它不会自动选择阈值,也不包含曲线的不确定区间。生产评测要冻结置信度抽取与等价答案规则,按 slice 报 bin count,并对同一 item 的重复生成做 cluster-aware 区间。
Selective prediction¶
阈值 \(\tau\) 以上才回答:
\(C\) 是 coverage,\(R\) 是 retained risk。画完整 risk–coverage curve,或报告预先定义 coverage 下的 risk;只报告回答子集 accuracy 会奖励无限 abstention。
高风险系统还应把人工升级、额外检索和工具验证作为不同 action,而不是只有 answer/refuse 二元选择。
生成式不确定性¶
Verbalized confidence¶
模型可以直接输出概率或置信等级。Teaching Models to Express Their Uncertainty in Words 研究了 verbalized uncertainty;Language Models Mostly Know What They Know 研究了模型对自身知识的判断。
口头概率受 prompt、数字偏好和社会性措辞影响。需要:
- 冻结 elicitation prompt;
- 检查概率 parser 与非法值;
- 与同一事件的经验正确率校准;
- 测试改写、顺序与语言;
- 不把流畅的“不确定”当成真正概率。
Semantic uncertainty¶
开放生成存在多个语义等价文本。先把输出聚为语义类 \(c\),再聚合类概率
语义熵为
Semantic Uncertainty 研究了用语义等价类区分表面多样与含义不确定。聚类器、采样预算和类概率估计本身会引入误差;多个样本稳定复述同一错误时,低语义熵仍不代表正确。
Calibration under shift¶
校准依赖分布。应按时间、语言、领域、长度、难度、工具状态和数据来源切片,并在以下变化后重评:
- checkpoint 或 adapter;
- 量化、温度与解码;
- prompt、template 或 few-shot;
- verifier/judge 与阈值;
- 检索索引和工具;
- 数据时间窗。
在开发集拟合温度或 isotonic calibrator 后,必须用独立测试集报告结果。在线重新校准也要防止 delayed label 和 selection bias。
实现契约¶
event definition and correctness evaluator
confidence source and extraction
model/protocol/data revisions
invalid/missing/abstain policy
NLL clipping and Brier definition
ECE binning and slice weights
risk/coverage threshold policy
semantic samples, clustering and budget
calibrator training/test split
正确性与攻击失效¶
- token probability 当回答概率:多 token、自由生成和工具任务语义不同。
- ECE 单值无 bin 信息:实现不可比较。
- 只在回答样本校准:abstention coverage 被隐藏。
- 开发集拟合后仍在开发集报告:过拟合。
- 多次采样字符串不一致当风险:忽略语义等价。
- 低熵当正确:模型可能稳定错误。
- judge confidence 当事实概率:judge 自身偏差未校准。
- 攻击者操纵措辞:verbalized confidence 或 guard score 被格式诱导。
- 分布漂移沿用旧阈值:线上风险失控。
何时不用单一置信度门槛¶
不同错误代价、用户群和任务类型需要不同决策规则。对高影响动作,应结合证据、工具验证、权限和人工复核,不以一个模型置信度授权。没有可接受 correctness label 时,也不应把 judge 分数硬解释为真实概率。
验证与报告卡¶
- 常数概率、完美预测和高置信全错构造可手算基线。
- 同时报 NLL、Brier、ECE 图和 risk–coverage。
- 对关键 slice 给 paired/cluster 置信区间。
- 在协议和时间变化后重新校准。
- 对 verbalized confidence 做 prompt/语言/顺序扰动。
- 对 semantic clustering 做人工一致性抽检。
event and confidence definition
correctness evaluator and label quality
data/model/protocol revisions
coverage and invalid/missing statuses
NLL/Brier/ECE specification
risk–coverage operating points
semantic sampling/clustering budget
calibrator split and shift slices
confidence intervals and known blind spots
统计区间见统计推断,事实 claim 的 support/unknown 见幻觉与事实性,最小实现见评测工具。