TT Lab
开始
学习 学习路径 课程

AI瘦身失败事件

准确率掉了 0.3%,这句话什么时候才有意义

在 TT Lab 中继续学习

一句话总结

准确率的差异不是把两个数字相减得来的,而是来自 样本数和出现分歧的样本数。如果不是在同一批样本上比较,0.3 个百分点什么也说明不了。

为什么这是个问题

在决定量化后的模型上不上线时,出现得最多的一句话是“准确率下降了 0.3%”。光凭这句话,什么也决定不了。如果样本只有 300 个,0.3 个百分点就只差一个样本。重新抽一遍同样的数据,方向都可能反过来。

准确率是一个比例,从样本中测出比例,样本波动多大,它就波动多大。测试样本 400 个、准确率为 0.78 时,这一个数字的 95% 区间大致是 0.74 到 0.82,宽度为 8 个百分点。看到这个宽度的人,不会把 0.3 个百分点当作依据。

但这里还会出现另一个常见的错误:因为区间重叠,就说没有差异。这同样是错的。如果两个模型是在 同一批样本 上测的,可用的信息要多得多。

如何判断

关键在于两个模型 看到的是同样的输入。400 个样本中,有 380 个两个模型都答对,3 个两个模型都答错,那么这 383 个样本对区分两个模型毫无帮助。剩下的 17 个,也就是一个答对、另一个答错的样本,才是信息。

所以要把表做成 2x2。

                B 맞음   B 틀림
  A 맞음        307       6      <- A 만 맞은 6건
  A 틀림          8      79      <- B 만 맞은 8건

在这张表里,准确率的差是 (8 - 6) / 400 = 0.005。但重要的是,分母不是 400,而是 出现分歧的 14 个。14 个样本以 6 比 8 分开,和扔 14 次硬币得到 6 比 8 没什么区别。把这个判断变成一个数字,就是配对比较统计量,这个实验用的是以分歧样本数为分母的尺度。分歧样本数少的时候,无论差异看起来多大,统计量都不会变大。

有人会问,增加样本不就行了吗?这话没错,但代价很高。区间的宽度与样本数的平方根成反比缩小,所以要把宽度减半,样本就得增加到四倍。对于准确率 0.78 的模型,想把 95% 区间的半宽从 0.04 收窄到 0.005,测试样本大约需要 2 万 6 千个。给这么多样本标注标签并不现实,所以在增加样本之前,要 先用同一批样本做配对比较。配对比较把两个模型共同经历的波动整个抵消掉,因此用相同的样本数能抓到小得多的差异。

基线也不止一个。通常是两个。FP32 原始模型 回答“量化损失了多少”,上一版部署模型 回答“会不会比现在在线运行的更差”。这两个问题的答案可能方向不同。确实会出现比原始模型差、却比上一版部署模型好的候选。

在现场必须区分的两件事

输出差异和任务指标是两回事。最大绝对误差和余弦相似度测的是 输出向量动了多少,准确率测的是 决策有没有改变。二者不会一起变化。最大绝对误差高达 1.7,准确率却反而上升的情况也有。离决策边界很远的样本,即使输出大幅波动,答案也不会变。

所以报告要同时写下三项:输出动了多少(最大绝对误差、余弦),决策被翻转了多少个(翻转的样本数与方向),结果任务指标怎么样了(准确率及其区间)。只写一项,读的人就会自己想象其余的。

还有一点要当心。把同一批测试样本反复用于多个候选,就会选出碰巧与该样本合得来的候选。测了十个候选再挑出最好的一个,这一个的区间会比第一次测的时候更乐观。所以在比较多个候选之后,必须有一道流程,用 一次也没用过的样本 重新测量选中的候选。这个实验只处理一个候选,但要知道,一旦候选增多,这个问题就会随之而来。

再补充一点。统计翻转的样本时,必须区分 方向:原本答对变成答错的个数,原本答错变成答对的个数,以及错误答案变成另一个错误答案的个数。第三项对准确率没有任何影响,却是模型发生了波动的证据,在用户眼里就是“答案变了”。

实际工作中真正重要的事

下一项实验要做什么

亲手生成测试数据和三个版本(FP32 原始模型、上一版部署模型、整数候选)的预测,再一步步扩展用来测量准确率区间、配对比较表、翻转样本、输出差异的工具。评分器不会相信你写下的数字。它每次都会用不同的随机种子摆出自己的预测表,真正运行你的工具,并由评分器把同样的计算重做一遍来核对。第 1 步会用你留下的随机种子重新生成测试输入,并亲自运行你的模型。