当LLaMA 3在2024年发布时,一个引人注目的细节被埋没在技术报告的角落:尽管训练数据从LLaMA 2的1.8万亿token增长到15万亿token,但数据清洗管道的改进才是模型性能飞跃的真正推手。Meta团队开发了复杂的数据处理流水线,包括启发式过滤器、NSFW过滤器、语义去重方法和文本质量分类器——这套系统让模型在更少训练步数下实现了更好的性能。

这不是孤例。Google的PaLM论文发现,将训练数据中的低质量内容过滤掉后,模型在下游任务上的表现提升了8%;Allen AI的Dolma数据集通过精细的数据清洗,让同等规模的模型实现了更好的效果。数据质量的重要性正在被重新认识:在算力相对充足的今天,数据已经成为大模型训练的核心瓶颈。

从Common Crawl到训练语料:数据来源的现实困境

现代大模型的预训练数据主要来自三个来源:网页爬取数据(Common Crawl)、精选语料库(Wikipedia、arXiv、GitHub等)和专有数据。其中,网页爬取数据占据了预训练语料的绝大部分——LLaMA 3的训练数据中,约50%来自网页数据。

Common Crawl是一个非营利组织维护的开放网页归档,每月抓取数十亿网页。2023年3月的单次快照,WET格式文件就有8.7 TiB(压缩后),WAT格式更是达到21.1 TiB。这个规模看似庞大,但原始网页数据的质量令人堪忧:大量重复内容、垃圾信息、恶意文本、机器生成内容混杂其中。

研究者对Common Crawl的分析揭示了触目惊心的数据质量问题:

  • 重复内容泛滥:CCNet论文报告,去重步骤移除了约70%的文本内容。重复内容主要来自网站导航栏、Cookie警告、联系方式模板等 Boilerplate 文本。
  • 语言混杂:同一网页可能包含多种语言,低资源语言的内容质量尤其难以保证。
  • 噪声和垃圾内容:SEO优化文本、广告内容、日志信息、错误消息等充斥其间。
  • 敏感信息泄露:个人身份信息(PII)、隐私数据可能被意外收录。

RefinedWeb数据集的Sankey图直观展示了数据流失情况:从原始网页数据到最终训练语料,大量数据在清洗过程中被过滤。这并非浪费——被移除的数据往往对模型训练有害无益。

flowchart TD
    A[原始网页数据<br/>Common Crawl] --> B[URL过滤<br/>移除恶意/成人网站]
    B --> C[文本提取<br/>HTML解析]
    C --> D[语言识别<br/>fastText分类]
    D --> E[精确去重<br/>URL/文档级别]
    E --> F[近似去重<br/>MinHash LSH]
    F --> G[启发式过滤<br/>质量规则]
    G --> H[模型质量过滤<br/>质量分类器]
    H --> I[PII移除<br/>隐私保护]
    I --> J[最终训练语料]
pie title 数据质量问题分布(Common Crawl示例)
    "重复/模板内容" : 70
    "低质量文本" : 15
    "敏感/有害内容" : 5
    "非目标语言" : 5
    "高质量内容" : 5

去重:决定数据多样性的关键战役

去重是大模型数据清洗中最核心、也最复杂的环节。重复数据带来的问题远超想象:模型倾向于记忆并逐字输出训练数据,这不仅是隐私风险,更意味着模型没有真正"学习"——它只是在背诵。Lee等人在2022年的论文中证明,去重后的模型输出训练数据的频率降低了十倍,同时需要更少的训练步数就能达到相同的性能。

去重的三个层级

URL级去重是最直接的方式。对于同一URL的多个抓取版本,保留最新版本即可。这一步能快速处理大量明显的重复,但无法处理跨网站的内容复制。

文档级去重处理的是跨来源的重复内容。这里的核心技术是MinHash LSH(局部敏感哈希)算法,它能在大规模数据集上高效识别近似重复文档。

