如果把 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/