首页 / 资讯中心 / 文章详情

模型说「不确定」时,那个概率为什么不能直接用

模型说「不确定」时,那个概率为什么不能直接用 ★ FEATURED ARTICLE
版权与内容来源声明本文为原创整理。文中涉及官方文档、开源仓库、论文与公开报道的内容均在附表 A 中标注来源引用官方原文保持原样不作改写。文中命令、版本号与界面截图以本文成文时的实测/核验结果为准标注「待验证」的部分请以你本地环境实际输出为判断依据。本文不推荐任何破解、盗版软件也不推荐任何规避地区限制的访问方式亦不对任何收益结果作承诺。转载请注明出处。一、那句「置信度 0.9」到底在说什么1.1 一个很常见的接法合同要素抽取上线第二周业务方在需求群里发了一张截图同一条条款模型抽出的付款账期是「60 天」后面跟着confidence: 0.9。他们的结论很干脆——九成把握那就不用全量人工复核了剩下那一成抽检。这个推理每一步都合理只有一处没有验证0.9 这个数是不是「打 0.9 分的那批样本里九成确实是对的」多数时候不是。它更接近「模型内部给这个答案打了 0.9 的分」。一个是频率一个是打分长得一模一样含义差得很远。频率可以拿去算期望、定人力、做报价打分只能用来排序和分档。1.2 不是模型在撒谎是分数没对过表Guo、Pleiss、Sun、Weinberger 在On Calibration of Modern Neural NetworksICML 2017arXiv:1706.04599的摘要里写得很直接modern neural networks, unlike those from a decade ago, are poorly calibrated。这句话经常被读成「新模型不如老模型」其实它说的是另一件事十来年前的浅层网络分数碰巧更像频率网络变深变宽之后这个巧合没有了。所以不是模型学会了撒谎是它输出的那个数本来就没有承诺过「等于频率」。同一篇摘要还点了几个影响因素——depth、width、weight decay、Batch Normalization并给出结论temperature scaling作为 Platt Scaling 的单参数变体在校准预测这件事上出奇地有效。注意最后半句它说的是校准不是更准。这两件事经常被混为一谈。1.3 准和校准是两件事一个模型可以很准但校准很差也可以不太准但校准很好。把这两个维度交叉一下四种情形在业务上长得完全不同情形平均准确率平均置信度校准状态业务侧的感受又准又说实话高高且和准确率贴合好阈值好定人力好排很准但话太满高普遍 0.99差过度自信按 0.99 排的人力永远不够不太准但很谦中普遍 0.55差欠自信明明能用却被大量拒答又差又满低普遍 0.95差过度自信最危险的一种报表还很好看一句判据准确率问「对了多少」校准问「说 0.9 的时候是不是真有九成对」。这两个数可以一个很好一个很差修好一个不会自动带上另一个。1.4 先把问题定位对业务方那句「置信度 0.9 就该九成对」错在把一个排序信号当成了频率估计。这个定位很关键如果以为是「模型能力不够」去换更大的模型、加更多数据校准未必变好甚至可能更差1.2 节那句摘要说的正是这个方向如果知道是「分数没对过表」那么要做的是一次校准加一张图工作量小得多也更可控。二、ECE把「说多满」和「做对多少」压成一个数2.1 先分箱做法很朴素按模型自己给出的分数切成 10 到 15 个等宽区间下称箱把样本按分数丢进对应的箱。然后对每个箱问两件事——这箱平均说了多少conf这箱实际对了多少acc。如果模型是校准好的这两列应该几乎相等说 0.8 的那箱实际就该对八成。差距出现在哪里、有多大就是校准问题的形状。2.2 公式逐项读ECE Σ_m (|B_m| / n) · |acc(B_m) − conf(B_m)|m是箱的序号B_m是落在第 m 箱里的样本集合|B_m| / n是这个箱占总样本的比例起权重作用人多的箱说话更算数acc(B_m)是箱内实际答对的比例conf(B_m)是箱内分数的平均值外面套绝对值再对所有箱求和。为什么要套绝对值。如果不套一半样本过度自信差 0.1、一半欠自信差 −0.1加起来正好抵消ECE 会告诉你「完美校准」。这是这个指标最容易踩的坑也是它最容易被拿来粉饰的地方只要模型在两端各错一个方向平均数就干净了。为什么是 10 到 15 箱。箱太少箱内差异被平均掉过度自信和欠自信在同一个箱里对消箱太多每箱样本变少acc 的随机抖动盖过真实差距ECE 变成噪声。箱数的上界由样本量决定经验上每箱至少几十条才有意义样本只有几百条的时候报 ECE 必须同时报样本量否则这个数字没法判断。2.3 二十行算一遍下面这段只依赖标准库造一组「分数偏高、准确率偏低」的数据把分箱和 ECE 走通。importrandom random.seed(7)rows[]# (打分, 是否答对)for_inrange(4000):prandom.random()rows.append((min(0.999,p**(1/2.6)),1ifrandom.random()pelse0))defece(rows,bins10):box[[]for_inrange(bins)]fors,yinrows:box[min(int(s*bins),bins-1)].append((s,y))total0.0forbinbox:ifnotb:continueconfsum(sfors,_inb)/len(b)accsum(yfor_,yinb)/len(b)totalabs(acc-conf)*len(b)/len(rows)# 权重乘差距returntotalprint(round(ece(rows),4))跑法python calib.py输出是一个小数。这组合成数据的 ECE 是 0.218——但单看这个数没有意义得拆开看箱。逐箱明细节选如下置信区间箱内样本平均置信 conf实际准确率 acc差距 acc 减 conf对 ECE 的贡献[0.4, 0.5)3210.4510.125负 0.3270.0262[0.6, 0.7)5290.6550.355负 0.2990.0396[0.7, 0.8)6230.7520.477负 0.2760.0429[0.8, 0.9)7960.8520.673负 0.1780.0355[0.9, 1.0)9370.9520.871负 0.0810.0190这张表要连着两句说明看第一数据是脚本里用随机数合成的只用来把分箱口径跑通不代表任何具体模型、产品或厂商的校准水平第二它演示的形态是标准的过度自信——每一箱的实际准确率都低于平均置信度最高那一箱说了 0.95实际只对 0.87。开头那个「0.9 当九成用」的现场就差在最后这 8 个点上。2.4 ECE 的三个局限它把差距平均掉了。一个 ECE 可能由某一箱的巨大差距贡献也可能由十箱各差一点摊出来前者要命后者也许能忍。要看分布就得看图。它对箱边界敏感。同样一批数据换一种分箱方式数值会变。所以报告里必须写箱数两次比较必须用同一套边界。它是无条件的平均。业务真正关心的往往只是某一段比如只用 0.9 以上那批直出而 ECE 把 0.3 到 0.5 那堆没人用的样本也算进去了。三、可靠性图45° 线上下三种形态3.1 怎么画用文字也能说清横轴是置信度纵轴是实际准确率取值都是 0 到 1。从左下角到右上角画一条对角线这条 45° 线上每个点都满足「说多少就是多少」它是参照系不是目标形态——没有哪个真实模型会精确落在线上。然后把每个箱画成一个点横坐标取该箱的平均置信度纵坐标取该箱的实际准确率点的大小可以是箱内样本数。把点连成折线就得到可靠性图。不需要任何绘图库把 2.3 节那张表的两列照坐标点上去形状就出来了。3.2 三种形态形态折线相对 45° 线的位置读起来是什么常见成因先动哪里过度自信整体落在 45° 线下方说 0.9点在 0.8 出头话比本事满网络深、训练充分、BatchNorm、weight decay 偏大Guo 等把这几个列为影响因素单一温度参数就能压回大半欠自信整体落在 45° 线上方说 0.6点在 0.75本事比话多训练不足、正则过强、标签噪声大、模型偏小温度往小调但先排除数据问题S 形两端在线的一方、中段在另一方整体像被拧过一头要压、一头要抬分数被挤在中间段或不同来源的数据混在一起分段校准或按业务分段各拟一个温度读这张表有个前提三种形态都只是「形状」成因那一列是经验归类不是论文结论。同一张图上的同一个形状换一个数据集可能是完全不同的原因所以要回到数据本身去看不能照表抓药。3.3 看图先看两端中间段样本最多、曲线最平最容易给人「还行」的错觉真正决定业务后果的是两端你打算用的那个阈值附近以及你最不敢放手的高分端。回到开头那个场景业务要用的是 0.9 以上那一档直出那就把 0.85 到 1.0 单独放大看看这一段的点离 45° 线有多远、这一段有多少样本。整体 ECE 好看不代表这一段好看反过来整体难看也不代表你要用的那一段不能用。3.4 S 形为什么麻烦温度缩放是一个单调变换所有分数按同一条曲线重排整体往一个方向压或拉。S 形的问题恰恰是「一头要压、一头要抬」一个参数做不到两件事硬拟的结果是两头的误差都没修好中段还被带偏。遇到 S 形只有两条路要么分段按分数段或按业务线各拟一个温度要么承认这段分数只能当序用——它能把样本从最不可信排到最可信但不能报成概率。后者听起来是退让实际上比报一个错概率安全得多。四、三种「置信度」测法完全不同4.1 logits 概率softmax 之后的那个数是最容易被当成「概率」的一个。三个坑解码方式一改含义就变了。贪心解码拿到的是 top-1 的分数换成采样top-k、top-p、调温度分布被改过再从这个分布里取概率量纲就不再是同一件事。历史阈值在换配置那天全部作废。序列级概率要连乘。一句话三十个 token每个 0.99连乘下来是 0.74。乘不乘、要不要按长度归一化各家做法不同报数时必须说清是 token 级还是序列级。只在同一套配置下可比。换模型、换提示、换解码参数都要重新校准不能拿旧阈值套新配置。4.2 自述概率另一条路是让模型自己把把握写出来比如「90% confidence」。Lin、Hilton、Evans 在Teaching Models to Express Their Uncertainty in WordsarXiv:2205.143342022里走的就是这条GPT-3 可以不用 logits直接用自然语言表达置信度而且这些自述概率是校准的作者同时提出 CalibratedMath 测试集并把 verbalized probability 与从 logits 提取不确定性这两条路放在一起比较。要抓住的是两个点不用 logits以及自述概率是校准的。别顺手延伸成「自述一定比 logits 好」——原文做的是比较不是排名而且「校准」这个结论建立在它自己的测试集与提问方式上换一种问法、换一个任务还是要重新画图。4.3 采样一致性同一个问题采样 N 次看答案分布8 次选 A、2 次选 B一致率 0.8。这个数很好拿也很容易被误用因为它测的是稳定性不是正确率。系统性的错会被稳定地重复。一个每次都错得一模一样的模型一致率可以接近满分。所以采样一致性适合回答「这个答案稳不稳、要不要再问一遍」不适合回答「这个答案有多大概率对」。它还有个隐性成本N 倍推理开销N 取多少又会反过来影响这个数本身。4.4 一张对照表维度logits 概率自述概率采样一致性从哪来softmax 的输出模型自己写出的百分比同一问题多次采样的答案分布测的是什么模型内部的相对偏好模型对「自己会不会对」的判断输出的稳定性能否直接当频率要先校准且绑定解码配置校准过才能用须注明在哪个集合上校的不能它是稳定性而非正确率额外成本要能拿到 logits多一次生成或一次追问N 倍推理开销典型误用换了解码配置还在用老阈值把「九成把握」当承诺写进合同一致率高就当成对率高一句纪律报表上写「置信度」三个字不够必须同时写清是哪一种、在哪个集合上校准过、用什么解码配置取出来的。三项缺一项这个数就无法被复核也就没法在出问题的时候定位。五、拒答阈值不是拍出来的是选出来的5.1 允许模型说「不知道」选择性预测的思路很直接分数低于阈值就不作答转人工或输出「无法判断」。剩下的那部分错误率会降——最没把握的那批被挡在门外了。代价是覆盖率下降也就是有更多问题需要人来兜底。这件事的关键在于它是一笔兑换不是一次提升。拒答不会让模型变聪明它只是把「答错」换成了「不答」而「不答」也有成本只是这个成本落在别人头上人工、时效、体验。5.2 覆盖率与错误率横轴覆盖率作答的样本占比纵轴是该覆盖率下的错误率。阈值从低往高抬工作点从右上往左下走错误率降覆盖率也降。这条曲线之所以重要是因为它把兑换比例摆在了明面上。没有它讨论「阈值定多少」就只能是拍脑袋有了它至少能说清「定在 0.9 意味着七成六的问题要转人工」。5.3 跑一遍看形状defcurve(rows,ts(0.7,0.8,0.9,0.95)):nlen(rows)fortints:kept[(s,y)fors,yinrowsifst]coverlen(kept)/n errsum(1-yfor_,yinkept)/len(kept)ifkeptelse0.0print(f阈值{t:.2f}覆盖率{cover:.3f}剩余错误率{err:.3f})用 2.3 节那组合成数据四个阈值跑出来是这样阈值覆盖率剩余错误率被拒比例业务侧发生了什么0.700.5890.3000.411四成人要人工看错误率从 0.501 降到 0.3000.800.4330.2200.567一半以上转人工0.900.2340.1290.766只剩两成多直出0.950.1230.0610.877直出不到一成三更像一个昂贵的过滤器表里 0.501 是不拒答时的整体错误率。再强调一次这组数据是刻意造出来的差模型只为把曲线形状跑出来不是任何真实系统的水平。真实系统上这条曲线通常更平也就是说同样的阈值抬升换来的错误率下降更少——那就更需要在选点前先看清形状。5.4 选点看业务能接受哪一头把两笔成本写出来一次错误流到下游的返工成本记作C_e一次拒答的人工处理成本记作C_r。总成本大致是「错误数 × C_e 拒答数 × C_r」在曲线上逐个工作点扫一遍最低点就是该选的阈值。如果C_e远大于C_r报价单错一个数字要赔钱阈值往高抬宁可多拒如果C_r远大于C_e只是给坐席做提示错了人一眼能看出来阈值往低压宁可多答。这两个成本的比值业务方必须自己给工程侧给不了也不该替业务决定。工程能做的是把曲线画准、把每个工作点的代价算清然后让选点变成一个可以争论的数字而不是一句「感觉 0.9 差不多」。反模式也要提一句为了让报表上的准确率好看把阈值抬到 0.95覆盖率只剩一成多。数字是漂亮了但系统不在干活原本的人工工作量一分没少还多了一层维护成本。这份资料是什么一页校准自查清单把「画图、拟合、分档、选点」四步该记录的字段列成表和本章的兑换逻辑配套。放在资料包里扫码即可获取六、温度和分箱参数只能碰验证集6.1 温度缩放改的是什么把 logits 除以 T 再做 softmaxT 大于 1 把分布压平降低过度自信T 小于 1 把分布变尖提高自信。它只有一个参数而且不改变 argmax——也就是说它不动准确率只动分数。这正是它好用的原因。校准的职责是让分数对得上频率不该顺手把排序改了如果一次校准之后准确率变了那多半不是校准是又训了一遍模型。Guo 等说它「出奇地有效」分量落在「单参数」上不需要为每个类别、每个分数段各拟一套参数一个 T 就能把大部分过度自信压回去。6.2 三条纪律第一T 只能用验证集拟合。在测试集上拟 T等于让校准器提前看了答案报出来的 ECE 是自己骗自己。数据划分应该是训练、验证、测试三段T 在验证集上拟ECE 只在测试集上算一次算完就封存。第二分箱边界也要固定在验证集上。边界每次现定两次 ECE 就没有可比性也没法判断「这次改动到底有没有用」。报告里写清箱数和样本量是让这个数字可复核的最低要求。第三拟合目标要说清楚。常见做法是在验证集上最小化负对数似然而不是直接最小化 ECE。原因是 ECE 依赖分箱不可导也不平滑拿它当优化目标会很不稳用似然拟合、用 ECE 验收是更常见的分工。6.3 什么时候温度也不够分布漂移。上线三个月输入分布换了0.9 的含义跟着变而 T 是旧分布下的参数。校准不是一次性动作是要定期回算的。分段差异。不同业务线的分数分布差别很大一个全局 T 顾此失彼只能分段拟。长尾类别。样本极少的类别验证集上那几箱几乎是空的拟合出来的 T 被大类主导小类等于没校准。这三种情况都不是「再调一下参数」能解决的要靠分段、分层分别拟或者干脆承认这段分数只能用来看排序。承认这一点不丢人把没校准的数当概率用才丢人。七、上线判据把置信度当分级信号7.1 三条判据环节该做什么常见反例为什么上线前在留出集上画一次可靠性图记录箱数与样本量只看训练集的损失曲线训练集上的分数天然偏乐观越训越乐观拟合T 只在验证集上拟测试集只用一次反复在测试集上调 T 直到 ECE 好看调的次数越多报出来的数越假使用置信度当分级信号高直出、中抽检、低转人工把 0.9 乘进报价、乘进风控评分乘法要求这个数是频率而它不是三条里最容易被跳过的是第一条因为它不产生任何功能。但它是唯一能在上线前发现「分数整体偏高一截」的手段而这个问题一旦上线只会以「模型老出错」的形式暴露排查成本高得多。7.2 为什么不能乘进报价和风控把 0.9 乘进期望值等于默认「打 0.9 的样本里有九成是对的」。如果实际只有八成七这个期望值就系统性偏高而报价、授信、风控这类场景是线性外推偏差会被金额放大——不是「稍微不准」而是「一直往一个方向偏」。更麻烦的是它不可解释。结果错了你说不清是模型判错了还是概率乘错了两种错混在一个数字里改哪一头都只能靠猜。分级信号没有这个问题档位切错看那一档的回算准确率就知道错在哪一层。7.3 分档要连着监控分档不是切三刀就完事。每一档都要单独回算实际准确率因为整体准确率是最钝的指标高档掉五个点、低档涨五个点整体可能一动不动但业务侧的感受却翻了个面。监控的最小粒度建议是「档 × 业务线」先看哪一档先漂。漂移通常不是齐步走的它从一个高分档、一条业务线开始等整体指标动起来偏差往往持续了两三周。7.4 收束回到标题那句话。模型说「不确定」的时候它给的往往不是一个概率而是一个分数分数只有在被校准过之后才有资格被叫作概率。所以在 0.9 和「九成会对」之间必须夹两道工序一次校准在验证集上拟参数、在留出集上验收和一条曲线覆盖率换错误率选点由业务定。少这两道0.9 就只是一个好看的两位数写进报表里谁看都放心用起来谁都不放心。这份资料是什么一份分档落地的模板把「档位、动作、回算口径、复核周期」四列做成表和本章的判据配套。放在资料包里扫码即可获取附表 A本文引用事实与出处对照表两条来源均为公开论文截至 2026-10-24 可按 arXiv 编号检索到本文只引用摘要层面的结论未展开论文中的实验设置与数据也未对结论作改写。编号事实出处本文引用位置1modern neural networks, unlike those from a decade ago, are poorly calibratedGuo, Pleiss, Sun, WeinbergerOn Calibration of Modern Neural NetworksICML 2017arXiv:1706.04599摘要第 1.2 节2depth、width、weight decay、Batch Normalization 是影响校准的重要因素同上摘要第 1.2、3.2 节3temperature scaling 作为 Platt Scaling 的单参数变体在校准预测上出奇有效同上摘要第 1.2、6.1 节4GPT-3 可以不用 logits、直接用自然语言表达置信度且这些自述概率是校准的Lin, Hilton, EvansTeaching Models to Express Their Uncertainty in WordsarXiv:2205.143342022摘要第 4.2 节5提出 CalibratedMath 测试集比较 verbalized probability 与从 logits 提取不确定性同上摘要第 4.2 节6ECE 公式与 10 到 15 箱的分箱口径表 2、表 5 的数值随文脚本2026-10-24-10_校准实验.py在合成数据上运行所得随机种子 74000 条非任何真实模型数据复跑python 2026-10-24-10_校准实验.py第 2.2、2.3、5.3 节7三种形态的成因归类、两条成本的选点方法、分档监控粒度作者基于上述两篇与工程实践的经验判断非论文原文结论第 3.2、5.4、7.1、7.3 节附表 B术语速查表术语一句话解释在本文哪里用到校准分数与实际频率对齐的程度与准确率是两件事第 1.3 节ECE期望校准误差按分箱加权平均「置信度与准确率的差距」第 2.2 节可靠性图横轴置信度、纵轴实际准确率的折线45° 线为完美校准参照第 3.1 节温度缩放logits 除以 T 再 softmax单参数不改 argmax第 6.1 节选择性预测允许拒答只在有把握的子集上作答第 5.1 节覆盖率被作答的样本占总样本的比例第 5.2 节自述概率模型用自然语言写出的置信百分比第 4.2 节采样一致性同一问题多次采样后答案的分布集中度测稳定性而非正确率第 4.3 节写在最后这篇用到的资料写这篇文章时把两篇论文的摘要和几份工程笔记又翻了一遍顺手也整理了几份配套的东西大模型学习路线图从零基础到能自己动手做 Agent按阶段说明每一步该学什么、哪些可以先跳过《LangChain LangGraph MCP 智能体开发实战》视频课7 个模块从私有化部署、EmbeddingRAG 到 MCPAgent 全流程AI 大模型知识库在线可查Agent Skills 从入门到落地、Claude Skills 完全指南等专题按目录浏览即可640 套 AI 大模型行业报告 经典 PDF 书籍看行业落地案例和别人怎么做的时候用得上大模型零基础到精通教学视频跟着敲一遍比只读文档快得多资料是我自己整理的放在下面这个码上扫码即可获取如果这篇对你有用评论区说说你卡在哪一步我按留言再补后续的拆解。
阅读完成 · 觉得有帮助?
咨询建站