60%的训练数据是垃圾
2026年Q1,我们从Common Crawl(互联网公开数据集)中提取了15TB的训练数据,准备用于训练一个中文大模型。
经过去重和清洗后,只剩下6TB——60%的数据被删除了。 删除的数据包括:重复内容(30%)、低质量内容(15%)、有毒内容(5%)、非目标语言(5%)、格式错误(5%)。
数据去重和清洗,是AI训练中最"无聊"但最"重要"的工作。 以下是完整的去重和清洗流程。
第一步:语言检测与过滤
目标: 只保留中文数据,删除其他语言。
方法: 使用fastText语言检测模型(预训练,支持176种语言),对每条数据进行语言检测。置信度>0.9的数据保留,置信度<0.9的数据删除。
效果: 15TB → 12TB(删除20%的非中文数据)。
坑: fastText对"中英混合"文本的检测不准确。我们额外用规则(中文字符占比>50%)过滤中英混合文本。
第二步:数据去重(Deduplication)
目标: 删除重复的、高度相似的数据。
方法:
- 精确去重(Exact Dedup): 删除完全相同的文本(MD5哈希匹配)。快速但粗糙。
- 模糊去重(Fuzzy Dedup): 删除高度相似的文本(MinHash + LSH)。慢但精确。
MinHash + LSH的工作原理:
- MinHash:将文本压缩成"指纹"(128维的哈希向量)
- LSH(Locality-Sensitive Hashing):将相似的"指纹"分到同一个桶里
- 同一个桶里的文本,被视为"相似文本",只保留一条
效果: 12TB → 8TB(删除33%的重复数据)。
参数: MinHash的相似度阈值设为0.8。阈值太低(0.5),会删除大量"不重复但相似"的数据;阈值太高(0.95),会保留大量"重复但轻微不同"的数据。
第三步:低质量数据过滤
目标: 删除"垃圾"数据——太短、太长、无意义、低信息量的数据。
方法:
- 长度过滤:删除<50字符或>100000字符的数据
- 困惑度过滤:用KenLM语言模型计算文本的困惑度(Perplexity),删除困惑度>1000的数据(无意义文本)
- 重复度过滤:删除词重复率>80%的数据(如"啊啊啊啊啊啊啊")
- 特殊字符过滤:删除特殊字符占比>50%的数据(如代码、乱码、HTML标签)
效果: 8TB → 6TB(删除25%的低质量数据)。
困惑度过滤是"神器"——它能识别出"看起来像人话,但实际上是乱码"的文本。 例如:“今天天气很好,我去超市买了苹果。但是,但是,但是,但是,但是…"——这种重复的文本,困惑度会很高。
第四步:PII(个人身份信息)脱敏
目标: 删除或脱敏个人身份信息。
方法: 用正则表达式 + Presidio(微软开源的PII检测工具)检测和脱敏:
- 手机号:
\d{11}→ 替换为[PHONE] - 身份证号:正则匹配 → 替换为
[ID] - 邮箱地址:
\S+@\S+→ 替换为[EMAIL] - IP地址:正则匹配 → 替换为
[IP]
效果: 检测到约0.5%的数据包含PII,全部脱敏处理。
坑: 正则表达式不能覆盖所有PII(如"我的手机号是一三八一二三四五六七八”)。需要Presidio这类AI检测工具作为补充。
第五步:有毒内容过滤
目标: 删除包含暴力、色情、仇恨言论、违法内容的数据。
方法: 用敏感词库 + 分类模型(BERT-based)检测有毒内容。
效果: 删除约2%的有毒数据。
坑: 敏感词库和分类模型可能"误杀"正常内容。需要人工审核"边界案例"(如医学文本中的"乳房"、法律文本中的"杀人")。
数据去重和清洗的"成本"
| 步骤 | 工具 | 处理速度 | 成本(15TB) |
|---|---|---|---|
| 语言检测 | fastText | 1GB/s | $50 |
| 精确去重 | MD5 Hash | 10GB/s | $10 |
| 模糊去重 | MinHash+LSH | 100MB/s | $500 |
| 质量过滤 | KenLM | 1GB/s | $50 |
| PII检测 | Presidio | 100MB/s | $500 |
| 有毒过滤 | BERT | 500MB/s | $200 |
| 总计 | $1,310 |
数据去重和清洗的总成本约$1,310(15TB数据)。 相比于GPU训练成本($10,000-$100,000),数据清洗的成本是"零头"。
结语:数据清洗是"必修课"
数据去重和清洗,不是"可选项",而是"必修课"。 60%的"垃圾数据"如果不清理,训练出来的模型会有严重的质量问题——重复输出、无意义输出、错误输出。
数据清洗的ROI是"无限大"的——花$1,310清洗数据,可能(通过提升模型质量)节省$10,000-$100,000的训练成本。 因为脏数据训练出来的模型,可能需要重新训练。
数据清洗的黄金法则:宁可"错杀"一些好数据,也不要"漏掉"任何脏数据。 因为一条脏数据可能污染整个模型的输出。
数据来源:作者团队数据去重与清洗实践(2026年Q1),Common Crawl数据集,MinHash论文(Broder, 1997),Presidio文档。