从0训练LLM · 现代大模型体系 阅读 + 实验 ≈ 35 分钟 页内实验 ×3
C14 评测与训练仪表:分数能信吗 第 2 课

训练完,在公开 benchmark 上报一个分数——这个分数能信吗?

benchmark 分数与污染
公开题一旦混进训练数据,分数就不再只量能力。浏览器里的 4-gram 模型只见过题库一次,续写题全对率就从 0 变成 80%,同分布的新题纹丝不动。GPT-3 自己的去污染程序有 bug;GSM1k 用新题量出最多 8 个点的虚高;Oren 等人不看训练数据,用题目顺序给出有保证的 p 值。三种办法各查一种污染,各有盲区。
❓

本课一问:训练仪表都正常,模型训完了。拿一个公开 benchmark 考一下,报一个分数——这个分数说的就是模型的能力吗?

这一课先不碰:别人技术报告里的数字该信几分(岔路课);小模型上分数有多少噪声、能不能推到大模型(第 3 课);用模型当裁判、人类盲测投票这类评测方式(见文末「你可能会问」)。

从已有出发

模型从文字一路算到下一个 token 的概率,这条流水线已经完整了。评测就是在流水线的末端,把模型的输出和标准答案比:

从已有出发 · 累计数据流 点已学环节看形状与参数
解码层

把贯穿例句做成一道阅读题:「小明把苹果给了小王。问:谁拿到了苹果?」标准答案是「小王」。模型读完题,续写出「小王」就算对。一个 benchmark 就是几百到几万道这样的题,分数 = 答对的比例。

这道题的原文在锚点模型里只有 5 个 token(小明 / 把 / 苹果 / 给了 / 小王)。记住这个长度,第 2 节会用到:GPT-3 查「题目有没有泄进训练数据」用的是 8 到 13 个词的片段,这道题连一个片段都凑不出来。

🔁

这一课为什么换例子。要看「题泄进训练数据会怎样」,得有一份能完全掌控的训练语料,并且能在页面里现场训练。所以实验台改用我们项目的《三國志演義》:训练文本是训练集前 30,000 字,题目是验证集(全书最后约 10%)里的真原文句子,模型是 C0 第 1 课那种「数数」的字级 4-gram 语言模型——训练就是数一遍,在浏览器里 0.1 秒完成。

先自己设计:直接报分

最直接的做法:把公开题库拿来考,答对多少报多少。下面是一个 30 道题的「公开题库」(给出一句的前面部分,续写最后 6 个字)和另外 30 道同分布、从没公开过的「新题」。默认设置是公开题只混进训练文本 1 份:

  1. ① 朴素方案
  2. ② 它在哪失败
  3. ③ 改进方案
朴素方案拿公开题库直接考,答对多少报多少
把公开题泄进训练文本:分数虚高多少?同分布的新题呢?字级 4-gram · 《三國志演義》30,000 字 · 浏览器内现算

数字来源:浏览器实时计算(训练 = 数 n-gram,确定性,无随机噪声;打乱与「打散」用固定种子)。训练文本是项目训练集前 30,000 字;题目是验证集里的真原文。每改一次设置都重新数一遍。

🎯

试三件事:① 把「泄进训练文本」切到 0 份,读两套题的逐字准确率:16.1% 对 20.6%,差的这 4.5 个点是 30 道题的抽样噪声,不是污染;② 切到 1 份,读下面那张表里模型的续写——整句原样背出来;③ 切到 4 份,6 字全对到 28 / 30,逐字准确率 98.9%,新题还是 0。

这个 4-gram 模型会把见过的句子整句背下来,所以这里的虚高是上限。大模型上效应要小得多,而且因题而异——GPT-3 的结论是多数基准上影响很小,但不能排除;这正是需要下面三种检测办法的原因。

改进一:查逐字重叠(n-gram 去污染)

C0 第 1 课埋过一句:n-gram 没有消失,它成了数据工具,GPT-3 用它查评测题有没有混进训练数据。现在兑现。

GPT-3 做了两件事 :

算法模拟器 · 在真原文上做逐字重叠扫描
逐字重叠扫描:n 取多大才不误报、又不漏报?字级 4-gram · 《三國志演義》30,000 字 · 浏览器内现算

数字来源:浏览器实时计算(训练 = 数 n-gram,确定性,无随机噪声;打乱与「打散」用固定种子)。训练文本是项目训练集前 30,000 字;题目是验证集里的真原文。每改一次设置都重新数一遍。

🎯

试三件事:① 默认 n = 8、不泄题:30 道一道都没标——干净;② 把 n 调到 4:17 道被标出来,可它们一道也没泄露,只是和第一回到第六回共用了四字短语——这就是 GPT-3 把 N 的下限定为 8 的理由;再开「忽略高频片段」,误报只少了 2 道;③ 切到「泄进 1 份」:任何 n 下 30 道全中。逐字扫描抓得住原样抄进去的题。

它有两个盲区,都来自原文:

