一个基准,只要你还在一份已经训练过的数据上用它,它就不再是基准。测试题一旦进入训练集——整段进入、被改写、或者以翻译版的形式——分数衡量的就从能力变成了记忆。
难受的地方在于,这是默认结果。测试集是公开的、被转载的、被镜像的;训练语料又从同一片公开文本里凑成。污染不是小心就能避开的意外,而是你必须主动对抗的基线。
污染很少以整份测试集的形式到来
没人会故意把基准粘进训练集。它是以博客里引用的一段、教程里的一道例题、论坛里有人把这道题完整做了一遍的形式进来的。
整文件比对全都查不到。能查到的是逐条重叠检查:用 n-gram 抓原文、用向量抓改写,再单独查一遍「答案本身」。
留出集要像一个产品那样设计
留出集值得和训练数据一样的设计投入:每道题测什么能力、难度多少、怎么判分、一个合理的模型应该错在哪里,都要写进规格。
用训练完之后剩下的东西凑出来的留出集,只能告诉你模型少背了多少残留。
先查重叠,增强之后再查一遍
数据增强是污染溜回来的地方。把训练集翻译一遍,里面夹带的基准也一起被翻译了;改写一遍,精确匹配就失效了。
重叠检查要跑在增强后的语料上,而不是原始版本上。同一个检查,查你真正拿去训练的那一版。
任务允许时,按时间切分
凡是自带时间顺序的——代码、新闻、商品数据——按时间切分是最强的保护。用某个日期之前存在的数据训练,用之后出现的数据评测,模型不可能见过未来。
时间切分做不到时,整个集合地留出,而不是随机抽行,并记录下留出了哪些。
交付前我们跑的清单
- 每道评测题都在段落层面查过与训练语料的重叠?
- 改写与翻译由单独的近似重复检查覆盖?
- 只查答案的检查也做了,不只查问题?
- 有一份从未公开过的私有留出集?
- 清单里写明的是切分规则,而不只是数量?
答不上这些,报出来的数字也是真的,只是它的含义不是你以为的那个。
从哪里开始
先决定哪些能力你不接受妥协,再围绕它们建留出集,然后才开始训练。语料总目录说明了各阶段评测材料如何与训练材料隔开;题库语料则专门处理「泄漏藏在题干里」这种情况。
这些留出集由 Zovda 通过 Datuva 建设,每一条评测样本都带着它被抽取的日期和所属语料。
告诉我们你要衡量什么、需要的量是多少,我们会在 1 个工作日内回复;范围确认后提供字段说明。
