评测为什么比训练更难
训练只需要最小化一个数字。评测却得先定义什么叫「好」,而定义错了的大多数方式,要到生产环境才会暴露。
从机制上说,训练模型是容易的那部分。你定义一个损失,优化器把它压下去。只有一个数字,一个方向。
评测就没有这种便利。在量任何东西之前,你得先决定对你这个任务来说「好」是什么意思,而大部分难点就藏在这个决定里。一个模型可能在你的指标上拿到 0.99,却毫无用处;也可能分数很差,却正好是你需要的东西。「数字涨了」和「系统变好了」之间的那道鸿沟,就是这一层要讲的全部内容。
指标只是代理,从来不是目标
你真正在意的是些实在的东西:用户能找到正确答案,欺诈能被抓住,摘要忠于原文。这些都无法大规模直接测量,所以你挑一个和它们相关的数字——准确率、F1、BLEU——转而去优化它。
代理永远不等于本体。一个针对准确率优化的垃圾邮件过滤器,如果面对的数据流里有 99% 是正常邮件,那么把所有邮件都标成「非垃圾邮件」就能拿到 99% 的准确率,同时一个垃圾邮件都没抓住。数字很漂亮,系统是坏的。这一层里的每个指标都是一个代理,各自都有类似这样的失效模式,而了解失效模式比了解公式更重要。
好的答案很少只有一种形式
分类有清晰的目标:标签是 cat,或者不是。大多数真实任务没这么整齐。
- 一个译文有几十种可接受的表达。只跟一份参考答案比,等于惩罚了其他同样正确的译法。
- 一段摘要可能正确、忠实、文笔也好,但和「标准」摘要没几个字重合。
- 一个 agent 可以用三种不同的工具调用顺序得到正确结果。去评判顺序,就是在惩罚合理的差异。
当正确答案的空间很大时,任何拿固定参考答案去比对的自动打分,都会把好答案误判成坏答案。这就是生成指标和人的判断总是对不上的原因,也是检索指标奖励的是找到一份相关文档、而不是你要的那份的原因。
你永远是在样本上测量
你从不会在所有可能的输入上做评测。你是在一个测试集上评测——一个有限的样本——并指望它能代表真实的分布。有两件事会让这个指望落空。
样本太小。 在 200 个例子上差 4 个百分点的准确率,完全落在同一模型换个运气就能出现的范围内。把它当成真实的提升,是最常见的一种评测错误,而统计显著性就是用来识别它的工具。
样本会漂移。 模型在生产环境里看到的分布会随时间变化——新的用户行为、新的话题、季节性的波动。上个季度冻住的测试集,会慢慢不再描述今天的流量,而你的指标还在汇报一个已经不存在的世界。
流畅而错误,是一种稳定的状态
对生成式系统来说,有一种在经典机器学习里没有对应物的失效模式:输出读起来毫无破绽,事实上却是假的。一条幻觉(hallucination)出来的引用,语法正确、语气笃定、看着很可信。随手翻十条输出觉得「都还行」,什么也说明不了,因为流畅恰恰是模型最擅长的,而正确性恰恰是你没检查的那一项。
这就是靠肉眼扫不行、而主观质量仍然需要带明确标准的结构化人工评估、而不是凭直觉的原因。
优化一个指标,就会败坏它
一旦某个度量变成了目标,人和模型就开始钻它的空子——这就是古德哈特定律。因为长回答在评审里得分更高就去优化回答长度,你得到的就是注水。拿公开的基准测试去训练,基准就会渗进训练数据,分数一路走高而真实能力原地踏步。基准测试污染就是这个问题的领域级版本。
防御办法不是找一个更好的单一指标,而是一篮子很难同时满足的指标,再加上定期拿系统从未被优化过的标准答案做检查。
要点回顾
- 训练最小化一个定义好的损失;评测得先决定「好」是什么意思,而难点全在这个决定上。
- 每个指标都是你真正在意之物的代理,每一个都有这样的失效模式:代理看起来很漂亮,系统却是坏的。
- 你是在一个有限且在漂移的样本上测量——小的差异往往是噪声,所以要检验显著性。
- 流畅而错误能骗过走马观花;主观质量需要结构化的人工评审。
- 指标一旦变成目标就开始败坏(古德哈特),所以要拿系统没有被优化过的东西来做评测。
下一篇: 精确率、召回率、F1 与准确率