预训练数据通常来自哪里
P0 · llm_training
🏷 标签:pretraining-data, data-cleaning, common-crawl
1️⃣ 考察意图
面试官想考察你对 LLM 预训练数据工程的系统性理解,而非简单背诵数据来源列表。这是典型的“背概念+工程取舍”混合题,刁钻点在于:多数候选人只记得 Common Crawl、Wikipedia 等来源,却说不清数据清洗的 trade-off(如去重对模型多样性的影响)或数据配比如何决定模型能力。答好了能展示数据工程意识、对模型性能瓶颈的认知,以及处理海量非结构化数据的实战经验。
2️⃣ 标准答
预训练数据来源可归为四大类,每类有特定清洗挑战和工程取舍:
1. 互联网爬取数据(占比 60-80%)
- 主要来源:Common Crawl(每月 20-50TB 原始数据)、内部爬虫(如 Google 的 C4 数据集)。
- 清洗流程:去重:使用 MinHash + LSH 对文档级去重,再用 SimHash 对段落级去重。坑:过度去重会损失长尾知识(如罕见事件报道),需保留 1-2 份副本。
- 质量过滤:用 fastText 语言检测模型过滤非目标语言;基于启发式规则(如文档长度 < 50 tokens、符号占比 > 40%)剔除垃圾内容。
- 隐私保护:用正则匹配移除邮箱、IP 地址,但需注意误伤(如技术文档中的示例 IP)。 工程取舍:Common Crawl 原始数据中约 70% 是低质量内容(广告、重复页面),清洗后仅保留 10-20%。这导致数据量锐减,但模型困惑度(perplexity)可降低 15-20%(参考 GPT-3 论文)。
2. 书籍与学术论文(占比 10-20%)
- 来源:Books3(约 200GB 电子书)、arXiv(200 万+论文)、PubMed Central(生物医学全文)。
- 处理难点:PDF 解析质量参差,需用 Grobid 或 Nougat 提取结构化内容。坑:数学公式常被解析为乱码,需用 LaTeX 识别器后处理。
- 价值:提供长程依赖(书籍章节连贯性)和严谨推理(论文论证逻辑),对模型常识和推理能力提升显著。
3. 代码仓库(占比 5-10%)
- 来源:GitHub(The Stack 数据集 3TB)、BigQuery 公共数据集。
- 清洗:按文件扩展名过滤(如 .py、.java),剔除自动生成代码(如 lock 文件)。坑:代码注释中常含敏感信息(API key),需用正则或 AST 解析移除。
- 作用:增强模型代码生成和逻辑推理能力,但过多代码会稀释自然语言分布,需控制比例(如 Code Llama 用 8% 代码数据)。
4. 社交媒体与对话数据(占比 5-10%)
- 来源:Reddit(Pushshift 数据集)、Twitter(已受限)、Stack Exchange。
- 挑战:噪声极高(表情、缩写、多轮对话断裂),需用 BERT 分类器过滤有毒内容。坑:Reddit 的“/s”标记(讽刺)常被误判为正常,需额外规则处理。
- 价值:提供对话风格和实时知识(如 2023 年后的事件),但时效性衰减快(6 个月后相关性下降 30%)。
数据配比策略:以 GPT-3 为例,Common Crawl(60%)、WebText2(22%)、Books(16%)、Wikipedia(3%)。关键取舍:Wikipedia 质量高但量少(仅 6TB),过度依赖会导致模型知识面窄;Common Crawl 量大但噪声多,需用重采样(如按域质量加权)平衡。实际落地中,建议用 Pile 数据集 的设计思路:按领域分桶,每个桶独立清洗后按困惑度贡献动态调整权重。
3️⃣ 答题模板(30 秒电梯版)
“这个问题我从数据来源、清洗流程、配比策略三个层面回答。来源上,互联网爬取占大头(Common Crawl),辅以书籍、代码、社交媒体;清洗需做去重(MinHash)、质量过滤(fastText)、隐私保护;配比上,参考 GPT-3 的 60:22:16:3 比例,但需根据模型用途调整——代码模型多放 GitHub,推理模型多放 arXiv。总结一句:预训练数据工程的核心不是堆量,而是通过清洗和配比控制数据质量,这直接决定模型能力的上限。”
4️⃣ 高频追问 & 应对
追问 1:你提到去重用 MinHash,具体怎么实现?参数怎么设?
用 MinHash 对文档生成 128 个签名,再用 LSH 分桶(band=16, rows=8),Jaccard 相似度阈值设为 0.8。坑:阈值设太低(如 0.5)会误删同主题不同表述的文档(如两篇报道同一事件),导致模型对事件理解片面。实际中需在验证集上测试:保留 0.8 阈值时,模型在 MMLU 上得分比 0.5 高 2-3 个百分点。
追问 2:数据配比怎么动态调整?有具体方法吗?
用 DoReMi 方法:先训练一个小模型(如 280M 参数),计算每个领域数据的困惑度,然后按困惑度反比调整权重——高困惑度领域(如代码)多采样,低困惑度领域(如 Wikipedia)少采样。取舍:这会导致计算量增加 20%,但模型在 8 个基准上的平均分提升 5-8%。另一种方法是 数据影响函数(Data Influence Function),但计算成本太高,工业界少用。
追问 3:如何处理多语言数据?比如中英文混合的 Common Crawl 数据?
先用 fastText 语言检测模型(支持 176 种语言)按文档分类,然后按目标语言比例采样。坑:中文数据中常混有日文汉字(如“東京”),需用字符级 n-gram 特征辅助判断。实际中,对中文数据额外用 Jieba 分词统计词频,过滤掉日文高频词(如“の”)。配比上,参考 BLOOM 的 1.5TB 多语言数据:英语 30%、中文 15%、法语 10% 等,但需注意低资源语言(如斯瓦希里语)可能因数据量少导致过拟合,需用回译(back-translation)增强。
5️⃣ 避坑 · 常见错误答法
- ❌ 只列数据来源(“Common Crawl、Wikipedia、GitHub”),不提清洗和配比 → ✅ 必须补充“数据清洗是核心,比如去重能减少 30% 的冗余,配比决定模型能力偏向”。
- ❌ 说“数据越多越好”,忽略质量过滤 → ✅ 强调“低质量数据会污染模型,比如 Common Crawl 中 70% 是垃圾,需用启发式规则和分类器过滤”。
- ❌ 用“经典算法”代替具体方法名 → ✅ 必须给出具体工具(如 MinHash、fastText、DoReMi),展示工程细节。
6️⃣ 简历呼应
- 如果你有 RAG 项目:从数据清洗 pipeline 切入,对比 RAG 中检索文档的清洗与预训练数据清洗的异同(如 RAG 更注重时效性,预训练更注重去重)。
- 如果你只做过传统 NLP:用文本分类任务类比,说明数据质量对模型性能的影响(如垃圾邮件过滤中 90% 准确率 vs 95% 准确率的数据差异),再迁移到预训练场景。
- 如果你是校招无项目:聚焦 Common Crawl 的清洗 demo,描述如何用 Python 实现 MinHash 去重和 fastText 语言检测,并统计清洗前后数据分布变化(如文档长度、语言比例)。
7️⃣ 延伸阅读
- 《Scaling Laws for Neural Language Models》(Kaplan et al., 2020)—— 数据量与模型性能的关系
- 《Deduplicating Training Data Makes Language Models Better》(Lee et al., 2022)—— MinHash 去重细节
- 《DoReMi: Optimizing Data Mixtures for Language Model Pretraining》(Xie et al., 2023)—— 动态数据配比方法
- 《The Pile: An 800GB Dataset of Diverse Text for Language Modeling》(Gao et al., 2020)—— 多领域数据集设计
- 《C4: Colossal Clean Crawled Corpus》(Raffel et al., 2020)—— Common Crawl 清洗实践