当前位置:首页>排行榜>你的评测集在骗你:换个切法,结论就翻号

你的评测集在骗你:换个切法,结论就翻号

  • 更新时间 2026-11-15 07:48:26
你的评测集在骗你:换个切法,结论就翻号

讲蒸馏那篇里我留过一句脚注:"前 120 题恰好偏难,所以基线看着低。"这句一直没验证。这次只把它当问题重切一遍——模型一个都没重跑,只改"从 400 题里取哪几题"。

摘要:只换评测集切法,"白盒比黑盒高 3.5 点"就变成"黑盒比白盒高 6 点";同一基座同批题跑两遍差 2.5 点;上一稿那句"前 120 题偏难"这次测出来不成立。附换考卷重切的做法、题量算法和一份考卷冻结清单。


太长不看版

  • • 同一份结果文件,评测从 400 题切成前 50 题:未训基线 42.8%→42.0%(只差 0.8 点,看着很稳),但"白盒蒸馏减黑盒蒸馏"的差值从 +3.5 点翻成 −6.0 点——领先方换了边。
  • • 两个符号都不显著(n=50 时 p=0.58,n=400 时 p=0.18)。所以不是"50 题测出了真相",而是小切片的符号本来就随机跑,拿哪个下结论都会翻车。
  • • 切到 50 题,连"训练把模型弄坏了"都测不出来:黑盒少教材臂相对基线 −16.0 点、p=0.077(不显著);n=100 起才 p<0.05,n=400 到 p<0.00001。一个真实存在的负结果,被切片宽度吃掉了。
  • • "前 120 题偏难"站不住:把 400 题随机无放回抽 120 题重算 2 万次,基线取前 120 题(40.0%)落在第 26.6 分位——正常抽样波动。但同一把刀在另一臂偏到第 2.8 分位(24.2% 对全卷 31.2%),偏不偏要逐臂量。
  • • 同一个模型同一批题跑两遍也有 2.5 点抖动:基线两次分别 37.5% 与 40.0%,3 道题判分翻面、方向完全一致,配对 p=0.25。
  • • 区间比小数点重要:n=50 时基线 95% 区间 29.4%–55.8%(宽 26 点),n=400 收到 38.0%–47.6%(宽 9.6 点)。这口径不只我在用——分数不带置信区间,等于没测。[1]

本文导读

一、我只改了一行切片 → 二、翻号那一刀 → 三、切掉显著性那一刀 → 四、"前 120 题偏难"我自己不认了 → 五、更狠的两刀:判分与重跑 → 六、到底要多少题 → 七、考卷冻结清单 → 八、要点回顾

一、我只改了一行切片

素材是我自己的蒸馏实验:7B 老师教 0.5B 学生,五组训练方式(未训基线、黑盒只学老师输出、白盒对齐老师的判断分布,后两类各再分少教材/多教材),最后统一在同一批 400 道题上逐题记下"对/错"。

逐题命中我原样存着(每臂一串 0/1、长 400),所以重切不用重跑模型:把前 N 题的命中重新平均,就是一个新分数。整个台架长这样——上面两格(模型、判分器)这轮一个字都没重跑,全部新增读数出自中间那层算术:

重切台架:模型侧冻结,只有"取前 N 题"这一步被改动

# 重切的核心只有三行:把存好的逐题命中按前 N 题取一段for n in (50, 100, 150, 200, 261, 320, 400):    head = hits[:n]          # hits 是存好的 "01001..." 串,零模型推理    print(n, round(100 * sum(head) / n, 1))

各臂准确率(%):

臂
前50
前100
前200
前261
全400
未训基线
42.0
41.0
41.0
42.5
42.8
黑盒·少教材
26.0
28.0
25.5
26.4
26.2
白盒·少教材
20.0
26.0
29.0
30.7
29.8
黑盒·多教材
28.0
28.0
29.5
30.3
30.8
白盒·多教材
24.0
25.0
27.0
28.7
31.2

单看基线(42.0 对 42.8)会觉得"挺稳"。但平均值稳不代表差值稳——差值才是结论的载体,而它由翻转题决定,题数一少就没人撑着了。

同一批输出,只换考卷

二、翻号那一刀

拿"白盒·少教材"减"黑盒·少教材"。这两臂教材条数、训练配置、评测题集全同,唯一区别是学老师的写法还是对齐老师的判断:

切法
前50
前100
前150
前200
前261
全400
白盒−黑盒(点)
−6.0
−2.0
+1.3
+3.5
+4.2
+3.5
同题配对 p
0.58
0.84
0.86
0.36
0.20
0.18

前 50 题说"黑盒赢 6 点",全 400 题说"白盒赢 3.5 点"。符号反了。

多教材那一对也演了一遍,只是幅度小:前 50 题黑盒领先 4.0 点、前 150 题黑盒领先 4.7 点,到全 400 题变成白盒领先 0.5 点(p=0.92)。

白盒减黑盒的差值,换个切法就翻号

注意两栏的 p 都远大于 0.05,所以没有哪一种切法测到了真相。诚实的读法是"这个差值测不出显著",于是它在任何切片上的符号都不该被写进结论。

这也是我要自纠的地方,而且不止一处。蒸馏那篇我写的是"白盒 KL(拿老师内部判断分布做对齐)相对黑盒 SFT(只拿老师输出的文本做监督微调)+3.6 点"。那个 3.6 是 29.8 减 26.2 得来的——两个已经四舍五入到一位小数的百分数相减。用逐题命中直接算:29.75% − 26.25% = 3.5 点。数字不大,但方向是我这篇正在批评的那类毛病:先丢精度、再做比较。同一篇里它还留了个带正号的数在表上,足够被谁截出去引用三十天。

三、切掉显著性那一刀

上一节是"没差异被切成有差异"。反过来更贵:真实存在的差异,被小切片切成没差异。

学生蒸完比不蒸还差,这件事在我这组实验里一直是负的。把它相对未训基线做同题配对,随切片宽度的读数是:

蒸馏臂(相对基线)
前50
前100
前200
全400
黑盒·少教材
−16.0(p=0.077)✗
−13.0(p=0.030)✓
−15.5(p=0.0002)✓
−16.5(p<0.00001)✓
黑盒·多教材
−14.0(p=0.144)✗
−13.0(p=0.035)✓
−11.5(p=0.006)✓
−12.0(p=0.00003)✓
白盒·少教材
−22.0(p=0.003)✓
−15.0(p=0.008)✓
−12.0(p=0.003)✓
−13.0(p<0.00001)✓

两个黑盒臂在 50 题上都是"看不出差异"。负结果被切片宽度藏起来了——和我在蒸馏篇里写过的那句"怎么判分本身就能把负结果藏起来"是同一类事,只不过这次的凶手不是正则,是 n。

同一份负结果逐档过显著性闸门:只有前 50 题那档被拦下

差异的来源很朴素:配对检验只数翻转题。n=50 时黑盒少教材臂只剩 16 对(12 道基线对学生错、4 道反向),n=400 变成 132 对。信息量差 8 倍。这张检验器本身就是一张网络——切片变小,是传上去的翻转题变稀疏,不是数据变干净:

同题配对检验器:命中向量过比较门,只有翻转格向上传值

四、"前 120 题偏难"我自己不认了

蒸馏篇里,基线从 42.8%(400 题)掉到 37.5%(120 题),我当时写的是"前 120 题恰好偏难"。这次把它当假设来检验:如果题序真的偏难,"取前 120 题"就该明显落在随机抽样的尾部。

做法:每个臂把 400 题随机无放回抽 120 题、重算 2 万次,看"前 120 题"那个分数排在哪个分位。

臂
全400
前120
随机120中位
前120所在分位
未训基线
42.8
40.0
42.5
26.6%
黑盒·多教材
30.8
27.5
30.8
20.8%
白盒·多教材
31.2
24.2
31.7
2.8%
黑盒·少教材
26.2
27.5
26.7
68.7%
白盒·少教材
29.8
25.8
30.0
10.7%

取前120题落在随机抽样的第几分位

基线那次偏移(42.8→40.0,2.8 点)落在第 26.6 分位,距中位只差 0.7 个标准差(这批量下超几何标准差 3.8 点)——就是正常抽样波动,不是题序变难。我上一稿那个解释,被自己重切翻了。而逐块看基线也支持这一点:第 0–99 题 41.0%、100–199 题 41.0%、200–299 题 49.0%、300–399 题 40.0%,中间那块高 8 点,前段根本不难。

但同一把刀下别的地方很偏:白盒多教材臂的前 120 题在第 2.8 分位(偏 7.0 点),黑盒少教材臂反而在第 68.7 分位。"偏难"连方向都不统一,它是逐臂的属性,不是这张卷子的属性。

