2023年12月28日

预训练数据工程 — 配比 / 清洗 / 去重 / 过滤

预训练数据工程是将原始互联网文本转化为高质量训练语料的全流程,包括数据源选择、配比设计、清洗去重和质量过滤,直接决定模型能力的上限。

知识库大模型训练与对齐llmpretrainingdatadedupfilteringmixture

先说结论

预训练数据工程是将原始互联网文本转化为高质量训练语料的全流程,包括数据源选择、配比设计、清洗去重和质量过滤,直接决定模型能力的上限。

为什么我会单独记这一篇

LLM 的性能遵循"垃圾进、垃圾出"(Garbage In, Garbage Out)原则。即使有最优的架构和训练目标,低质量数据也会产生有缺陷的模型。数据工程解决以下核心问题:

  1. 数据从哪来:互联网网页、书籍、论文、代码、对话——如何选择和平衡?
  2. 如何去除噪音:广告、模板文本、SEO 垃圾、机器生成内容如何识别和过滤?
  3. 如何消除重复:去重不仅节省算力,还能减少模型的"死记硬背"
  4. 如何保证质量:哪些文本算"高质量"?用什么标准衡量?
  5. 如何配比:代码、数学、多语言、对话数据各占多少?

Meta 的 LLaMA 3 技术报告明确指出:数据质量的改进比架构改进对模型性能的贡献更大

先把核心脉络捋清楚

数据源分类

数据源 代表数据集 特点
通用网页 CommonCrawl, RefinedWeb 量大但质量参差,需重清洗
高质量网页 Wikipedia, curated sources 质量高但量小
书籍 Books3, Gutenberg 长文本连贯性好
学术论文 arXiv, S2ORC 数学/科学推理能力强
代码 GitHub (The Stack, StarCoder) 推理能力、格式化能力
对话 Reddit, StackExchange 问答和交互能力
多语言 各语言 CC 子集 多语言能力

数据配比(Data Mixture)

  • LLaMA 1:约 80% 网页 + 6.5% 书籍 + 4.5% GitHub + 4.5% Wikipedia + 其他
  • GPT-3:60% 已过滤 CommonCrawl + 19% WebText2 + 10% Books + 8% Wikipedia + 3% CC-stories
  • Phi 系列(Microsoft):大量"教科书质量"合成数据
  • DoReMi(Xie et al., 2023):用小型 proxy 模型通过分布鲁棒优化自动学习最优配比

配比的核心 trade-off:

  • 代码占比高 → 推理能力强但可能过度"程序化"
  • 网页占比高 → 知识覆盖广但噪音多
  • 学术占比高 → 科学能力提升但通用对话变弱

去重(Deduplication)

精确去重(Exact Deduplication)

  • 对整篇文档计算哈希(SHA-256 / xxHash),完全相同的文档只保留一份
  • 简单高效,但只捕获完全一致的副本

模糊去重(Fuzzy / Near Deduplication)

  • MinHash + LSH(Locality-Sensitive Hashing):
    1. 文档切分为 n-gram shingles(通常 5-gram)
    2. 对 shingle 集合计算 MinHash 签名(数百个哈希函数)
    3. 用 LSH 将相似签名分到同一桶
    4. 对同桶文档计算 Jaccard 相似度,超过阈值(通常 0.7-0.9)则判定为近似重复
  • 被 GPT-3、BLOOM、RedPajama 等广泛采用

子串级去重(Substring Deduplication)

  • Suffix Array 方法(Lee et al., 2022):
    1. 对整个语料构建后缀数组
    2. 利用后缀数组高效找到所有长公共子串
    3. 超过长度阈值的重复子串被标记并去除
  • 优势:能检测文档内部的段落级重复,比文档级去重更精细
  • Lee et al. 证明:去重能显著降低模型的逐字记忆(memorization)

典型去重流水线

原始语料 → 精确去重(哈希) → 模糊去重(MinHash+LSH) → 子串级去重(Suffix Array) → 质量过滤 → 最终语料

质量过滤(Quality Filtering)

基于规则的过滤

  • 语言检测(fastText/lingua),过滤非目标语言
  • 长度过滤:过短的文档(<50 词)通常是导航栏、广告
  • 困惑度过滤:用 KenLM 在 Wikipedia 上训练的语言模型,过滤困惑度过高或过低的文本
  • 特殊字符比例:排除含大量乱码、HTML 标签的文档
  • "脏词"列表:排除色情/暴力内容

基于模型的过滤

  • fastText 分类器:在 Wikipedia(正例)和随机 CC(反例)上训练,过滤低质量文档
  • GPT-3 方法:训练一个二分类器区分高质量参考语料和随机 CC
  • perplexity 过滤:用一个小型 LM 对文档打分,保留困惑度在合理范围内的文本
  • CCNet pipeline:Meta 开源的 CC 处理管线,用 KenLM 困惑度过滤

PII 过滤

  • 识别并移除个人信息(PII):邮箱、电话、社保号、IP 地址
  • 对合规性至关重要(GDPR 等)

数据毒性处理

  • 使用分类器(如 Perspective API)检测和过滤有毒内容
  • Trade-off:过度过滤可能移除合法的医学、法律、新闻文本
  • LLaMA 2 的做法:训练专门的毒性分类器,但保留部分"边缘"内容以避免过度清洗

原理拆开看