MinHash的基本思想是将文档转换为特征签名,然后通过签名相似度估计文档相似度。具体流程如下:

  1. Shingling:将文档切分成n-gram片段(shingles)。例如,对于文档"Deduplication is so much fun!",使用word-level trigram会得到:{“Deduplication is so”, “is so much”, “so much fun”}。

  2. MinHash计算:对每个shingle进行多次哈希(或排列),取每次哈希的最小值组成签名向量。这个过程将任意长度的文档压缩成固定长度的整数数组。

  3. LSH分桶:将签名向量分成多个band,每个band包含若干行。如果两个文档在任意一个band上完全匹配,它们就被认为是候选重复对。

参数选择至关重要。BigCode的实践表明,使用$(256, 0.7, 5)$参数(256个哈希函数、0.7相似度阈值、5-gram)效果最佳。他们将3TB代码数据去重到2.4TB,模型在下游任务上的表现反而提升——更少的数据带来了更好的效果。

flowchart LR
    subgraph Step1[1. Shingling]
        A1[原始文档] --> B1[切分成n-gram]
        B1 --> C1[Shingle集合]
    end
    
    subgraph Step2[2. MinHash签名]
        D1[Shingle集合] --> E1[多次哈希]
        E1 --> F1[取最小值]
        F1 --> G1[签名向量]
    end
    
    subgraph Step3[3. LSH分桶]
        H1[签名向量] --> I1[分成bands]
        I1 --> J1[哈希分桶]
        J1 --> K1[候选重复对]
    end
    
    Step1 --> Step2 --> Step3

行级去重处理的是文档内部的重复内容。CCNet采用的方法是将每行文本标准化(小写化、数字替换为占位符、移除标点),计算SHA1哈希,使用前64位进行去重。LLaMA 3更激进:移除在每3000万文档桶中出现超过6次的行。虽然这会移除一些高质量文本,但实证研究表明整体收益为正。

语义去重:当字面不同意味着相同

传统的MinHash LSH只能处理字面上的近似重复。但对于改写、翻译、释义等语义层面的重复,需要更高级的技术。

语义去重使用预训练模型将文档编码为向量,然后在向量空间中聚类,移除同一聚类中的冗余文档。LLaMA 3使用了基于RoBERTa的语义去重方法:首先对文档进行聚类,然后在每个聚类内计算成对余弦相似度,移除与聚类中心相似度过高的文档。

这种方法计算成本高昂,但效果显著。研究表明,语义去重可以在保持甚至提升模型性能的同时,将数据集规模进一步压缩。

flowchart LR
    subgraph 传统去重
        A1[文档A] --> B1[精确匹配]
        A2[文档B] --> B1
        B1 --> C1[完全相同才能检测]
    end
    
    subgraph 近似去重
        D1[文档C] --> E1[MinHash签名]
        D2[文档D] --> E2[MinHash签名]
        E1 --> F1[LSH分桶]
        E2 --> F1
        F1 --> G1[检测字面近似]
    end
    
    subgraph 语义去重
        H1[文档E] --> I1[向量编码]
        H2[文档F] --> I2[向量编码]
        I1 --> J1[聚类]
        I2 --> J1
        J1 --> K1[检测语义相似]
    end

质量过滤:从启发式规则到模型驱动

去重解决了重复问题,但剩下的数据质量参差不齐。质量过滤的目标是识别并移除低质量内容,保留真正有价值的文本。

启发式过滤:简单但有效

启发式过滤器基于规则和统计指标,计算成本低,适合大规模预处理。常见的启发式规则包括:

  • 长度过滤:移除过短(如少于50词)或过长(如超过100,000词)的文档。过短的文档信息量不足,过长的文档可能是日志文件或机器生成内容。
  • 标点分布:正常文本应有合理的标点分布。缺少标点或标点比例异常高的文档往往质量低劣。
  • 重复模式检测:计算n-gram重复覆盖率,移除大量重复内容的文档。这能识别SEO文本、模板内容等。
  • 符号-词比例:符号过多的文档可能是代码、数学公式或乱码。
  • 困惑度分布:使用语言模型计算文档困惑度,与基准分布比较。困惑度异常高或低的文档可能存在问题。

