观文听傑

返回

上一篇把 token id 映射为 Embedding,并让 LM Head 把隐藏状态投回词表。模型闭环已经完整,但它会忠实放大数据分布:同一篇公告被镜像 100 次,就相当于在损失中给它 100 倍权重;测试题若混进训练集,漂亮分数也不再表示泛化。

数据去重(Data Deduplication)不是“删掉看起来相似的文本”这么简单。本文只讲透三个紧密环节:用内容哈希删除精确重复、用分片 Jaccard 与 MinHash 发现近重复,以及在切分之前建立不可泄漏、可复现的删除规则。

01 重复数据怎样改变训练目标?#

设文档 did_iTiT_i 个可预测 token,逐 token 平均损失为 ˉi\bar\ell_i

L=iTiˉiiTi\mathcal L=\frac{\sum_i T_i\bar\ell_i}{\sum_iT_i}

d1d_1 被复制 kk 次,它的权重从 T1T_1 变成 kT1kT_1。重复不是只浪费磁盘,而是在未声明的情况下重写采样分布,并增加逐字记忆、隐私暴露与训练—评测污染(Train–Evaluation Contamination)的风险。

02 去重流水线放在哪里?#

flowchart LR
  A[原始文档 + source/id] --> B[解析正文]
  B --> C[仅供匹配的规范化副本]
  C --> D[内容哈希:精确桶]
  D --> E[shingle 集合]
  E --> F[MinHash + LSH 候选]
  F --> G[真实 Jaccard 复核]
  G --> H[重复图/连通分量]
  H --> I[确定性保留代表]
  I --> J[训练/验证/测试切分]
  J --> K[tokenize 与混合采样]
mermaid

原文与匹配副本必须分开保存。去重规范化可以折叠空白、统一换行,却不应悄悄改写最终训练文本。每步输出原因码,例如 exact_hashnear_duplicateeval_overlap,否则删错后无法追踪。

03 精确重复:关键是哈希什么#

对规范化字节串 bib_i 计算摘要 hi=H(bi)h_i=H(b_i)。相同摘要先进入同一桶,再比较字节确认;这样即使理论上发生哈希碰撞,也不会误删。

输入是 Unicode 文本,输出是布尔值;生产系统还应输出匹配文档 id。不要用 Python 的 hash():它不是跨进程稳定的内容指纹。

04 为什么精确哈希抓不到网页近重复?#

页眉、日期或一句免责声明不同,整篇摘要就完全不同。把文档切成长度为 kk 的连续 token shingle(词片):

S(d)={(xj,,xj+k1)0jLk}S(d)=\{(x_j,\ldots,x_{j+k-1})\mid 0\le j\le L-k\}

两个集合的 Jaccard 相似度为:

J(A,B)=ABABJ(A,B)=\frac{|A\cap B|}{|A\cup B|}

A={ab,bc,cd}A=\{ab,bc,cd\}B={ab,bc,ce}B=\{ab,bc,ce\},交集有 2 个、并集有 4 个,所以 J=2/4=0.5J=2/4=0.5。集合忽略重复次数;若频次本身重要,应使用加权 Jaccard。

05 MinHash 为什么能用短签名估计 Jaccard?#

对集合元素使用随机排列 πr\pi_r,第 rr 个签名值是:

mr(S)=minxSπr(x)m_r(S)=\min_{x\in S}\pi_r(x)

关键性质是 Pr[mr(A)=mr(B)]=J(A,B)\Pr[m_r(A)=m_r(B)]=J(A,B)。若用 R=4R=4 个排列,两个签名有 3 位相同,则估计 J^=3/4=0.75\hat J=3/4=0.75。标准误差约为 J(1J)/R\sqrt{J(1-J)/R},增加 RR 才会稳定。

seeds、分词器、kk 和规范化版本必须固定。空文档要提前过滤,否则 min() 没有定义。

06 LSH 怎样避免所有文档两两比较?#

MM 篇文档全比较需要 O(M2)O(M^2) 对。局部敏感哈希(Locality-Sensitive Hashing,LSH)把 R=brR=br 个签名切成 bb 个 band,每 band 含 rr 行;任一 band 完全相同才成为候选。

P(candidateJ)=1(1Jr)bP(\text{candidate}\mid J)=1-(1-J^r)^b

例如 b=4,r=2,J=0.8b=4,r=2,J=0.8,候选概率约 0.9830.983;当 J=0.2J=0.2 时约 0.1510.151。LSH 只负责召回候选,最终仍应用真实 shingle 集合计算 Jaccard。

signature [R=8]
 ├─ band0 [2] ─┐
 ├─ band1 [2] ─┼─ 同桶文档对 ─► 真实 Jaccard ─► 重复边
 ├─ band2 [2] ─┤
 └─ band3 [2] ─┘
text

07 重复关系为什么要建图?#

相似关系不一定传递:J(A,B)J(A,B)J(B,C)J(B,C) 都过阈值,不代表 J(A,C)J(A,C) 也过阈值。常见工程做法把文档视为节点、过阈值候选视为边,再用并查集求连通分量。

