2023 年之后做基准评测的团队越来越频繁地遭遇一种尴尬:模型在 GSM8K 上 92 分,换一套同难度但新出的题掉到 70。差距的一个主要解释是污染——基准的题目和参考答案早就在公网流传,训练时见过原题。GSM8K 的 canonical solutions 在 GitHub 上有上千个 star 的仓库逐题收录;HumanEval 的 164 道题在 Stack Overflow 和各种博客里被反复讲解;MMLU 的题目混进了教科书和维基。不处理污染,榜单分数就是在测记忆而非能力。这篇把两条主流检测路线的原理和工程细节走完。
路线一:n-gram 重叠,行业默认做法
思路直截了当:把基准的每道题(连同答案)切成 token 的 n-gram,在训练语料上建 n-gram 索引,任何一篇训练文档命中了某个 n-gram 就标记为疑似污染。GPT-3 论文用的是 13-gram:一个 13-token 的连续片段同时出现在基准和语料里,在统计上几乎不可能是巧合(英语 13-gram 的碰撞概率可以忽略),所以直接按"命中即删除"处理。
为什么是 13 而不是 8?这是精度-召回的权衡,可以定量算。假设语料 $D$ 个 token、词表 $V$ 有效大小,随机 8-gram 的期望碰撞次数约为 $D \cdot D_{\text{bench}} / V^8$ 量级,对 $D \sim 10^{13}$、基准 $10^4$–$10^6$ 的规模,8-gram 的随机碰撞期望仍在千级上下——会把大量无辜文档误杀;13-gram 则把随机碰撞压到个位数,代价是抓不住"改动三五个词"的轻度改写。PaLM 和后续不少工作用了 8–10 的更低门槛换取召回,靠第二步人工复核兜住误杀。
工程上的关键实现点:
- 归一化:大小写、空白、标点、Unicode 规范化(NFKC)之后再切 n-gram,否则同一道题因为排版差异全漏。这一步漏做是过去几个"去污染了但分数没掉"案例的共同原因。
- 双向匹配:不只是"语料里有没有基准题",还要查"基准是不是整段复制自某篇语料文档"(比如 MMLU 的某道题直接摘自维基条目)。方向反过来,阈值和人工复核流程也要重设。
- 索引成本:万亿 token 语料建 13-gram 索引,内存占用是实打实的数字。Spark/Beam 上跑 MinHash 前缀索引(把 n-gram 哈希取模分桶)能把内存压到单机可承受;不要用精确后缀树,那个会被内存杀掉。
GPT-3 的口径值得记住:按 13-gram 命中删除后,他们在去污染子集上重测,大部分基准分数掉了 1–3 个点,个别(如某些翻译对)掉更多——这就是污染的规模感。
路线二:嵌入相似度,抓改写和翻译
n-gram 的盲区是语义不变但字面全变的泄漏:题目被翻译成中文又译回来、被 AI 改写、被换成人名和数字重新出题。抓这类要靠嵌入:用双塔或单塔嵌入模型把基准题和语料文档(按段落切)映成向量,余弦相似度超过阈值(经验值 0.8–0.9,阈值要在一个有人工标注的小集上校准 precision/recall 再定)即标记。
这条路的成本比 n-gram 高一个数量级:嵌入推理要 GPU,十亿级段落的向量入库要 ANN 索引(HNSW,检索篇展开过原理),而且相似度分数的分布是模糊的——0.85 的段落到底是"同题改写"还是"同知识点合理解法",人工复核躲不掉。n-gram 的好处恰恰在这里:13-gram 命中几乎没有歧义,删除决定可以自动化。
主流团队的组合是两阶段:n-gram 全量自动删(误杀率可忽略),嵌入相似度只跑高价值基准(数学、代码、多选问答)加一层召回,命中送人工复核。Gemma 的技术报告公开了类似口径,Llama 2 坦承预算有限只做了 n-gram 级处理——这类披露本身就是选型时的重要参考。
漏网的部分怎么办:结构性应对
两条路线做完,仍然有一群漏网之鱼抓不到:模型在预训练里见过同一知识点的其他表述(没抄题但学过解题套路)、见过该领域的海量同构内容(数学证明风格、代码题模式)。这类"软污染"无法用相似度检测定义,处理方式要从检测转向实验设计:
动态基准。 最干净的方案是持续出新题。GSM8K 作者自己做了 GSM-Symbolic:把原题的数字和名字参数化,每次采样新实例。Golchin 和 Surdeanu 的 Time Travel in LLMs 系列用"构造时晚于训练截止"的题对比分数,直接量化污染贡献。做严肃评测的团队,应该把至少一个动态基准纳入常规看板。
Canary 字符串。 OpenAI 在 GPT-2 时代引入的做法:在文档里埋一个不可能出现在正常文本中的标识串(如 ogiheruvb123),训练后直接向模型查询这个串。模型能完整复述,说明训练管线对这个文档没有做任何隔离——这是检测"你家过滤到底有没有生效"的探针,成本低,值得每个团队埋几条。
事后补救的边界。 需要明确:训练完成后发现的污染没法事后去除——权重里的记忆化无法定点删除(机器遗忘方向的研究还没到可用状态)。所以去污染是数据管线的上线闸门,不是训练后的补丁。一个组织流程上的经验:去污染检查要放在"数据冻结"这个里程碑上,由不背训练进度的人签字,否则 deadline 压力下这步几乎必然被压缩。
小结
污染检测有两条互补路线:n-gram 重叠(GPT-3 的 13-gram 口径,随机碰撞可忽略,命中即删可全自动)和嵌入相似度(抓改写翻译,成本高、边界模糊、需人工复核)。实操组合是前者全量跑、后者只保高价值基准,再配合动态基准和 canary 字符串兜底结构性泄漏。归一化、双向匹配、删除比例披露是三个最容易被偷工减料的环节。事后无法补救决定了去污染必须在数据冻结时作为闸门执行,而不是训练后的补救动作。