Gopher论文详细描述了一套启发式规则:词数在50-100,000之间、平均词长3-10字符、符号-词比例低于0.1、子词比例低于0.9等。这些规则看似简单,但能有效过滤大量低质量内容。

graph TD
    A[文档输入] --> B{长度检查}
    B -->|过短/过长| C[移除]
    B -->|通过| D{标点分布}
    D -->|异常| C
    D -->|通过| E{重复模式}
    E -->|高重复率| C
    E -->|通过| F{符号比例}
    F -->|过高| C
    F -->|通过| G{困惑度}
    G -->|异常| C
    G -->|通过| H[保留文档]

模型驱动的质量过滤

启发式规则有局限性:它们依赖人工设计的特征,难以捕捉复杂的质量问题。模型驱动的质量过滤使用机器学习模型自动识别高质量文本。

GPT-3论文首次系统使用了这种方法:训练一个逻辑回归分类器,预测文档是否"类似Wikipedia"。正例来自Wikipedia,负例来自Common Crawl。分类器得分高的文档被保留用于训练。

后续工作发展了多种变体:

  • fastText分类器:计算效率极高,适合处理万亿级token。DCLM基准使用fastText进行初步质量筛选。
  • BERT类分类器:能捕捉更复杂的语义特征,但计算成本更高。通常用于精细化筛选阶段。
  • LLM评分:使用大语言模型直接评估文本质量。LLaMA 2的分类器就是基于Llama 2 Chat的标注训练的:将文档呈现给模型,让它判断是否满足质量要求,然后用这些标注训练DistilRoBERTa分类器。

一个重要发现来自2025年的研究:过于激进的质量过滤反而可能损害模型性能。某些看似"低质量"的内容——博客评论、论坛讨论——实际上包含了独特的知识和表达方式。研究者需要在过滤强度和数据多样性之间找到平衡。

flowchart TD
    subgraph 训练阶段
        A[Wikipedia文本] --> B[正例标注]
        C[Common Crawl] --> D[负例标注]
        B --> E[质量分类器<br/>训练]
        D --> E
    end
    
    subgraph 推理阶段
        F[待评估文档] --> G[分类器打分]
        G --> H{分数阈值}
        H -->|高于阈值| I[保留]
        H -->|低于阈值| J[移除]
    end
    
    训练阶段 --> 推理阶段

敏感内容与隐私保护:不可忽视的安全边界

预训练数据不仅要高质量,更要安全合规。敏感内容过滤和隐私保护是数据处理管道中不可或缺的一环。

PII(个人身份信息)移除

Common Crawl等网页数据不可避免地包含个人信息:姓名、地址、电话、邮箱、身份证号等。这些信息如果被模型学习,可能导致训练数据泄露——用户输入特定提示,模型可能输出训练集中的隐私信息。

PII移除通常采用多管齐下的策略:

  1. 正则表达式匹配:识别标准格式的PII,如邮箱地址、电话号码、信用卡号。
  2. 命名实体识别:使用NER模型识别人名、地名、机构名等。
  3. 模式匹配:识别可能的敏感信息模式,如"密码是"、“社保号码"等。

移除策略包括:直接删除敏感片段、用占位符替换(如[PHONE_NUMBER])、用合成数据替换。

flowchart LR
    A[原始文本] --> B[正则匹配<br/>邮箱/电话/信用卡]
    A --> C[NER识别<br/>人名/地名/机构]
    A --> D[模式匹配<br/>敏感关键词]
    
    B --> E{发现PII?}
    C --> E
    D --> E
    
    E -->|是| F[替换/删除]
    E -->|否| G[保留原文]
    F --> H[清洁文本]
    G --> H

有害内容过滤

