大模型预训练为什么要做数据去重?
简化版
预训练去重用于避免重复网页和模板过度占权,减少记忆、隐私泄露与评测污染,同时让固定 Token 预算覆盖更多知识。通常分精确去重、近似文档去重和局部片段去重:用内容哈希抓完全相同样本,用 n-gram MinHash/LSH 找改标题或轻微编辑的副本,并在训练集与评测集之间做最长公共片段或 n-gram 污染检查。
详细版
重复会改变训练分布:同一文档出现 100 次,相当于被隐式加权 100 倍,模型更可能背诵其中的姓名、代码或答案。仅按 URL 去重不够,因为镜像站、参数 URL、转载和模板页面的地址不同。工程流程一般先规范化编码、空白和样板内容,再做 SHA-256 精确哈希;随后构造 5-gram/13-gram shingles,用 MinHash 估计 Jaccard,相似度过阈值后按质量、时间与来源选代表文档。
去重过强也会伤害数据:许可证文本、常见代码框架和多语言翻译可能天然相似,短文档的 Jaccard 又不稳定。因此要按领域、长度与语言设阈值,区分“删副本”和“降低采样权重”,保留簇 ID 以便审计,并用保留率、有效 Token、下游能力、记忆率与污染命中率共同验收。
原始语料 -> 规范化 -> 精确哈希 -> 近似候选召回 -> 相似度复核 -> 聚簇/选代表 -> 污染隔离
完整版教学
一、重复为什么不是单纯浪费存储
训练按样本出现频率优化,同一内容重复就等于提高其损失权重。一个教程被 50 个镜像站转载,会压过只出现一次但同样重要的长尾知识。固定训练 Token 下,重复还挤占了本可用于覆盖新概念的预算。
重复数据更容易被逐字记忆,包含邮箱、密钥或受版权保护段落时会放大泄露风险。评测题若混入训练集,模型可凭记忆得到虚高分。因此去重同时服务效率、泛化、安全和评测可信度。
二、精确去重从规范化开始
字节哈希只能发现完全一致文件。网页可能只差换行、导航栏或跟踪参数,若直接哈希会被当作不同内容。常见规范化包括 Unicode 统一、换行与空白归一、去 HTML 样板、排序稳定元数据,但不能随意小写或删除标点,因为代码与自然语言含义可能改变。
canonical = normalize_unicode(strip_boilerplate(document))
fingerprint = SHA256(canonical)
哈希相同即可聚为一簇,并按来源可信度、文本完整度和时间选代表。密码学哈希碰撞可忽略,但应保存内容长度和版本以便审计;URL 只能作为元数据,不能作为内容唯一键。
三、MinHash 如何找近似副本
把文档切成连续 k-gram 集合,Jaccard 相似度为交集大小除以并集大小。直接两两比较 N 篇文档需要 O(N²),不可扩展。MinHash 用多个随机哈希的最小值组成签名,其相等比例近似 Jaccard;LSH 再把可能相似的签名放进同一桶,只复核候选对。
若文档 A 有 1000 个 shingles,B 与它共享 900 个且各自新增/缺失后并集为 1100,则 J=900/1100≈0.818。阈值设 0.8 时会聚为一簇。签名越长估计越稳定,但计算和存储也越高。
记忆钩子:MinHash 负责把“集合有多像”压成短签名,LSH 负责从海量文档中先找“可能很像”的候选;二者角色不要混淆。
四、文档去重与片段去重不同
两篇长网页可能整体不同,却共享一段评测答案、免责声明或代码。文档级 Jaccard 会被大量不同正文稀释,抓不到局部复制。片段去重可对固定长度窗口、段落或 suffix array/哈希索引检测长公共子串,尤其适合训练—评测污染分析。
| 粒度 | 能发现 | 主要风险 |
|---|---|---|
| 文件哈希 | 完全副本 | 漏掉轻微编辑 |
| 文档 MinHash | 转载、镜像 | 长文局部复制漏检 |
| 段落/窗口 | 模板与答案片段 | 常见短语误杀 |
| 训练—评测匹配 | Benchmark 污染 | 需保护评测内容 |
模板片段可选择剥离或降权,而不必删除整篇包含独特正文的文档。保留去重原因能在误杀时重建数据。
五、怎样选择阈值与代表样本
阈值不是越低越严格越好。短文本共享几个 n-gram 就可能得到高相似,多语言翻译在字符层相似低却语义重复,代码的 import 与模板天然重复。应按语言、内容类型和长度分桶,对候选对人工标注后画 Precision-Recall 曲线。
聚簇后不是随机留一篇。可优先保留来源许可清晰、正文完整、质量分高、时间较新且元数据丰富的版本。若重复频率本身携带真实分布信息,可把簇大小转成受控采样权重,而非完全抹掉。
六、分布式去重的工程问题
万亿 Token 语料不能单机处理。精确哈希可按 fingerprint 分区;MinHash 签名按 LSH bucket shuffle,但热门模板会形成超大桶和数据倾斜。可先剥离高频 boilerplate、限制桶大小,并对异常桶采用二级分片。
数据增量更新时,要把新语料同时与历史保留集比较,而不只是新批次内部去重。簇 ID 和代表选择应尽量稳定,否则每次构建会大面积变动,难以复现实验。版本清单应记录算法、参数、代码 commit 和输入快照。
七、如何证明去重有效
首先报告原始/保留文档数、Token 保留率、重复簇大小分布和各来源损失比例。然后在相同训练 Token 与算力下做对照,比较验证 loss、知识覆盖、长尾领域能力和逐字记忆率。污染检查要单列与各 benchmark 的匹配样本,并隔离后重新评测。
例如 10 亿文档去重后保留 7 亿,但 Token 保留 82%,说明被删样本偏短;某低资源语言却只保留 45%,可能是规范化或阈值误杀。总体数字正常不代表分布安全,语言、域名和内容类型切片是验收必要部分。
八、常见误区与追问
- 误区:按 URL 去重就够了。 镜像、转载和参数 URL 会让相同内容拥有不同地址。
- 误区:相似度阈值越低,数据越干净。 过强去重会删除合法共识、模板代码和低资源语料。
- 误区:去重只需在每个数据源内部做。 跨站点和跨数据批次重复往往更严重。
- 追问:为什么用 shingles 而不是词袋? 连续 n-gram 保留局部顺序,更容易识别复制和轻微编辑。
- 追问:MinHash 会直接决定删除吗? 它通常只召回候选,还需精确相似度、规则或质量排序复核。
- 追问:如何测记忆风险? 用前缀诱导、canary、最长逐字匹配和成员推断等方法对照去重前后。
九、加强记忆
预训练去重可记成“规、精、近、片、验”:先规范化内容,精确哈希删完全副本,MinHash/LSH 找近似转载,片段匹配抓局部复制和评测污染,最后按语言与领域验证分布和能力。去重不是把相似内容全删掉,而是纠正无意重复权重,同时保住真实多样性与可追溯性。