如果把 AI 当成一个做选择题的员工,你会先看它的正确率。但这篇素材里最刺眼的数字,并不是准确率。

是模型在一道明显有歧义的题上,把选项 Cave 的概率推到了 0.9978。

它不一定最会答。

但它真的很敢答。

小模型先交卷,分数一般,胆子很大

这篇来自 nishtahir.com 的文章叫 Build your own decision model。作者做的事情并不玄乎:把一个语言模型改造成做选择题的决策模型。

流程很直接。

加载 tokenizer 和模型,把问题拼成选择题,再把每个选项对应的第一个 token 找出来。模型生成时,只允许它在选项 token 里做选择。最后用 softmax 算出每个选项的概率。

这样一来,模型输出的不是一段自由发挥,而是一个可以评估、可以校准的概率分布。

作者先用了一道很简单的题。

问题是天空是什么颜色。选项有 Red、Blue、Green、Purple,还有一个 I don't know。

模型给出的结果是 B。

prediction: B
A: 0.0000 Red
B: 0.9988 Blue
C: 0.0000 Green
D: 0.0000 Purple
E: 0.0012 I don't know

Blue 的概率高达 0.9988。

到这里,故事还很正常。模型能理解输入,也能给出一个合理答案。

真正有意思的部分,在后面。

流程不复杂,关键是把概率逼出来

这套方法的重点,不在模型多大,而在怎么把模型的判断变成可比较的分数。

作者会把输入格式化成 question 加选项的形式,最后接一个 Answer。然后用 tokenizer.apply_chat_template 处理成模型能吃的 messages。

推理时也不让模型随便说。

它只取最后一个位置的 logits,再只保留选项 token 对应的分数,最后做 softmax。每个选项都会得到一个概率。

这个概率很关键。

它既可以当成模型的预测,也可以被当成一种伪置信度。

作者拿这个 1.7B 模型去测了 CommonsenseQA 的随机 holdout 样本。

结果是这样的。

accuracy: 725/1221 = 0.5938
macro f1: 0.5844

1221 条里答对 725 条,准确率约 59.38%。

老实讲,这个分数不算亮眼。

但作者又快速做了一次微调。

微调后,准确率来到 62.41%。

accuracy: 762/1221 = 0.6241
macro f1: 0.6234

提升不算惊天动地,但足够说明这条路线是跑得通的。

一个 1.7B 的小模型,已经可以完成选择题预测、概率输出、评估和微调这一整套动作。

到这里,看起来只是一个普通的技术实验。

反转马上来了。

反转来了,答得不算好,自信倒满格

作者又测了一道更模糊的题。

问题是,你最可能在哪里找到 bat。

选项有 Cave、Baseball game、Attic、Zoo、Sporting goods store。

这道题本身就带歧义。

bat 可以指蝙蝠,也可以指球棒。不同语境下,答案完全可以不同。素材里也明确说,这是一个非常模糊的问题。

但模型的表现很自信。

prediction: A
A: 0.9978 Cave
B: 0.0004 Baseball game
C: 0.0017 Attic
D: 0.0000 Zoo
E: 0.0001 Sporting goods goods store

它选择了 Cave。

概率 0.9978。

几乎等于把其他选项全部按死。

这就是问题所在。

如果模型只是答错,那还可以说是能力不够。但如果模型在模糊问题上给出接近满格的置信度,那就说明它并不知道自己有多不确定。

作者把输出概率当成一种伪置信度,再拿之前的评估结果做分箱。

结果更扎眼。

在 0.9 到 1.0 这个高置信区间里,样本数有 809 条。

平均置信度是 0.9855。

实际准确率只有 0.7009。

也就是说,模型一副稳了的口气,实际只对七成。

再看 0.8 到 0.9 区间。

样本数 121。

平均置信度 0.8555。

实际准确率只有 0.4711。

这就很尴尬了。

模型说自己八成多把握,实际连一半都没到。

个人觉得,这一组数据比单纯的准确率更值得盯紧。因为准确率告诉你模型会不会答,置信度告诉你它会不会骗人。

当然,模型未必是故意骗人。

它只是没被校准。

温度一调,AI 开始学会说自己没底

解决办法也不复杂。作者用了 temperature scaling。

简单说,就是调整温度值,把模型输出的概率分布拉平一点,别让它动不动就把某个选项顶到接近 100%。

未校准状态下,温度是 1.0。

一个示例里,B 选项概率高达 94.3%。

预期校准误差是 20.1%。

对应这个置信度,实际正确率是 82%。

看起来还行,但置信度和正确率之间明显有缝。

把温度调到 2.2 后,同一个示例里的分布变了。

B 选项从 94.3% 降到 63.2%。

A 从 2.1% 升到 11.2%。

C 从 1.7% 升到 10.3%。

D 从 1.0% 升到 8.2%。

E 从 0.8% 升到 7.1%。

预期校准误差降到 2.9%。

对应这个置信度,实际正确率是 61%。

这就有意思了。

模型没有突然变聪明。

它只是不再把话说得太满。

作者还用曲线拟合去找更合适的温度值,最后得到一个很长的数字:3.797280788421631。

校准后的分箱结果明显更顺眼。

在 0.9 到 1.0 区间,样本数变成 109。

平均置信度 0.9333。

实际准确率 0.9541。

在 0.8 到 0.9 区间,样本数 169。

平均置信度 0.8507。

实际准确率 0.7988。

高置信开始接近高准确。

低置信也不再完全失真。

这就像给模型装了一个诚实阀门。

它仍然会给出答案,但概率不再一路飙车。

真正该卷的,可能不只是准确率

作者还把这套流程放到了 GitHub repo 里。素材里说,里面有脚本可以带你构建数据集、评估、微调,以及校准自己的模型。作者也鼓励别人拿去试更大的模型。

说实话,这个实验最吸引人的地方,不在 1.7B 模型本身。

而在它把一个很实际的问题摆了出来。

一个决策模型,光会选答案还不够。

它输出的概率,最好也能反映它到底有多靠谱。

准确率是能力。

校准是诚实度。

没有校准的概率,很容易变成一种没有刻度的仪表。看着有数,实际上没法放心用。

当模型越来越会给出答案,我们是不是更该问一句,它知道自己有多确定吗?

【锐评】:AI 不怕答错,怕的是把不确定的答案,包装成笃定的结论。

参考链接:
https://nishtahir.com/build-your-own-decision-model/