C7 第 2 课的去重也在同一条线上:Lee 等人发现标准数据集里有超过 4% 的验证样本与训练集重叠——去重本身就在给评测去污染。

改进二:换一套没见过的题

不看训练数据,也能量出虚高:照着原题库的风格重新出一套题,两边分数一比。GSM1k 就是这么做的——按 GSM8K 的风格、难度、步数、答案量级,请人重新出了 1,205 道小学数学题。同一套评测设置下,部分模型在新题上掉了最多 8 个点;最大的是 Yi-6B-Chat,从 GSM8K 的 43.7% 掉到 GSM1k 的 35.7% 。

差 8 个点,是不是抽样噪声?用两比例 z 检验算一次(GSM1k 附录 F 用的就是这个检验):

两比例 z 检验:两套题上的准确率差,是不是大过了抽样噪声
= ( − ) ÷ √( · ())
👆 公式里带下划线的每一项都可以点——点哪项,讲哪项。
代入:z = (0.437 − 0.357) ÷ √(0.3988 × 0.6012 × (1/1,319 + 1/1,205)) = 4.10。原表写的是 4.135,差别来自表里的准确率已经四舍五入到三位小数。

这个办法不需要知道训练数据是什么,但有两个代价:新题的分布只能「尽量」和老题一致(GSM1k 用人类解题率、步数、答案量级去对齐);新题一公开,下一代模型又可能吃进去。所以 GSM1k 的作者先不公开这套题,还额外留了一小批从未发出去的题。另一种思路是按时间切分:LiveCodeBench 持续收集比赛平台上新出的题,只用模型训练截止日期之后的题评测;Li 与 Flanigan 发现,很多模型在它们训练数据截止之前发布的数据集上,表现明显好于之后发布的 。

改进三:拿不到训练数据时,可证地检测

大多数模型不公开训练数据。Oren 等人找到一个只要模型概率就能用的办法:很多题库的题目顺序是无关紧要的——打乱了,联合分布不变(可交换)。没见过题库的模型,对原顺序和对任意一种打乱顺序应该一样「眼熟」;如果模型对原顺序明显更熟,那只能是训练时见过按这个顺序排列的题库。

交换性置换检验(Oren et al. 2023 §3.1)
= ( log p(乱序m) ≥ ] + 1 ) ÷ ()
👆 公式里带下划线的每一项都可以点——点哪项,讲哪项。
我们的实验台用 M = 99 的基础版本。
算法模拟器 · 置换检验在浏览器里现算
拿不到训练数据时:按原顺序的题库,是不是比打乱后「更眼熟」?字级 4-gram · 《三國志演義》30,000 字 · 浏览器内现算

数字来源:浏览器实时计算(训练 = 数 n-gram,确定性,无随机噪声;打乱与「打散」用固定种子)。训练文本是项目训练集前 30,000 字;题目是验证集里的真原文。每改一次设置都重新数一遍。

🎯

试三件事:① 默认「整份按原顺序泄进 1 份」:原顺序比 99 次打乱都更眼熟,p̂ = 0.01;② 切到「一题一处、打散」:题照样泄露了(上一个实验台里分数照样虚高),可 p̂ 变成 0.44——模型没见过题与题之间的顺序,这个检验测不出来;③ 切到 0 份:p̂ = 0.99,落在 0 到 1 之间哪里都有可能,这就是「没有污染时 p̂ 均匀」。

原文在一个 1.4B 模型上故意混入测试集做了验证 :重复 10 次以上的测试集,分片检验的 p 值小到 10−11 以下;只出现 1 次的测不出(三个数据集 p = 0.099、0.485、0.544),检出门槛约 4 次。作者自己写明了三条局限:题库必须可交换(建议出题人公开声明「已随机打乱」);只查逐字污染;无法排除更复杂的部分污染。

改进四:让题目不公开

三种检测各有盲区,最彻底的办法是让题目根本进不了训练数据:不公开。GSM1k 先不发布;美国 NIST 下属 CAISI 评测 DeepSeek-V4 Pro 时,9 个基准里有两个非公开,结论和 DeepSeek 自报的差了一大截。这件事放到岔路课里细看。

⚠ 常见误解

⚠

「做过去污染,分数就干净了。」GPT-3 做了,但过滤程序有 bug;逐字匹配抓不住改写和翻译(Yang 2023);置换检验抓不住打散插入的题。去污染只能说明「按这种方法没查到」。

⚠

「查出重叠,分数就是虚高的。」DROP 94% 被标,重叠的只是原文段落;Natural Questions 52% 被标,估计增益约为 0。重叠是嫌疑,要用「干净子集与全集的差」或新题去验证。

⚠

「同一个 benchmark 名字,分数就可以直接比。」HF 在 2023 年发现,同一个 LLaMA-65B 在 MMLU 的三种实现下是 0.637 / 0.488 / 0.636,排名也跟着变;OLMES 列出的 6 份文献里,Llama2-7B 的 ARC-Challenge 从 43.2 到 53.7 不等;Anthropic 报告过,把选项从 (A) 改成 (1)、括号换成方括号、多一个空格,MMLU 准确率就能变约 5%。先问:几 shot、什么格式、怎么打分。