有害内容包括仇恨言论、暴力内容、成人内容等。处理方式包括:

  • 域名黑名单:维护已知有害网站的域名列表,直接移除相关内容。RefinedWeb使用了460万个域名的黑名单。
  • 关键词过滤:识别包含特定关键词的文档。这种方法简单但容易误伤。
  • 分类器过滤:训练文本分类器识别有害内容。LLaMA 3使用AEGIS安全模型,将内容分为13个风险类别进行过滤。

基准污染检测

训练数据如果包含评估基准的测试集,会导致评估结果虚高——模型并非真正学会了任务,只是记住了答案。这在学术研究中尤其致命。

检测方法包括:将评估集转换为n-gram表示,在训练语料中搜索匹配的n-gram。发现匹配后,相关文档需要被移除或修改。BigCode发现MBPP基准中的很多任务与LeetCode题目高度相似,而GitHub上充斥着LeetCode解答——这是基准污染的隐形来源。

数据混合:配比的艺术

有了高质量的单一数据源,下一个问题是:不同来源的数据应该如何混合?数据配比直接影响模型的能力分布。

手工设计的混合策略

早期模型的数据混合主要依赖经验。The Pile数据集的混合比例是:网页数据(Common Crawl)约18%、Wikipedia约3%、GitHub约5%、arXiv约2.5%、书籍约14%等。这个比例反映了设计者对不同知识领域重要性的判断。

LLaMA 3的最终混合比例是:通用知识约50%、数学和推理约25%、代码约17%、多语言约8%。这个比例是通过大量实验确定的。

pie title LLaMA 3 预训练数据混合比例
    "通用知识" : 50
    "数学和推理" : 25
    "代码" : 17
    "多语言" : 8

自动化混合优化

手工调参难以找到最优解。DoReMi(Domain Reweighting with Minimax Optimization)算法提出了一种自动化方案:

  1. 首先训练一个小型代理模型,使用均匀的领域权重。
  2. 使用Group DRO(Distributionally Robust Optimization)优化,自动调整各领域的权重,使得最差领域的损失最小化。
  3. 将学到的权重应用于大规模模型的训练。

实验表明,DoReMi找到的权重比手工设计的效果更好:在The Pile数据集上,下游任务准确率提升6.5个百分点,训练速度提升2.6倍。

flowchart TD
    A[均匀权重初始化] --> B[训练代理模型]
    B --> C[计算各领域损失]
    C --> D[Group DRO优化]
    D --> E[更新领域权重]
    E --> F{收敛?}
    F -->|否| B
    F -->|是| G[最优权重]
    G --> H[应用于大模型训练]

基于缩放律的数据选择

LLaMA 3团队发展了一套基于缩放律的数据选择方法。他们在小规模模型上进行实验,建立训练FLOPs与下游任务性能的预测关系,然后用这个关系预测不同数据混合策略在大模型上的效果。这使得他们可以在不训练大模型的情况下,评估数据质量。

开源工具与实践建议

大模型数据处理领域已经涌现出多个开源工具:

DataTrove(Hugging Face):模块化的数据处理流水线,支持下载、清洗、过滤、去重、混合等全流程。LLaMA 3的数据处理就基于这套工具。

NeMo Curator(NVIDIA):提供GPU加速的数据处理能力,支持多节点分布式处理。报告显示,使用GPU加速可以将数据处理速度提升10倍。

datasketch:MinHash LSH的Python实现,适合中小规模数据集的去重。

对于实践者,以下是核心建议:

  1. 先小规模验证:在完整数据处理前,先用小样本验证管道的正确性。手动检查过滤结果,确保没有过度过滤或漏网之鱼。

  2. 保留中间结果:数据处理是耗时的过程,保留每一步的中间结果可以避免重复计算。

  3. 监控数据分布:清洗后检查数据分布是否合理。如果某个领域的数据被大幅削减,可能需要调整过滤策略。

  4. 关注数据多样性:过度过滤会损害数据多样性。定期抽样检查,确保数据涵盖足够的主题和风格。

  5. 迭代优化:数据处理不是一次性任务。根据模型训练效果反馈,持续改进数据清洗策略。