为什么去重如此重要?

从统计学习角度,重复数据等价于隐式上采样某些数据点。这导致:

  1. 记忆而非泛化:模型倾向于死记硬背重复文本,而非学习底层模式
  2. 训练效率降低:重复数据浪费了本可用于学习新知识的算力
  3. 隐私风险:模型可能逐字输出训练数据中的个人信息
  4. 评估失真:如果测试集与训练集有重复,指标会虚高

Lee et al. (2022) 的实验表明:50% 的训练数据记忆可以通过去重消除。

配比的数学视角

数据配比本质上是在定义训练数据的经验分布 P_train,目标是使 P_train 尽量接近"理想数据分布"。DoReMi 的核心洞察是:用 DRO(分布鲁棒优化)找到使最差情况损失最小的配比。

放到工程里怎么落

典型大规模预训练数据处理管线(以 LLaMA 3 为例):

CommonCrawl dump
  → WARC 解析
  → 语言分类 + 规则过滤
  → 精确去重
  → MinHash 模糊去重
  → 困惑度过滤(KenLM)
  → 质量分类器过滤
  → PII 移除
  → 有毒内容过滤
  → 最终混入其他数据源
  → 全局去重(Suffix Array)
  → 分片并打包

工程工具链:

  • ** datasketch**:MinHash/LSH 实现
  • text-dedup:综合去重工具
  • CCNet:CommonCrawl 处理管线
  • Spark / Dask:分布式数据处理
  • Resiliparse:HTML 提取
  • trafilatura:网页正文提取

与相邻概念的区别

概念 区别
分词器 Tokenizer 决定如何表示文本,数据工程决定哪些文本进入训练
预训练目标 预训练目标定义学习信号,数据工程定义学习材料
后训练新趋势 持续预训练在已有模型上用领域数据进一步训练,需要同样的数据工程技术

设计时真正要权衡什么

取舍 分析
过滤力度 太松 → 噪音多、模型质量差;太紧 → 数据量骤减、覆盖面不足
配比中代码占比 代码数据增强推理能力但可能降低文学/创意写作能力
是否保留低质量数据 Phi 系列证明"少而精"可能胜过"多而杂",但需要极高的数据质量
去重粒度 文档级快但粗糙;子串级精确但计算开销大
PII 移除 vs 数据保留 过度移除可能丢失有用的结构化数据(如邮件语料库)

容易踩的坑

  1. 未做去重就训练:导致模型逐字输出训练数据,引发隐私泄露风险
  2. 配比失衡:英文数据占比 > 95%,导致多语言能力极差
  3. 过度依赖 fastText 语言检测:fastText 对短文本语言检测不准,可能误删有效数据
  4. 忘记处理 HTML/Markdown:大量 HTML 标签残留在训练文本中,模型学会生成 HTML 垃圾
  5. 测试集污染:未从训练数据中排除评估基准(MMLU, HumanEval 等),导致指标虚高
  6. 数据来源单一:只用 CommonCrawl,缺乏书籍和代码,模型推理和长文能力弱

工程落地时我会怎么做

  1. 先做精确去重,再做模糊去重,最后做子串级去重——按成本递增排序
  2. KenLM 困惑度过滤作为质量筛选的 baseline,简单有效
  3. 追踪数据来源:建立数据血缘(data lineage),方便溯源问题
  4. 在去重前排除评估基准:用 n-gram 匹配检查并移除 MMLU、GSM8K 等测试集
  5. 配比实验用小模型(1B-3B)快速迭代,确认后再用大模型
  6. 保留数据统计信息:各来源的 token 数、去重率、过滤率,用于复现和分析

如果要对外讲,可以怎么概括

数据工程是预训练中最被低估的环节。Meta 在 LLaMA 3 报告中说,数据改进比架构改进贡献更大。核心流水线是:提取 → 规则过滤 → 精确去重 → MinHash 模糊去重 → Suffix Array 子串去重 → 质量分类器过滤 → 配比混合。关键 trade-off 是过滤力度:太松噪音多,太紧数据不够。去重不仅节省算力,还减少模型的逐字记忆和隐私泄露风险。

最后记几条

  1. 去重三步曲:精确去重 → MinHash 模糊去重 → Suffix Array 子串去重
  2. 数据质量 > 数据数量:Phi 系列用"教科书质量"数据证明了这一点
  3. 配比决定能力分布:代码多→推理强、书籍多→长文强、网页多→知识广
  4. Lee et al. (2022) 证明去重可以消除 50% 的训练数据记忆
  5. 测试集污染是致命的——必须从训练数据中排除所有评估基准

延伸阅读

参考资料

  • Lee et al., "Deduplicating Training Data Makes Language Models Better" (ACL 2022)
  • Touvron et al., "LLaMA: Open and Efficient Foundation Language Models" (2023)
  • Gräf et al., "CCNet: Extracting High Quality Monolingual Datasets from Web Crawl Data" (2019)
  • Xie et al., "DoReMi: Optimizing Data Mixtures by Reweighting" (ICML 2023)
  • Penedo et al., "The RefinedWeb Dataset for Falcon LLM" (2023)
  • Together Computer, "RedPajama: An Open Dataset for Training Large Language Models" (2023)
  • Brown et al., "Language Models are Few-Shot Learners" (GPT-3, NeurIPS 2020)

---