能留下的结论只有一句:取前 N 题不是随机抽样,它自带一个你不知道方向的偏移;偏多少,只能在有全卷命中时逐臂量出来。

五、更狠的两刀:判分与重跑

判分口径。 还是那批 120 题、同一份输出,只改"怎么从文本里读出答案":

组
只认中文"答案是 X"
末行数字兜底
未训基线
5.8%
37.5%
学老师推理的学生
24.2%
26.7%

只认中文标记,基线被判成 5.8%,于是"学生 24.2% 远胜基线 5.8%"——一个完全反向的结论,零成本生成。原因不神秘:基座答对时用的是英文格式(Therefore, the answer is \(1260\).),被我自己写的正则判成了无效作答。

重跑抖动。 同一个未训基座、同一批 120 题、greedy 解码(不做采样),两次独立跑分给出 37.5% 和 40.0%。逐题比:3 道题翻面,而且方向完全一致——都是后一次对、前一次错,反向一道没有,配对 p=0.25。批内 padding 和浮点累加顺序就足够造出这个量级。

所以"比上次涨了 0.8 点"这种句子,在 120 题的卷子上没有任何分量。

切片、判分、重跑这三刀指向同一件事:分数不是模型的属性,是"模型 × 题集 × 判分 × 这一次运行"四者的属性。

六、到底要多少题

给一个能自己算的判断,别靠感觉。

第一步,先算你的误差条。 n 题里对 k 题,95% 区间的宽度大约:

按 p≈0.42 代:n=50 宽 26 点,n=120 宽 17 点,n=400 宽 9.6 点。想稳定分辨 3 点以内的差,单组区间得比它窄一半以上——这时 400 题都还勉强。

第二步,比差值一律同题配对。 别看"两个区间重不重叠"。同一批题上两臂绝大多数结果相同,只有翻转题携带信息,用精确二项(McNemar)只对翻转题检验。我这次 n=50 剩 13–17 对翻转、n=400 有 120–132 对,显著性从 0.077 走到 p<0.00001,全部差别就在这儿。

第三步,把切法当变量测一次。 这一步免费:只要有逐题命中,跑一遍第四节那张分位表,就知道"取前 N 题"偏了几个点。偏超过 1 个标准差,这份评测得重做。

这套做法不是我自创的口径。给评测分数配误差条、按题聚类估方差、先算样本量再跑评测,外部已经有相当明确的操作指南。[1]

七、考卷冻结清单

写差值之前逐项打勾,缺一项就别下结论:

项
要冻住什么
我踩过的写法
题集
题目 ID 清单 + 条数
"取前 120 题"(默认它无偏)
判分
正则原文 + 解析失败怎么算
"按标准答案比对"(漏了中英文格式)
生成
输出长度上限、是否采样、批大小
"greedy 跑一遍"(漏了批大小)
基线
未训基座同卷同口径分数
只报训练后的分数
误差
每个分数的区间宽度
只报点估计
切法
前 N 题对随机 N 题的分位差
压根没这一项

前三行是我反复栽的坑(长度上限把基线压低过、正则把基线打成 5.8% 过)。最后两行是这次新增的——切片偏移和重跑抖动,我以前完全没管。

八、要点回顾

  • • 只改"从 400 题里取前几题",白盒和黑盒谁领先就换了边(+3.5 点 ↔ −6.0 点);两边都不显著,所以哪边都不许写进结论。
  • • 切到 50 题,能把一个 p<0.00001 的真实负结果读成"看不出差异"。汇报里最贵的一刀是切片宽度。
  • • "前 120 题偏难"这句我上一稿用了,这次量出来不成立(第 26.6 分位);但同一切法在另一臂偏到第 2.8 分位——偏移逐臂,不是题目的固有属性。
  • • 判分正则能把"学生比基线差 10.8 点"读成"学生比基线好 18.4 点",换次运行能造出 2.5 点。分数属于"模型 × 题集 × 判分 × 这次运行"。
  • • 三步自证:算误差条、同题配对、把切法当变量重测一遍。最后一趟不用重跑模型,只要你把逐题命中存下来。

你上次汇报的那个提升,用的是同一批题还是新抽的一批? 报个大概就行:多少题、差几点、有没有做配对。留言里出现最多的那一类,我挑一种单独扒一次——不承诺篇名,得先看有没有共同缺口。

随机文章