Elea Notes.

词条 · AI · 入门

标准答案

被当作正确的那份答案。它是人造的,因此可能是错的。

也称:标准答案、ground truth、参考答案、标注、金标准

下面从”给一台机器判分”这个具体需求出发,看”正确答案”这四个字为什么是整条评测链上最脆弱的一环,以及为什么它的错误特别难被发现。

先看一个麻烦:判分的人得先知道答案

你要判断一个程序认字认得准不准。给它一千张手写数字的照片,看它认对多少张。

要算”认对多少”,你需要一张对照表:第一张照片写的是 7,第二张是 3,第三张是 0……这张表得有人先做出来。找人把一千张照片逐张看一遍,写下每张是什么数字。

现在程序说第 418 张是 9,你的表上写的是 4。判错。

但等一下——你怎么知道是程序错了?那张照片可能确实写得像 9。做表的那个人可能看错了。也可能那个字迹本身模糊到两种读法都合理。

停下来看看卡在哪。你想量的是程序的准确率,实际量到的是程序和那张表的一致程度。当表本身有错时,这两个量不相等,而你手上没有任何东西能区分它们——程序和表不一致时,你默认判程序错,因为表就是被定义为正确的那一方。

这张表就是标准答案。它的性质很特别:它不是被发现的真相,是被指定的真相

朴素尝试为什么都不够

招数一:找更细心的人来标。 错误率会下降,不会归零。而且真正麻烦的样本不是”标注者不小心”,是”这个样本本身就有歧义”——写得像 9 又像 4 的那个字迹,换谁来标都会分歧。细心解决不了歧义。

招数二:三个人独立标,取多数。 这一招实用,是当前的通行做法。它能滤掉个人的疏忽。但它对系统性偏差无效:如果三个人受同样的训练、看同样的说明、有同样的误解,他们会一致地错。多数投票只能发现分歧,而系统性偏差恰恰不产生分歧。

招数三:只保留三个人完全一致的样本,扔掉有分歧的。 现在这份标准答案很干净了。代价是你把难的样本全扔了。留下的都是容易的,于是这份评测量不出模型在困难情形下的表现——而困难情形往往才是你真正关心的。分数会系统性偏高。

招数四:不用人,从现实里自动捞。 比如判断一个程序会不会修 bug:去 GitHub 上找已经修好的 bug,把开发者当年提交的那份修改当作标准答案。这一招极其实用,因为它几乎免费,而且答案来自真实世界而非人工编造。但它引入了一个新的失效模式,而且是最隐蔽的一种:流水线对现实做了一个假设,而现实不遵守它

比如假设”一次提交恰好修一个 bug”。真实项目里,开发者顺手多修两个问题是常态;先合一个不完整的修复再补第二个也很正常。于是「任务描述」和「标准答案」讲的不是同一件事——而流水线不会报错,因为它没有任何办法察觉这一点。

机制:一条把”正确”制造出来的流水线

标准答案不是从天上掉下来的,它是一条流水线的产物。每一格都会往里注入自己的错误:

   现实世界的某个事实


   ① 采样:选哪些样本进来
        │            ← 选择偏差:好标的样本更容易被选中

   ② 标注:由人写下答案,或从某处自动提取
        │            ← 人的疏忽、人的系统性误解
        │            ← 自动提取时:流水线假设 vs 现实

   ③ 裁决:多人不一致时怎么办
        │            ← 扔掉分歧样本 ⇒ 难题被系统性排除

   ④ 冻结:写进文件,从此被当作正确
        │            ← 现实变了它不会变

   标准答案


   用它判分  ⇒  分数 = 模型与这份答案的一致程度

第 ④ 步是最容易被忽略、也最要紧的一步。一旦冻结,这份答案就不再随现实更新。开发者当年那份修改后来被发现有 bug、又补了一个 PR 修它——标准答案里冻的仍然是那份有 bug 的版本。要拿分,模型得复现出同样的 bug。

现在看这条链的一个结构性性质:标准答案的错误和模型的错误,在分数里长得一模一样。两者都表现为”不一致”。你拿到一个 62% 的分数,看不出里面有多少是模型不行,多少是答案不对。

要分开,唯一的办法是独立地重新审一遍标准答案本身——这件事成本高、不出成果、没人爱做,所以极少有人做。这就是为什么这类错误能在被反复引用的评测集里存活很久。

为什么值得知道:它给分数设了一个天花板

几个能直接用的判断。

分数不可能超过标准答案的正确率。 如果一份标准答案里有 14% 是错的,那么一个完美的模型在上面也拿不到 100%——它会在那 14% 上”答对而被判错”。更麻烦的是反向情形:一个模型如果学会了模仿标注者的错误,能拿到比正确模型更高的分。评测在这时奖励的是错误

分差小于标准答案的错误率时,排名没有意义。 两个模型差 2 个百分点,而标准答案有 13% 的错题,那这 2 个点完全可能来自谁在错题上碰巧更幸运。小数点后的位数不等于精度。

自动提取的标准答案要检查它的隐含假设。 免费和大规模是它的优点,代价是正确性依赖于一个关于现实的假设。写下那个假设(“一次提交只修一个问题”),然后去查它在数据里成立的比例——这一步几乎总能查出问题,而且几乎总没人做。

“人工核验过”不等于对。 人工核验是一层过滤,不是一个证明。它降低错误率,不消除错误率,而且它降不掉的恰好是标注者共有的那些误解。

收束

回到第一节那个问题:程序说 9,表上写 4,谁错了?

这个问题没有内部答案。判分机制被构造成”表永远对”,所以它在结构上无法回答。要回答,只能从外部再审一次那张表。

于是评测这件事有两个独立的部分:模型有多好,和这把尺子有多准。绝大多数关于分数的讨论只谈第一个。第二个不谈的时候,它不会消失,只会变成第一个的误差——而且不带标记。