在演进地图上的位置

评测的演进:每一代都被上一代的某个真数字逼出来(点名字去那一课;完整版在章首页)
  1. 只看 loss(和 PPL)
  2. 仪表:开局对 ln V、梯度范数、最大 logit、spike score
  3. 公开 benchmark
  4. n-gram 去污染 + 干净子集
  5. 换一套没见过的题 / 按时间切分
  6. 交换性置换检验(可证检测)
  7. 非公开题 + 第三方预先定好的评测集
  8. 三层可信度 + 口径核对
  9. 多种子、信噪比
  10. 平滑指标 + 两步预测
训练后公开 benchmarkMMLU 2020、GSM8K 2021 …你在这里
解决了所有模型做同一套题,分数可以横向比。
卡在同一个 LLaMA-65B,MMLU 的三种实现给出 0.637 / 0.488 / 0.636(HF 博客 2023);题目还会泄进训练数据。
查泄题 ①n-gram 去污染 + 干净子集GPT-2 → GPT-3(13-gram)→ Llama 3(8-gram)你在这里
解决了逐字重叠查得出来:GPT-3 对每个基准做「干净子集」重测,PIQA 29% 被标、干净子集低 3 个点。
卡在GPT-3 的过滤程序有 bug,书一类长文档没滤掉,几个语言建模基准只能不报;改写、翻译能绕过逐字匹配(Yang 2023)。
查泄题 ②换一套没见过的题 / 按时间切分GSM1k 2024、LiveCodeBench 2024你在这里
解决了不看训练数据也能量出虚高:Yi-6B-Chat 在 GSM8K 上 43.7%,同风格新题 GSM1k 上 35.7%。
卡在新题一公开,又会被下一代模型吃进去。
查泄题 ③交换性置换检验(可证检测)Oren et al. 2023你在这里
解决了只要能算 log 概率,就能给出假阳性率有保证的 p 值:重复 10 次的测试集,分片检验 p 到 1.96×10⁻¹¹。
卡在只测「按原顺序、逐字」出现的污染;重复 1 次测不出(p = 0.099 / 0.485 / 0.544)。
结构上防非公开题 + 第三方预先定好的评测集NIST CAISI 2026你在这里
解决了题目不公开,就无法被针对性优化:DeepSeek-V4 Pro 在公开的 GPQA-Diamond 上与 Opus 4.6 差 1 个点,在非公开的 PortBench 上差 16 个点。
卡在分数本身有噪声;小模型上很多题根本测不准。
数字口径:第一格由构建时读取项目真实日志 c08-stability.json 现算(runs 为 c6_lrw_d256_lr0.03 与 ref_baseline);其余出自原文——GPT-3 §4 与附录 C(本地 PDF)、HF《What's going on with the Open LLM Leaderboard?》(2023)、GSM1k 附录 F、Oren 2023 表 1、NIST CAISI 页面(2026-05-01)、DataDecide 摘要、Schaeffer 2023 §1、Hu 2024 摘要、OLMo 2 §3。

证据三问

问本课的回答
① 它解决什么问题?公开题会混进训练数据,分数就量不准能力;还要分清「见过题」「见过原文」和「没见过」
② 数学上为什么可能有效?置换检验在题库可交换时误报率有保证 ;两比例 z 检验衡量差值是否大过抽样噪声
③ 实验上为什么最后选了它?GPT-3 的干净子集分析、Llama 3 的估计增益、GSM1k 的新题对照都是在真实模型上量出来的

一句话

📌

公开基准的分数混着三样东西:能力、见没见过题、怎么考;n-gram 只查逐字重叠,新题对照、顺序检验和非公开题各补一块。

🚦

先停在这里:记住三种检测各查哪一种污染、各漏哪一种,进下一课。
再深一层:走岔路课,看别人技术报告里的数字怎么分三层读——那里有一个「公开题上几乎追平、非公开题上差 16 个点」的真实案例。

下一个缺口

就算题目干净、口径统一,分数本身也有噪声——上面干净时两套题就差了 4.5 个点。小模型上的分数有多少噪声?小实验的结论能推到大模型吗? → 第 3 课:小实验与大决策

岔路 → 技术报告里的数字,各该信几分?

你可能会问

🔍 GPT-3 里还有两个值得一看的「污染」细节

① PIQA:29% 的题被标出,干净子集低 3 个点;可在一个小 25 倍、几乎没有记忆能力的模型上也看到了同样的下降,所以作者判断更可能是「被标出的题恰好更简单」这种统计偏差,但无法严格证明,于是给 PIQA 的结果打了星号。② Winograd:45% 被标出,干净子集低 2.6%;人工检查发现有 132 个 Winograd 题确实在训练数据里,只是格式不同。两件事放在一起看:同一个「干净子集低几个点」,可能是泄题,也可能是两个子集难度不同——这就是第 3 课要讲的「差距要和噪声比」。出处:GPT-3 §4(本地 PDF)。