为什么你的 loss 掉得漂亮,模型却越来越笨
验证集里有 4.7% 的样本以另一种表述出现在训练集中。这篇写数据去重、评测污染的检测方法,以及为什么漂亮的指标往往是最危险的信号。
那是一个周四的下午。我们的 7B 模型在内部评测集上刚刚从 68.2 涨到 74.5,团队群里刷了一排烟花表情。产品同学开始讨论下周就上灰度。
然后有人随手问了它一个问题:“帮我把这段话改得客气一点。”
它输出了一段完美的、和训练集里某条样本几乎逐字相同的回复——包括那条样本里本来就有的错别字。
指标是一个有偏的传感器
我们习惯把评测分数当作”能力”的测量结果。但它其实只是模型在特定分布上的行为记录。当训练分布和评测分布之间出现泄漏,这个传感器就不再测量能力,而是测量记忆。
更麻烦的是,这种失效是单向的:泄漏只会让分数变好,永远不会让它变差。所以你不会因为指标异常而警觉——恰恰相反,你会很高兴。
任何足够漂亮的提升,都应该先被当作 bug 处理,直到你能解释它为什么发生。
四类泄漏,按隐蔽程度排序
字符串完全相同的重复样本,任何一个 dedup 脚本都能抓出来。真正的问题在下面三层:
- 改写泄漏 —— 同一个问题的不同表述。语义一致,编辑距离很远,n-gram 去重完全失效。
- 知识泄漏 —— 评测题的答案作为陈述句出现在预训练语料里。这几乎无法避免,只能量化。
- 格式泄漏 —— 模型学到了评测集特有的排版习惯(比如总是三段式),于是在自动评分器那里拿到了额外的分。
整个检测流程大致是这样:
用 embedding 做近似去重
字符级方法搞不定改写泄漏,所以我们退到向量空间。做法很朴素:把训练集和评测集都编码,然后对每个评测样本检索最近邻,超过阈值的标记为可疑。
# 语义级近似去重:找出评测集中与训练集过于相似的样本
import numpy as np
import faiss
def find_contamination(train_emb, eval_emb, thr=0.92):
"""返回可疑的 (eval_idx, train_idx, 相似度) 三元组"""
faiss.normalize_L2(train_emb)
faiss.normalize_L2(eval_emb)
index = faiss.IndexFlatIP(train_emb.shape[1])
index.add(train_emb)
# 内积 == 余弦相似度(已归一化)
sims, idxs = index.search(eval_emb, k=5)
hits = []
for i, (s_row, i_row) in enumerate(zip(sims, idxs)):
if s_row[0] > thr:
hits.append((i, int(i_row[0]), float(s_row[0])))
print(f"污染率: {len(hits) / len(eval_emb):.2%}")
return hits阈值 0.92 是我们试出来的经验值,没有理论依据。低于 0.88 会把大量正常的同主题样本误判,高于 0.95 又抓不到充分改写的情况。这个数字一定要人工抽样校准,不同 embedding 模型差异很大。
一个更严格的判据
除了检索,我们还用了一个统计判据:如果模型真的只是”学会了能力”,那它在污染样本和干净样本上的表现差距应该接近于零。定义污染增益:
其中 是可疑集合, 是单样本得分。我们那次的 是 +21.3。也就是说,模型在”见过”的题上比没见过的题高出 21 分——这不是能力,这是抄。
剔除污染样本后重新评测,结果一目了然:
| 配置 | 全量评测 | 剔除污染后 | Δ |
|---|---|---|---|
| baseline | 68.2 | 67.9 | −0.3 |
| + 新数据 v2 | 74.5 | 68.4 | −6.1 |
| + 新数据 v3 | 71.8 | 71.1 | −0.7 |
v2 的”提升”蒸发了 87%。v3 才是真的。
我们后来改了什么
技术方案是次要的,流程才是根本。三条现在写进 CI 的规则:
- 任何新增训练数据入库前,强制跑一次针对全部评测集的语义去重,污染率超过 1% 直接拦截。
- 保留一个永不参与任何检索、任何调参的冷藏评测集,每月只解封一次。
- 指标提升超过 3 个点时,需要提交一份归因说明才能合并。听起来很官僚,但它救了我们两次。
第三条最有用,也最让人不舒服。它的本质是强迫你在兴奋的时候保持怀疑——而这恰恰是人最不擅长的事。
一点题外话
这件事之后我改了自己的一个习惯:看到好结果时,不再问”为什么这么好”,而是问”如果这是假的,会是哪里假的”。
它让我慢了一些,但错得少了很多。在一个所有人都在赶迭代的领域里,这可能是我唯一还算有价值的方法论。
如果你觉得我某个判断是错的,欢迎写信讨论。