每个分量只保留一个代表时,规则必须确定:依次比较质量分、正文长度、来源优先级、抓取时间和稳定 id。不要“谁先被 worker 扫到就保留谁”,否则并行度改变数据集。

08 切分与评测污染应怎样处理?#

最安全的顺序是把训练、验证、测试候选放进同一近重复图,再按优先级保留:

  1. 基准测试与人工保留集拥有最高保护优先级;
  2. 与评测集近重复的训练样本删除,而不是反过来;
  3. 同一重复簇不可跨 split;
  4. 最终只在训练 split 上拟合 tokenizer 或其他数据统计量。

若合规要求不允许跨集合读取正文,可交换不可逆指纹或 shingle 哈希,并记录覆盖率局限。

09 参数怎样选,不能只看一个阈值#

参数过小过大应看什么
shingle 长度 kk常用短语误报局部改写漏报文档类型分层标注
签名数 RR估计方差大内存与计算增加候选召回稳定性
Jaccard 阈值 τ\tau误删同主题文章漏掉模板变体人工 precision/recall
最短正文菜单模板主导丢失短问答长度分桶审计

在已标注文档对上画 precision–recall,而不是从论文复制一个 τ\tau。代码、中文短文本与英文长网页通常需要不同参数。

10 分布式实现的数据契约#

输入: {doc_id, source, raw_text, crawl_time}
中间: {doc_id, norm_version, exact_key, minhash[R], quality}
删除: {removed_id, kept_id, reason, score, pipeline_version}
输出: {doc_id, source, raw_text}
text

先按 exact key 分区,再按 LSH band key shuffle 候选。候选对要排序去重;并查集结果按稳定 id 归并。保存各阶段计数、每来源删除率及阈值附近样本,才能发现某种语言被过度删除。

11 最短验证与调试路径#

  1. 用 golden pairs 覆盖完全相同、空白变化、页眉变化、同主题不同事实和代码重命名;
  2. 打印规范化文本、shingle 交并集、MinHash 估计和最终原因码;
  3. 在 1%、10%、100% 数据上检查删除率是否突变;
  4. 比较单进程与多 worker 的保留 id 集合;
  5. 扫描训练集与评测集 overlap,并人工复核高分对。
症状常见原因最短检查
每次保留样本不同seed 或代表规则不稳定固定 seed,按 id 排序
中文几乎全被判重复shingle 太短查看真实交集片段
内存爆炸热门 LSH 桶形成笛卡尔积限制模板桶并分层处理
评测异常升高先切分后仅在 split 内去重做跨 split overlap
去重后小语种骤减来源本就高度镜像按来源统计并重配权重

12 失败场景与相近方法#

MinHash 适合集合重叠,不理解语义改写;事实相同但措辞不同可能漏掉,模板相同但事实字段不同又可能误报。Embedding 相似度更擅长语义,却更昂贵且容易把同主题合法样本混为重复。后缀数组适合长公共子串;SimHash 更接近余弦式指纹;图像、音频需要模态专用感知哈希。

去重也不能修复错误事实、隐私、许可问题和来源偏差。它只是数据治理的一层,不是质量过滤的代名词。

13 今天真正需要记住什么?#

  1. 重复文档等于隐式提高其 token 权重,会影响泛化、记忆和评测可信度。
  2. 精确哈希解决字节级重复;shingle Jaccard 定义近重复;MinHash+LSH 只加速候选召回。
  3. 评测集应受保护,跨 split 重复必须在切分前解决。
  4. 规范化、seed、代表选择与删除日志都是可复现训练数据的一部分。

14 思考题与小练习#

  1. 对集合 {a,b,c,d}\{a,b,c,d\}{b,c,d,e,f}\{b,c,d,e,f\} 手算 Jaccard;若 8 位 MinHash 有 5 位相同,比较估计误差。
  2. 固定 b=20,r=5b=20,r=5,计算 J=0.5,0.8,0.95J=0.5,0.8,0.95 的候选概率,并解释 S 曲线如何影响召回。
  3. 为新闻、GitHub 代码和论坛短帖各设计一条代表保留规则,说明可能引入的偏差。

相关工作#

  1. Broder, On the Resemblance and Containment of Documents,提出用 MinHash 估计文档集合相似度。
  2. Lee et al., Deduplicating Training Data Makes Language Models Better,系统研究语言模型训练语料去重。
  3. Kandpal et al., Deduplicating Training Data Mitigates Privacy Risks in Language Models,分析重复、记忆与隐私风险。
  4. Dodge et al., Documenting Large Webtext Corpora,审计大型网页语料与下游基准重叠。

15 下一篇预告#

去重后,每份来源终于不再因镜像数量获得隐式权重;但高质量小语种、代码和网页正文仍相差几个数量级。下一篇将把“数据源比例”写成明确的按 token 采样分布,并讨论温度平滑、预算与可复现批次。

十亿段语料怎样避免反复背诵?精确去重、MinHash 与评测污染
https://zwjcode.cn/blog/pretraining-data-exact-near-dedup-minhash
作者
发布于 2026年9月11日
版权协议 CC BY-NC-SA 4.0
评论加载似乎遇到了问题,请尝试刷新页面。