预训练数据处理¶
面试高频考点¶
- 预训练数据如何清洗?去重用什么方法?
- 数据配比(Data Mixture)如何影响模型能力?
- Common Crawl 的数据质量问题怎么处理?
- 为什么说"数据比模型更重要"?
- 数据治理链路里最容易踩坑的环节是什么?
- 文档级去重和 token 级去重分别解决什么问题?
数据来源与规模¶
细化理解: 预训练数据不是越多越好,而是要兼顾规模、质量、覆盖面和风险。网页数据带来广覆盖,代码数据增强程序能力,论文和书籍提升长文本与专业表达,合成数据可以补任务格式但容易放大模型偏差。数据配比会直接影响模型能力画像,因此现代训练通常会做多轮数据 ablation。
主流预训练数据集的构成(以 LLaMA 3 为例,15T tokens):
| 数据来源 | 占比 | 特点 |
|---|---|---|
| Web 网页(Common Crawl) | ~80% | 规模最大,质量参差不齐 |
| 代码(GitHub) | ~8% | 高质量,提升推理能力 |
| 书籍(Books) | ~5% | 长文本,提升连贯性 |
| 学术论文(ArXiv 等) | ~3% | 专业知识 |
| 维基百科 | ~2% | 高质量百科知识 |
| 其他(对话、新闻等) | ~2% | 多样性 |
flowchart LR
A["原始多源语料<br/>网页/代码/书籍/论文/百科"] --> B["解析与标准化"]
B --> C["质量过滤"]
C --> D["去重"]
D --> E["安全与隐私过滤"]
E --> F["配比采样"]
F --> G["Tokenizer 统计与抽样验收"]
G --> H["进入预训练语料池"]
真正的大头工作不是"找到数据",而是把数据从"能抓到"变成"能放心训练"。
数据清洗流程¶
1. 语言过滤¶
用 fastText 等语言识别模型过滤非目标语言内容。
工程上通常还要补两层:
- 编码修复:修复乱码、非法 UTF-8、HTML 转义残留。
- 文档边界校正:很多网页抽取后会把导航栏、页脚、评论区、正文混在一起,需要做模板剥离。
2. 质量过滤¶
- 启发式规则:过滤过短/过长文本、特殊字符比例过高、重复 n-gram 比例过高的文档
- 质量分类器:训练一个分类器区分高质量(维基百科级别)和低质量文本
- 困惑度过滤:用小型语言模型计算困惑度,过滤难以理解的文本
可以把它理解成三层筛子:
| 层级 | 作用 | 优点 | 缺点 |
|---|---|---|---|
| 规则过滤 | 快速剔除脏数据 | 便宜、稳定 | 覆盖面有限 |
| 分类器过滤 | 学习高低质量边界 | 更灵活 | 依赖标注样本 |
| LM 打分 | 从语言流畅性和自然性角度判断 | 效果强 | 成本高 |
很多工业系统会先用规则过滤掉 80% 明显垃圾,再对候选集跑质量分类器,而不是把所有文档都扔给语言模型。
3. 去重(Deduplication)¶
细化理解: 去重既节省算力,也降低模型记忆和评测污染。文档级去重能清掉完全重复网页,片段级或 MinHash 去重能处理转载、模板页和轻微改写。去重过强也会误伤合法重复模式,例如 API 文档、代码模板和法律条文,所以工程上要结合抽样审查。
去重是预训练数据处理最关键的步骤之一,重复数据会导致模型记忆而非泛化。
精确去重:URL 去重、MD5 哈希匹配(完全相同的文档)
模糊去重(MinHash LSH): 1. 对每个文档计算 MinHash 签名(用多个哈希函数) 2. 通过 LSH(局部敏感哈希)找到签名相似的文档对 3. 去除 Jaccard 相似度超过阈值(如 0.8)的重复文档
n-gram 去重:在 token 级别检测重复片段(suffix array 方法,LLaMA 使用)
去重效果:FineWeb 数据集通过去重将 Common Crawl 从 90T tokens 压缩到 15T tokens,同时质量显著提升。
文档级去重 vs 片段级去重¶
| 维度 | 文档级去重 | 片段级去重 |
|---|---|---|
| 目标 | 删除整篇重复网页/文档 | 删除大规模重复段落、模板内容 |
| 方法 | URL、MD5、MinHash | n-gram、suffix array、shingling |
| 适合问题 | 镜像站、转载站、整页拷贝 | 页脚模板、重复免责声明、批量洗稿 |
两者都要做。只做文档级去重,会留下大量"不完全相同但高度重复"的内容;只做片段级去重,又会保留整页镜像垃圾。
4. 毒性与安全过滤¶
- 过滤色情、暴力、仇恨言论等有害内容
- 过滤包含个人隐私信息(PII)的文本(邮箱、电话、身份证号)
这一层的目标不是把世界上所有负面内容删干净,而是控制数据分布,避免模型在普通交互中异常容易生成有害模式。对于医疗、法律、金融等高风险场景,还会额外加领域敏感过滤规则。
数据配比策略(Data Mixture)¶
不同领域数据的比例对模型能力影响显著:
代码数据的重要性:研究发现增加代码比例可以提升模型的推理能力(即使是非代码任务)。LLaMA 3 代码数据占比远高于 LLaMA 2。
多轮动态配比(DoReMi、Data Mixing Laws): - 不同训练阶段使用不同配比(前期偏重多样性,后期偏重高质量) - 可通过小模型实验确定最优配比后再大规模训练
为什么配比比直觉更重要¶
模型不是平均地吸收所有数据,而是会被高频模式塑形:
- 代码比例高,通常会提升结构化推理、符号操作和工具使用倾向。
- 高质量长文本比例高,通常会提升连贯性和长程依赖建模。
- 社交媒体和低质量网页比例过高,容易把口语噪声、模板废话、错误事实也学进去。
所以"加更多数据"只有在新增数据质量和分布合理时才成立。
一个常见的数据混合策略¶
- 先按来源切桶:网页、代码、论文、书籍、百科、对话。
- 每桶内先做质量分层:高、中、低。
- 小模型预实验,比较不同 mixture 对下游验证集的影响。
- 大模型正式训练时分阶段调整采样权重,而不是全程固定。
SFT 数据格式规范¶
有监督微调数据通常用对话格式:
{
"messages": [
{"role": "system", "content": "你是一个有帮助的助手"},
{"role": "user", "content": "什么是梯度消失?"},
{"role": "assistant", "content": "梯度消失是指..."}
]
}
要注意,SFT 数据虽然不属于预训练数据,但它跟预训练数据治理是一脉相承的:格式统一、角色定义清晰、去重和泄漏控制同样重要。
偏好数据格式(DPO/RLHF):
{
"prompt": "请解释量子纠缠",
"chosen": "量子纠缠是一种...",
"rejected": "量子纠缠就是..."
}
重要数据集¶
| 数据集 | 规模 | 特点 |
|---|---|---|
| Common Crawl | PB 级 | 最大网页语料,需大量清洗 |
| FineWeb | 15T tokens | HuggingFace 清洗版 CC,质量高 |
| RedPajama | 1.2T tokens | LLaMA 开源复现数据集 |
| Dolma | 3T tokens | AI2 开源,含详细数据卡片 |
| The Pile | 825GB | 22 种来源,学术界常用 |
| StarCoder | 300B tokens | 代码数据,多语言 |
工程实践视角¶
真实数据管线长什么样¶
flowchart TD
A["抓取/导入"] --> B["HTML/Markdown/PDF 解析"]
B --> C["正文提取与模板剥离"]
C --> D["语言识别与质量过滤"]
D --> E["文档级去重"]
E --> F["片段级去重"]
F --> G["PII/毒性过滤"]
G --> H["抽样人工验收"]
H --> I["训练集分桶与配比"]
三个最常见的工程坑¶
-
只看自动指标,不做人抽样
过滤器分数再漂亮,也可能留下导航栏、广告文案、乱码和半截正文。 -
数据切分在去重之前做
这样会让原本重复的整篇文档被切成不同 chunk,重复更难发现。 -
训练集和评测集隔离不严格
一旦泄漏,loss 和 benchmark 分数都会虚高,后面很难判断真实收益。
一个实用的质量验收清单¶
- 随机抽 100 篇文档,人工看正文占比是否够高。
- 统计不同来源的 token 占比,检查是否偏桶。
- 用 n-gram overlap 或 MinHash 对验证集做泄漏扫描。
- 检查 PII 召回率,至少覆盖邮箱、手机号、身份证、地址等模式。
面试延伸¶
Q:为什么说"数据比模型架构更重要"?
Chinchilla Scaling Law 表明,对于给定的计算预算,增加数据量比增加模型参数量更有效。LLaMA 用较小的模型(7B)训练更多 token(1T+),效果优于同期更大的模型。
Q:MinHash 去重的时间复杂度是多少?
MinHash 签名计算是 O(d×k)(d 为文档长度,k 为哈希函数数量)。LSH 的查找接近 O(1)。整体可以高效处理万亿级 token 的数据集。
Q:预训练数据中的重复对模型有什么影响?
重复数据会导致模型过度记忆(memorization)而非泛化,增加训练 loss 对重复内容的权重,降低模型的多样性和创造力,还可能导致版权风险。
Q:为什么 Common Crawl 不能直接拿来训?
因为它本质上是原始网页快照,包含大量模板页、SEO 垃圾、导航栏、版权声明、乱码、低质量转载和重复站点。直接训练会让模型把这些噪声也当成语言分布的一部分,浪费算力并污染输出风格。
Q:数据处理里最值钱的能力是什么?
不是会不会写爬虫,而是能不能建立一套稳定的数据治理闭环:知道什么是高质量、怎样度量、怎样抽样复核、怎样避免训练和评测污染。这决定了你能否持续迭代,而不是一次性清洗完就结束。
常见误区¶
误区 1:数据越多越好¶
错。低质量数据会稀释高质量模式,甚至拖累模型。更多数据只有在质量和分布可控时才有意义。
误区 2:去重只影响训练成本¶
不止。去重还直接影响泛化、记忆风险、版权风险和 benchmark 污染。
误区 3:质量过滤就是删脏话¶
真正难的是识别"看起来像自然语言、但信息密度极低"的文档,例如 SEO 软文、自动洗稿、模板拼接页。
误区 4:配比可以靠经验一次定死¶
不现实。不同模型规模、tokenizer、训练阶段和目标能力,对最优 mixture 的偏好都可能不同。
学完可以做什么¶
- 用 Common Crawl 小样本或开源网页语料做一个迷你清洗管线,比较清洗前后的文本质量。
- 实现一次 MinHash 去重,观察重复率和 token 压缩比。
- 设计一个小型 data mixture 实验,对比"多加代码数据"对数学/代码 benchmark 的影响。
原始论文¶
| 论文 | 链接 |
|---|---|
| Scaling Laws for Neural Language Models (Kaplan et al., 2020) | arxiv.org/abs/2001.08361 |
| Training Compute-Optimal LLMs / Chinchilla (Hoffmann et al., 2022) | arxiv.org/abs/2203.15556 |
| Deduplicating Training Data Makes Language Models Better | arxiv.org/abs/2107.06499 |
| Dolma: Open Corpus for Language Model Pretraining (AI2, 2024) | arxiv.org/abs/2402.00159 |
| FineWeb: Decanting the Web for Finest Text Data (HuggingFace, 2024) | arxiv.org/abs/2406.17557 |
延伸阅读与视频¶
| 平台 | 标题 | 说明 |
|---|---|---|
| 📺 B站 | Andrej Karpathy【中英】从零构建GPT(重制版) | 4.6万播放,Karpathy亲授预训练全流程,包含数据处理 |
| 📺 B站 | 翁家翌:OpenAI、强化学习、Infra、后训练全访谈 | 110万播放,OpenAI内部预训练工程实践深度访谈 |
| 📖 Hugging Face Blog | FineWeb: decanting the web for finest text data | 网页语料过滤、去重、质量评估的公开工程案例 |
| 📖 AI2 Dolma | Dolma dataset | 开放预训练语料,可参考其来源配比和数据说明 |
| 📖 Common Crawl | Common Crawl | 大规模网页语料入口,理解原始网页数据为什么需要清洗 |
| 📖 Datatrove | Hugging Face datatrove | 大规模数据处理、过滤、去重、pipeline 编排工具 |
| 📖 KenLM | KenLM | 常用于语言模型困惑度过滤和文本质量打分的工具 |