01. 预训练数据的来源、清洗流程和质量控制怎么做?

整理预训练数据来源、清洗流程与质量控制方法。

简单回答

预训练数据的来源以互联网公开数据为主,包括网页(Common Crawl)、书籍、代码、论文、百科等。清洗流程通常包括语言识别、低质量过滤、去重、内容安全过滤等多个环节,每一步都会影响最终数据质量。数据质量比数据数量重要得多——同样的参数规模,数据质量更高的模型表现通常好一到两个档次。

详细解答

预训练数据从哪里来

大模型预训练数据的核心来源是互联网爬取数据,Common Crawl 是最常用的开源爬虫数据集,每月都在更新,累计体量达到 PB 级别。但 Common Crawl 的原始数据质量参差不齐,直接用的话效果很差,所以各家机构都会在它的基础上做大量过滤和清洗,形成自己的数据集。典型的衍生数据集有 C4(Google)、RefinedWeb(Falcon 团队)、Dolma(Allen AI)、FineWeb(HuggingFace)等。

除了网页数据,还有几个重要的补充来源。书籍数据(Books3、Gutenberg 等)信息密度高、语言质量好,对模型的推理能力和长文本理解很有帮助。代码数据(GitHub、Stack Overflow)对提升模型的代码能力和逻辑推理能力很关键,这一点在 CodeLlama 和 DeepSeek-Coder 系列的技术报告里都有明确说明。学术论文(arXiv、PubMed)有助于提升专业领域的知识深度。百科(Wikipedia、Wikidata)质量高、覆盖广,通常会做上采样(即在训练时重复使用更多次)。

清洗流程的核心步骤

一个完整的预训练数据清洗流水线,大致经过以下几个阶段。

语言识别与过滤是第一关。用 fastText 或 CLD3 这类轻量级模型识别文本语言,过滤掉不在目标语言范围内的文档,或者把不同语言的文档分桶处理,方便后续按语言配比。

规则过滤是最基础但效果很好的清洗手段。常见规则包括:过滤掉过短的文档(少于 100 个词的文档通常是导航栏、错误页面等噪音);过滤掉重复比例过高的文档(大量重复的句子通常是爬虫噪音或模板化内容);过滤掉标点符号比例异常的文档;过滤掉数字比例过高的文档(通常是数据表、日志等);过滤掉包含大量特殊字符(HTML 标签残留、乱码)的文档。这些规则简单粗暴,但能快速去掉相当大比例的低质量内容。

基于模型的质量过滤是更精细的一步。用一个轻量级的质量分类器(通常用 Wikipedia 和高质量书籍训练)对每个文档打分,保留高分文档。这是 C4、Dolma 等数据集普遍使用的思路。也可以用困惑度(Perplexity)来过滤:用一个小模型计算每个文档的困惑度,困惑度过高(模型完全看不懂)或过低(完全模板化、信息量少)的文档都应该过滤。

内容安全过滤是不可缺少的环节。要过滤掉色情、暴力、仇恨言论、个人隐私信息等内容。通常用关键词黑名单加分类器的组合。NSFW 分类器可以用 Detoxify 等开源工具,或者自己标注数据训练。

去重是独立的关键步骤,重要性经常被低估。预训练数据里的重复内容比人们想象的多得多——同一篇文章可能被几百个网站转载,同一段代码可能出现在无数 repo 里。大量重复数据会让模型过度记忆这些内容,降低泛化能力,浪费计算资源,也会污染评测集(导致数据污染问题)。去重策略会在后面单独讲。

质量控制的工程实现

在实际工程中,清洗流水线通常用分布式处理框架(Spark、Ray Data)来跑,因为数据体量太大(TB 到 PB 级别),单机处理不现实。每个清洗步骤都需要留存统计信息,比如每一步过滤掉了多少比例的数据、过滤前后的语言分布和长度分布变化。这些统计信息是质量控制的核心依据,也方便后续复现和调试。

一个常见的经验是:与其追求"尽量多保留数据",不如认真研究那些被过滤掉的样本是什么,以及那些留下来的高质量样本有什么特征。Phi 系列模型就是一个极端的例子——用精心筛选的高质量"教科书式"合成数据训练出来的小模型,在很多 benchmark 上碾压了用更多但更杂数据训练的大模型。

面试时可以这样答

预训练数据主要来自三类:互联网爬取(Common Crawl 是基础,各家在此基础上再做过滤)、高质量结构化内容(书籍、论文、Wikipedia)、以及代码(GitHub 等)。不同来源的数据质量差异很大,所以清洗是核心环节。

清洗流程通常分几层:第一层是规则过滤,把过短、重复比例高、标点/字符异常的文档直接去掉;第二层是语言识别过滤,按目标语言分桶;第三层是质量打分,用一个轻量分类器打分,只保留高质量文档;第四层是内容安全过滤,去掉色情、暴力、隐私信息等;最后是去重。

真正在工程上做这块,有几个点值得注意:清洗流水线一定要记录每一步的过滤比例,方便排查;去重经常被忽视但影响很大,大量重复数据会浪费训练计算量还会污染评测;另外数据质量比数量重要,Phi 系列的经验就是用少量精选数据打败大量杂数据。

常见追问

  1. Common Crawl 原始数据有多脏?你会怎么评估一份新数据的质量?
  2. 质量分类器是怎么训练的?用什么数据作为正样本?
  3. 清洗掉的数据比例大概是多少?过滤太激进有没有问题?