04. Evaluation 中的数据污染问题怎么检测和规避?

整理 Evaluation 数据污染的产生原因、检测方法与规避策略。

简单回答

数据污染(Data Contamination)是指模型训练集中包含了评测集相同或相似的内容,导致评测分数虚高——模型是在"背答案"而不是真正会做题。检测方法主要有 N-gram 重叠检测和嵌入相似度检测;规避方法包括评测集时间隔离(使用训练截止日期后的数据)、训练时主动过滤已知 benchmark、以及持续更新评测集。这个问题直接影响 benchmark 的公信力,在发布模型时诚实披露是基本要求。

详细解答

污染是怎么发生的

大模型预训练数据主要来自互联网爬取,而 MMLU、HumanEval、GSM8K 等 benchmark 的题目和答案都公开在互联网上。只要爬取时间晚于 benchmark 发布时间,这些内容就可能进入训练集。

污染有几种程度。直接污染:训练集里有和评测题一模一样的内容(题目+答案),模型见过了,直接背出来。间接污染:训练集里有高度相似的内容(比如评测题的原始资料、改写版本),模型获益但不是完全直接复制。答案泄露:有时候 benchmark 的解析文章会把题目和标准答案一起发布,这类文章进入训练集后污染最严重。

污染的严重性在于它会让模型看起来比真实能力更强——在 benchmark 上高分,但换一批没见过的同类题就差很多。这误导了模型选型决策、研究方向判断、以及用户预期。

检测方法

N-gram 重叠检测是最常用的方法。把评测集里每道题的文本切成 N-gram(通常是 8-gram 或 13-gram),查训练集里是否有高重叠的文档。实现上,对训练集建 N-gram 倒排索引或布隆过滤器,然后对每道评测题查询。

重叠阈值的设定:通常设置某个 N-gram 重叠率阈值(比如 13-gram 中有一个连续匹配),高于阈值就认为可能被污染。N 越大,精确度越高但召回越低——改写一下(换几个词)就躲过了检测。

这是 LLaMA 2、Mistral 等技术报告里普遍采用的检测方式,会在报告里标注各 benchmark 上检测到的污染比例。

嵌入相似度检测能发现改写式污染。把训练集文档和评测题各自 Embedding,找高相似度的对。代价是计算量极大(万亿 token 级别的训练集全部 Embedding 不现实),通常只对训练集做抽样或只对高价值文档做。

Min-K% Prob(基于模型行为的检测):这是一种不依赖原始训练数据的检测方法,对于无法获取训练数据的闭源模型特别有价值。思路是:如果一段文本在训练集里出现过,模型对这段文本的各 token 预测概率会整体偏高。取这段文本中最低 K% token 的平均对数概率,见过的文本这个值会比没见过的更高(因为即使最"意外"的 token,模型也有一定把握预测到)。

其中 是序列中概率最低的 个 token。

时间分割验证:用训练截止日期之前和之后分别构建评测集,比较模型在两组上的分数。如果在截止日期之后的评测集上明显低分,说明之前的高分有部分来自污染。

规避方法

评测集时间隔离是最根本的解决方案。用模型训练截止日期之后才出现的内容来构建评测集——比如使用最新的竞赛题(当年的 AMC/AIME 题目)、最新发布的时事问题、或者使用发布时间有记录的新数据。LiveBench 就是这个思路,每月更新评测题,用最新的信息来出题。

训练时主动过滤:在预训练数据清洗时,把已知的主流 benchmark 内容加入过滤黑名单。这对已知 benchmark 有效,但对未来新发布的 benchmark 无效。LLaMA、Mistral 等开源模型的技术报告里都有描述这个步骤。

动态更新评测集:不使用固定的、公开的评测集,而是有一套持续更新的私有评测集,不对外公开,只用于内部评测。定期抽换题目,保证模型无法提前"学到"答案。

诚实披露:很难做到完全无污染,但可以做到诚实——发布模型时公布污染检测方法和结果,让用户自己判断分数的可信度。这是一种学术诚信要求,好的技术报告(LLaMA 2、Gemini 等)都有这部分内容。

污染对不同任务的影响

不是所有任务的污染影响都一样大。对于多项选择题(MMLU),只要模型记住了正确选项,就能直接答对,污染影响很大。对于生成类任务(写一篇关于 X 的文章),即使见过相似内容,生成质量也不等于直接复制,污染影响相对小。对于推理类任务(GSM8K 的数学推导),如果模型只记住了答案而没有理解推导过程,换一道类似的题就会露馅,所以推理任务的污染可以通过"追问推导过程"来部分检测。

面试时可以这样答

数据污染是 benchmark 评测里一个很实际的问题。LLM 训练数据来自互联网,而主流 benchmark 题目也在互联网上,爬取时就可能收进去,模型在评测集上表现好,是因为"背过答案"而不是真的会。

检测上主要有两类方法。N-gram 重叠检测是最常用的,对训练集建索引,查评测题有没有高重叠的文本,LLaMA、Mistral 技术报告里都有这个。Min-K% Prob 是基于模型行为的方法,不依赖原始训练数据,对见过的文本模型的最低置信度 token 也比没见过的更高,适合检测闭源模型。

规避上根本的思路是时间隔离——用训练截止日期之后的内容出题,LiveBench 就是这个做法,每月更新。训练时也可以主动过滤已知 benchmark,但防不了未来新出的。发布模型时诚实披露污染检测结果,是基本的技术诚信要求。

常见追问

  1. 如果无法获取训练数据(闭源模型),有什么方法检测污染?
  2. 污染检测里 N 的选取(N-gram 的 N)有什么权衡?
  3. "做了污染修正"之后的分数应该怎么计算?有没有标准方法?