准确率 Acc 是什么?看懂模型评测表里最常见的那个百分数
准确率(Accuracy,常缩写成 Acc)是模型答对的样本数占全部样本数的比例,通常写成 0 到 1 之间的小数或百分数。它就像考试的得分率:一张卷子 100 道题,答对 80 道,得分率 80%,评测表里的准确率就是这个意思。
它是怎么算出来的
公式很朴素:准确率 = 预测正确的样本数 ÷ 样本总数。scikit-learn 的 accuracy_score 文档里,默认返回正确分类样本所占的比例,把 normalize 设成 False 就改成返回正确的个数。文档里的小例子是四个样本答对两个,结果是 0.5。
这个数有两个特点要先记住。一是它只看“对不对”,不管错得多离谱,也不管模型对答案有多大把握。二是在多标签任务(一条样本可以同时带好几个标签)里,这个函数算的是子集准确率,标签集合必须和标准答案完全一致才算对,差一个标签就整条算错。
从哪来的,怎么成了大模型的成绩单
准确率是分类任务里最基础的度量,我没有查到哪篇论文专门提出它,所以不替它编出处。它在大模型圈随处可见,要从选择题式的评测说起。2020 年 9 月,Dan Hendrycks 等人在 arXiv 上发布 MMLU(Measuring Massive Multitask Language Understanding),后来发表在 ICLR 2021,覆盖 57 个科目,论文开头就说这是在测模型的多任务准确率。当时最大的 GPT-3 平均只比随机水平高出将近 20 个百分点,最好的科目接近 70%,另一些科目接近随机。四选一的题瞎蒙也能对 25% 左右,所以看准确率一定要同时看随机基线。
写代码的题没法用 ABCD 打分。2021 年 OpenAI 团队在 Codex 论文(Evaluating Large Language Models Trained on Code)里把标准换成功能正确性:生成的代码能通过单元测试才算对。配套的指标叫 pass@k,每道题生成 k 份答案,只要有一份通过测试就算解出,最后报告解出题目的比例。HumanEval 有 164 道手写题,论文里 Codex 单次生成解出 28.8%,进一步微调的 Codex-S 是 37.7%,每题采样 100 次时 Codex-S 能做到 77.5%。
现在在哪用
最常碰到的有两处。一处是 scikit-learn 这类传统机器学习库,除了 accuracy_score,还有 balanced_accuracy_score 和 top_k_accuracy_score 等变体。另一处是 EleutherAI 的 lm-evaluation-harness,这个评测框架支持 60 多个学术基准,包括 MMLU、GSM8K、IFEval。各家发新模型时附的 MMLU、HumanEval 成绩,本质上也是这一类数字。
选择题任务在这个框架里有两个版本:acc 是让模型给每个选项打一个可能性分数(对数概率),挑分数最高的那个;acc_norm 在此基础上按答案长度做归一化,因为选项越长,累加的对数概率越低,不修正就会偏向短答案。结果表里这两列并排出现,别当成同一个东西互相比。
MMLU 之后又出了 MMLU-Pro,为了拉开模型之间的差距,它把选项从四个增加到十个,随机基线从 25% 降到 10%,题目也更偏推理。论文报告模型分数比 MMLU 下降 16% 到 33%,换提示词造成的波动从 4% 到 5% 降到约 2%。
容易混的地方
最大的坑是类别不平衡。打个比方,1000 封邮件里只有 10 封垃圾邮件,一个把所有邮件都判成“正常”的模型,准确率也有 99%,却一封垃圾邮件都没拦下。这时要配合精确率、召回率,或者像 balanced_accuracy_score 那样按类别分别算再平均。
名字上的混淆也不少。中文里 accuracy 叫准确率,precision 叫精确率或查准率,两者不是一回事。top-k 准确率看的是排名靠前的 k 个候选里有没有正确答案,pass@k 看的是采样 k 次有没有一次通过测试,前者看排序,后者看多次生成,也不能混用。
对使用者来说,实际影响主要在读数字的方式上。同一个模型在同一个基准上,换提示词、换选项顺序、换采样次数,分数都会动。pass@k 的 k 越大,调用次数和成本越高,单次生成的 pass@1 更接近你日常使用时的体验。我们 AI主线 的建议是:看到一个准确率,先问清四件事,题目是什么,随机基线是多少,用了几次采样和什么提示词,测试集有多大。数字后面的这些条件,比数字本身更能说明问题。