数据质量对模型性能的量化影响

研究者已经量化了数据清洗对模型性能的影响。以下是关键发现:

  • 去重收益:D4论文证明,去重加上数据选择可以带来20%的训练效率提升。BigCode的实验显示,在更少数据(2.4TB vs 3TB)上训练的模型,效果反而更好。
  • 质量过滤收益:DCLM基准测试显示,高质量数据可以让模型在相同计算预算下达到更好的效果,相当于节省了数倍的训练算力。
  • 过度过滤风险:一项研究发现,过度激进的质量过滤会导致模型在多个下游任务上性能下降。某些"低质量"内容包含独特价值。

这些发现指向一个核心结论:数据质量比数量更重要,但质量不是单一的维度。多样性、独特性、真实性都是质量的组成部分,需要在清洗过程中综合考虑。

graph TD
    A[原始数据] --> B{质量过滤}
    B -->|过于宽松| C[数据冗余<br/>计算浪费]
    B -->|适中| D[高质量+多样性<br/>最优效果]
    B -->|过于严格| E[数据单一<br/>能力受限]
    
    C --> F[模型记忆倾向<br/>隐私风险增加]
    D --> G[泛化能力强<br/>训练效率高]
    E --> H[特定领域薄弱<br/>知识覆盖不足]
xychart-beta
    title "数据质量对模型性能的影响趋势"
    x-axis ["低质量数据", "中等质量", "高质量", "过度过滤"]
    y-axis "性能指标" 0 --> 100
    bar [45, 72, 95, 78]

结语

大模型预训练数据的处理是一场精密的工程战役。从Common Crawl的原始网页到训练语料,每一步都需要深思熟虑:URL过滤剔除恶意网站,文本提取剥离HTML标签,语言识别分离不同语言,精确去重移除完全相同的文档,近似去重识别改写和转载,启发式过滤拦截低质量内容,模型质量分类器精选真正有价值的文本,PII移除保护隐私,有害内容过滤确保安全,最后通过精心设计的数据混合将不同来源融合为最终语料。

这套流程的重要性正在被重新认识。当模型的架构趋于稳定,数据成为决定模型能力的核心变量。正如LLaMA 3技术报告所言:开发高质量基础模型有三个关键杠杆——数据、规模和管理复杂性。而在算力和架构相对确定的今天,数据质量的提升可能是最具性价比的投入。

对于每一个试图训练大模型的团队来说,数据处理的投入永远不会白费。因为最终,每个团队都配得上它所拥有的数据集——数据质量决定了模型的上限。

参考资料

  1. Touvron, H., et al. (2024). The Llama 3 Herd of Models. arXiv:2407.21783.
  2. Lee, K., et al. (2022). Deduplicating Training Data Makes Language Models Better. ACL 2022.
  3. Wenzek, G., et al. (2020). CCNet: Extracting High Quality Monolingual Datasets from Web Crawl Data. LREC 2020.
  4. Penedo, G., et al. (2023). The RefinedWeb Dataset for Falcon LLM. arXiv:2306.01116.
  5. Xie, S. M., et al. (2024). DoReMi: Optimizing Data Mixtures Speeds Up Language Model Pretraining. NeurIPS 2023.
  6. Li, H., et al. (2024). DataComp-LM: In Search of the Next Generation of Training Sets for Language Models. NeurIPS 2024.
  7. NVIDIA. (2024). Mastering LLM Techniques: Text Data Processing. NVIDIA Developer Blog.
  8. Ben Allal, L., et al. (2023). SantaCoder: Don’t Reach for the Stars! arXiv:2301.03988.
  9. Rae, J. W., et al. (2022). Scaling Language Models: Methods, Analysis & Insights from Training Gopher. arXiv:2112.11446.
  10. Brown, T., et al. (2020). Language Models are Few-Shot Learners. NeurIPS 2020.