去重
03 去重(综述 §2.3.2)
0 一图看懂去重在管道里的位置
原始网页语料
↓
【1 精确去重】MD5 / Suffix Array(50 token) ← 便宜,先跑,抓逐字重复
↓
【2 近似去重】MinHashLSH / SimHash / LSH Bloom ← 主力,抓"差几个词"的近重复
↓
【3 语义去重】SemDeDup(编码器+聚类) ← 贵,只对幸存者做,抓"换说法"
↓
┌─ 路线A:完全删除(留一条)→ 直接进 [[04 过滤]]
└─ 路线B:降权重重采样(SoftDeDup,不删)→ 按权重进训练管道1 为什么必须去重
原始语料的冗余从两个方向伤害模型(综述引用 [299][169][422]):
- 降低泛化能力:重复样本让模型对「见过的」内容过度自信,对新的、罕见任务反而学不好;
- 记忆与过拟合:模型会把重复子集背下来——这直接连接到评测集污染(训练集里出现 benchmark 原题)和隐私泄漏(重复 200 次以上的样本可以被逐字提取出来)。
去重要解的两个核心难题(综述原文):
- 怎么编码:把非结构化文本变成能精确且高效比较的表示;
- 怎么扩展:方法在万亿 token 规模下还得跑得动。
2 两种处理策略(发现重复之后怎么办)
「检测」和「处置」是正交的两件事——检测负责找到重复,处置决定找到之后怎么办:
检测到重复样本
├─ 策略A:完全删除 ── 重复组里只留一条(或全删)
│ 代表:GPT-3(MD5)、Gao 2020(Suffix Array)、MinHash系、SemDeDup系
│ 取舍:干净彻底,但丢掉"这个内容重要/常见"的信号
└─ 策略B:降权重 + 重采样 ── 不删,按重复程度降采样概率
代表:SoftDeDup [167]
取舍:信息无损;但权重是近似估算,且下游必须有重采样框架| 策略 | 做法 | 代表 | 取舍 |
|---|---|---|---|
| ① 完全删除 | 重复组里只留一条(或全删),其余移除出训练集 | GPT-3(MD5)、Gao 2020(Suffix Array)、MinHash 系、SemDeDup 系 | 干净彻底,但可能丢信息——重复本身携带的「这个内容重要/常见」信号没了 |
| ② 降权重(down-weighing)+ 重采样 | 不删,按重复程度降低采样概率,重复的少被抽到、不重复的多被抽到 | SoftDeDup [167] | 保留全部信息;权重估算本身就是近似,且需要重采样框架配合 |
综述把检测手段分成四大类(见下节),任一检测方法原则上都可以配任一处置策略。
3 四大检测方法族详解
3.1 精确子字符串匹配(Exact Substring Matching)
定位:第一道工序,只能抓逐字一致的重复。重复来源两种:一条样本引用了另一条(如互相关联的报告)、两个数据集意外收录同一内容(热门网页最典型)。
MD5 哈希 [122](GPT-3 论文,样本级)
一句话:给每条样本算 MD5,哈希撞上即判重复——抓复制粘贴级重复的最便宜手段。
- 每条样本算一个 MD5,哈希相同即判重删除;
- 整条哈希意味着改一个标点就漏检——只适合抓复制粘贴级重复;
- 实现最简单,成本最低,几乎所有管道都有这一步。
Suffix Array(后缀数组)[299](Gao et al. 2020《Deduplicating Training Data Makes LMs Better》,句子级)
一句话:把全语料拼成一个超长字符串建后缀数组,利用「相同子串在排序后必然相邻」的性质线性时间抓出所有 ≥50 token 的重复子串。
- 原理:后缀数组存的是「所有后缀按字典序排序后的起始下标」。
- 例子:字符串 “patata” 的后缀按字典序排是
a(5),ata(3),atata(1),patata(0),ta(4),tata(2),后缀数组就是 (5,3,1,0,4,2)。 - 为什么有用:完全相同的子串在后缀数组里必然相邻(同前缀 → 字典序挨着),所以扫描相邻项就能线性时间找出所有重复子串,不用两两比较。
- 关键参数:50 token 阈值——只有公共前缀超过 50 token 才判为重复。经验值,用来压误报(短的公共前缀大多是正常语言现象,如固定搭配、常见句式)。
3.2 近似哈希(Approximate Hashing-based Deduplication)
定位:主工序,抓近重复——只差几个词的样本(典型:同一模板生成的广告、转载时改了标题的新闻)。与 MD5 的本质区别:MD5 改一位结果天差地别(雪崩效应),近似哈希输入微变、输出微变。
MinHash [81]
一句话:用一组哈希函数把样本压成短签名,签名重放估计两样本的 Jaccard 相似度——近重复检测的经典地基。
- 机制:一组哈希函数分别对样本的元素集合求值,每个函数只保留最小值,拼成签名;两样本的 Jaccard 相似度 = |X∩Y|/|X∪Y|(如 X={a,b,c,d}, Y={b,c,d,e,f},Jaccard=1/2)用签名重放估计。
- 实测 [356]:MinHash 优于 SimHash。
- 实战:GPT-3 把 MinHash 用在代码数据上(样本级 + 仓库级两层)保多样性和完整性;Gao 2020 在样本级也叠加了 MinHash。
- 弱点(综述明确指出):要为海量样本构建巨大向量集,样本数和长度一大,建集合的时间和空间开销爆炸;且每个样本的特征向量计算依赖共享词表,难以完全并行化。
MinHashLSH [347][358](MinHash 加速)
一句话:把 MinHash 签名切成多个 band,先粗筛「band 相同」的对再细比——避免 N² 全量两两比对。
LSH Bloom [207](再加速)
一句话:把每个 band 的哈希值塞进 Bloom Filter,碰撞即判重——用空间换查找时间,误报率可压到 1e-5。
SimHash [88]
一句话:把整条样本压成单个 d 维 0/1 指纹,用汉明距离判相似——存储最省,但分辨率也最低。
- 机制(四步):① 每个 token(如经 BPE 分词)哈希成 d 维 {0,1} 向量;② 按预定义权重 w 加权,1 为正、0 为负(如 [1,0,0,1]×w₁ → [w₁,−w₁,−w₁,w₁]);③ 所有 token 的加权向量逐维累加成一个 d 维向量;④ 正值置 1、否则置 0,得到最终指纹。
- 相似度:两指纹的汉明距离。
- 优点:每样本只存一个签名,存储和计算远低于 MinHash 的多签名。
- 弱点:单签名分辨率低——汉明距离小的两个样本难以可靠区分,需要仔细设计特征。
DotHash [298]
一句话:利用高维向量准正交性质,一次点积直接读出两样本的交集大小——省掉 MinHash 的多轮哈希。
- 机制:利用高维空间中均匀采样的向量准正交这一性质。把样本编码为「元素基向量 ψ(a) 的组合」,两个样本的点积 E[a·b] = |A∩B| 是交集大小的无偏估计。
- 失效条件 [121]:基向量长度 < 基向量个数时,准正交假设不成立,估计崩坏。用之前先检查这个条件。
3.3 频率降权(Approximate Frequency-based Down-Weighting)→ SoftDeDup [167]
一句话:不删数据,按「样本在全语料里有多常见」降低它的采样权重——策略②的唯一直接实现。
- 动机:留一删余会丢掉「重复」携带的信息(这个内容很常见这件事本身有价值);
- 机制:统计每个 n-gram 在全语料中的频率;一条样本的 commonness = 它包含的所有 n-gram 频率的乘积;
- 处置:commonness 越高 → 越可能是重复 → 采样权重越低,在重采样时被抽到的概率变小而不是被删除;
- 适用场景:下游有按权重采样的训练管道时;没有重采样框架就得自己加。
3.4 语义聚类(Embedding-Based Clustering)→ SemDeDup 系
一句话:把样本编码成 embedding 后在簇内按余弦相似度判重,抓「同一意思、不同说法」的重复——字面哈希完全无能为力的类型。
综述举的例子:两条完全不同的运动鞋广告文案(“Unleash your potential with our lightweight, high-performance sports shoes…” vs “Step into greatness with durable, breathable sports shoes…”),语义等价但字面不同,会让数据分布失衡、引入偏见。
SemDeDup [46] 流程(四步):
全部样本
↓ ① 编码:文本过 OPT 编码器 / 图像过 CLIP 编码器
embedding 向量
↓ ② 聚类:K-means 分簇(只在簇内找重复,不用全空间两两比)
↓ ③ 判重:簇内余弦相似度 > 阈值 的对 = 语义重复
↓ ④ 保留:每组重复里只留离簇质心最近的那条(最典型的)- 天然多模态:换编码器就能去重图像数据。
- 实战:LAION-400M 图文对数据集的去重就用了它 [45]。
变体:
- SSL Prototypes [385]:结合自监督原型度量,按样本到簇质心的距离决定去留,越近的越可能被删;
- FairDeDup [360]:改写保留逻辑做公平性——不再机械选离质心最近的,而是优先保留能代表少数/弱势群体(用户给定的敏感概念原型,如人口学子群)的样本,防止语义去重把边缘群体内容系统性剪掉。
3.5 非文本数据的去重(图像/多模态)
- 图像 SemDeDup:图像过 CNN 类编码器得 embedding,余弦相似度超阈值即判重,阈值要调来平衡查准/查全;
- MINT-1T:用 SHA256 校验和做精确去重,高效删除完全重复;
- DataComp 管道 [146]:用 CNN 近重复检测器 [445] 消除细微重复,主要动机是防评测集泄漏——去重后的图像集训练出的模型比 CLIP baseline 查准/查全更高。
4 四类方法怎么选(管道视角)
| 维度 | 精确匹配 | 近似哈希 | 频率降权 | 语义聚类 |
|---|---|---|---|---|
| 抓什么 | 逐字一致 | 差几个词的近重复 | 高频内容(不删) | 改写/换说法 |
| 成本 | 最低 | 中(向量集大、难并行) | 低 | 高(要过编码器+聚类) |
| 信息损失 | 有(删掉的重复也带信号) | 有 | 无 | 有 |
| 典型位置 | 第一道工序 | 主工序 | 可选替代 | 后段精细工序 |
| 失效/注意 | 改一个字就漏 | SimHash 分辨率低;DotHash 基向量条件 | 需重采样框架 | 阈值敏感;公平性问题(FairDeDup 在解) |
贵的操作放后面:精确匹配便宜先跑,近似哈希做主力,语义去重只对幸存者做(呼应 08 端到端管道 里 DCLM 的「模型打分只对去重后剩的 1.4% 做」)。
5 管道设计含义(大规模实操)
- FineWeb 实测:按 snapshot 分片各自 MinHash ≈ 全局去重效果,全局归并几乎没有额外收益 → 可以省掉全量去重的成本;
- RefinedWeb 的做法:Common Crawl 切 100 段逐段去重 + URL 级跨段去重兜底;
- 50 token(Suffix Array)/ 1e-5(LSH Bloom)/ 余弦阈值(SemDeDup)——每个方法都有一个必须拍板的超参,综述给的是文献里的默认值,自己管道上要重新调。
6 相关链接
- 单篇论文:Gao 2020《Deduplicating Training Data Makes LMs Better》、SemDeDup、SoftDeDup、DotHash(见
文献/大模型数据/) - 综述中位置:00 总览-LLM×DATA综述资料库 §2.3.2;下游工序见 04 过滤(去重完的池子才轮到过滤)
