[LLMBook] Day 7: 第4章 数据准备 - 数据来源与预处理

[LLMBook] Day 7: 第4章 数据准备 - 数据来源与预处理

📅 阅读日期:2026-04-02 | 📖 章节:第四章上半部分 | 🏷️ 关键词:数据来源、质量过滤、数据去重、隐私保护

🎯 章节概述

第四章深入探讨了大语言模型预训练数据的准备过程。从多元数据来源的收集,到系统化的数据预处理流程,再到词元化技术,本章构建了一套完整的数据工程体系。数据质量直接决定了模型能力的上限——"垃圾进,垃圾出"在LLM时代有了更深层的含义。

一、数据来源:LLM的"食材"选择

1.1 通用文本数据

大语言模型的预训练数据主要分为通用文本数据专用文本数据两大类。通用文本数据是大模型的"主食",规模大、多样性强、易于获取。

🌐 网页数据:最主要的数据来源

网页是现有大语言模型最广泛使用的预训练数据,包含了丰富多样的文本内容。从图4.1可以清晰看到,T5、Falcon、LLaMA、GPT-3等代表性模型的预训练数据中,网页数据占比普遍在50%以上,有些模型甚至高达80%以上。

常用网页数据集包括:

数据集 规模 特点
C4 800GB (2019) Colossal Clean Crawled Corpus,已清洗
OpenWebText 38GB (2023) Reddit高质量链接,GPT-2训练数据
Wikipedia 21GB (2023) 高质量、结构化、多语言

📚 书籍数据:深度语义建模的关键

书籍文本更加正式与详实,篇幅较长。书籍数据不仅能帮助模型积累丰富的语言知识,还可以加强长程语义关系的建模能力。常用数据集包括Books3和BookCorpus2,可在Pile数据集中获取。

1.2 专用文本数据:针对性能力提升

专用数据集用于提升大语言模型在特定专业任务上的表现:

🌍 多语文本

BLOOM模型使用了涵盖46种语言的数据,PaLM更是覆盖了122种语言。多语言数据能增强模型的跨语言理解与生成能力,建立多语言间的语义关联。

🔬 科学文本

通过收集arXiv论文、科学教材、数学网页等资源,可以让模型在自然科学和工程技术方面建立知识基础。科学文本包含数学公式、蛋白质序列等特殊符号,需要特殊的预处理技术。

⌨️ 代码数据

代码能力已成为大语言模型的核心能力之一。代码语料主要来自Stack Exchange编程问答社区和GitHub开源项目仓库。代码训练能提升模型的结构化语义理解逻辑推理能力,函数调用关系还有助于增强模型的工具使用能力。

二、数据预处理:从原始到可用的炼金术

数据预处理是确保预训练数据质量的关键步骤。图4.2展示了典型的预训练数据预处理流程,包括质量过滤敏感内容过滤数据去重词元化四个主要阶段。

2.1 质量过滤:去芜存菁

质量过滤主要采用两种方法:基于启发式规则的方法基于分类器的方法

# 基于启发式规则的过滤策略示例

1. 语种过滤:使用语言识别器过滤非目标语言

2. 统计指标过滤

- 过滤超过100个重复单词/句子的文档

- 符号和词元比 > 0.1 的文档

- 点赞数 < 3 的论坛评论

3. 关键词过滤

- HTML标签、超链接、模板文本

- 隐私信息(电话、邮箱、IP地址)

- 不含常见词汇的文档

💡 实践建议(来自YuLan模型):

针对网页数据使用语言识别器过滤非中英文数据,但对于多语维基百科数据,由于数量规模相对较小且含有丰富的多语资源,可以直接添加至训练数据中。

基于分类器的方法使用训练好的文本质量分类器进行筛选:

方法 优点 缺点
轻量级模型(FastText) 效率高,速度快 准确率受限
预训练模型(BERT/BART) 可针对性微调 通用性有限
闭源API(GPT-4/Claude) 能力最强 成本高,无法灵活适配

⚠️ 注意事项:

基于分类器的方法可能误删一些低资源但高质量的文本(如文言文)。建议使用多个分类器联合过滤,或建立合理的数据召回与保留机制。

2.2 敏感内容过滤:伦理与安全的第一道防线

敏感内容过滤包括有毒内容过滤隐私内容过滤两个方面。

☠️ 有毒内容过滤

Jigsaw评论数据集提供了近160K条论坛评论数据,标注了"有毒"、"严重有毒"、"有威胁"、"侮辱性"、"暴力"和"身份仇恨"六个类别。阈值设置需要在精确度和召回率之间平衡:

  • 高阈值:去除数据过少,有毒内容残留导致下游任务性能下降
  • 低阈值:过滤更多有毒内容,但造成大量数据浪费

Dolma选择了相对较高的阈值(0.4),最终仅过滤了Common Crawl中约30%的数据。

🔐 隐私内容过滤(PII)

预训练数据可能包含用户生成的敏感信息(姓名、地址、电话等)。2023年11月有用户发现,反复要求ChatGPT重复某个单词可能无意间泄露训练数据中的个人隐私信息。

# Dolma隐私内容处理策略

隐私信息 < 5条:使用特定词元替换

- |||EMAIL_ADDRESS|||

- |||PHONE_NUMBER|||

- |||IP_ADDRESS|||

隐私信息 ≥ 6条:直接删除整个文档

2.3 数据去重:避免过度学习

大语言模型具有强大的数据拟合与记忆能力,重复数据会导致:

问题类型 具体影响
过度学习 模型频繁输出重复模式
训练不稳定 训练损失震荡,可能导致崩溃
性能下降 0.1%数据重复100次,800M参数模型仅能匹敌400M参数模型的性能
双下降现象 训练损失先下降→升高→再下降

📊 去重的三个粒度

句子级别:删除重复单词和短语的低质量句子,避免引入重复表达模式

文档级别:基于n元词组重叠比率检测相似文档,删除高度重复内容

数据集级别:检测不同数据源间的重复(如网页数据集和新闻数据集包含相同新闻)

🔧 MinHash算法简介

MinHash是一种估计集合相似度的技术,通过哈希处理集合元素并选择最小哈希值作为集合表示。比较两个集合的MinHash值,便可估算它们的Jaccard相似度。这种方法避免了逐一比较所有元素,在处理超大型集合时具有较好的计算效率。

三、数据对预训练效果的影响

3.1 数据数量的影响:扩展法则的演进

语言模型性能随训练数据数量增加而提升,符合扩展法则(Scaling Law)。但早期研究与近期实践有显著差异:

模型 参数量 训练数据 数据/参数比
GPT-3 175B 500B tokens ~2.9:1
Chinchilla 70B 1.4T tokens 20:1
LLaMA-2 7B 7B 2T tokens ~286:1

Chinchilla扩展法则提出参数规模和数据规模应同步增长。更小尺寸的语言模型使用高达1T级别的数据进行训练,仍然没有达到学习上限。

3.2 数据质量的影响:Phi系列的启示

🏆 Phi-1:高质量数据的胜利

1.3B参数的Phi-1模型,通过精心筛选高质量数据并使用GPT-3.5合成"教科书级"数据,在HumanEval上取得了50.6%的pass@1准确率,证明了数据质量比数据规模更重要的论断。

⚠️ 幻象问题(Hallucination):

如果模型在包含事实性错误或过时的数据上训练,可能产生不准确或虚假的信息。例如,"灯泡是爱迪生发明的"是一个广泛接受的误解,使用这种数据训练会使模型生成误导性输出。

3.3 数据集污染:评估的公平性威胁

基准泄漏(Benchmark Leakage)指评估基准数据出现在预训练数据中的现象。这破坏了评估的初衷,使得本应是少样本/零样本测试转变为领域内的测试任务。

🚨 极端案例:

研究显示,在测试集完全泄露的极端情况下,1.3B参数的模型甚至在大部分任务上超过了正常测评的65B参数模型!

四、数据预处理实践:YuLan-GARDEN框架

YuLan-GARDEN是YuLan模型的预训练数据处理框架,支持多进程并行处理大规模数据:

# 语言过滤示例 - FastText语言分类器

class FilterPassageByLangs():

def __init__(self):

self.language_identifier = LangIdentifier(

model_path="utils/models/fasttext/lid.176.bin")

self.reject_threshold = 0.5

def filter_single_text(self, text, accept_lang_list):

labels, scores = self.language_identifier.evaluate_single_text(text)

if scores[0] < self.reject_threshold:

labels = ["uk"] # 未知语言

if labels[0] not in [l.lower() for l in accept_lang_list]:

return True # 过滤掉

return False

# 句子级去重示例 - n元组Jaccard相似度

class CleanerDedupLineByNgram():

def clean_single_text(self, text, n=5, thre_sim=0.95):

lines = re.split('|'.join(map(re.escape, self.line_delimiter)), text)

for idx, line in enumerate(lines):

grams = re.split('|'.join(map(re.escape, self.gram_delimiter)), line)

computed_ngrams = list(ngrams(grams, min(len(grams), n)))

# 计算相邻行Jaccard相似度

jaccard_sim = len(ngrams_intersection) / len(ngrams_union)

if jaccard_sim < thre_sim:

keep_line = True

五、核心概念与技术细节

5.1 扩展法则的演进理解

📈 KM扩展法则 vs Chinchilla扩展法则

Kaplan-McCandless (KM) 扩展法则(2020):认为增加模型参数更为重要,GPT-3的175B参数模型仅用500B tokens训练。

Chinchilla扩展法则(2022):提出参数规模和数据规模应同步增长,数据/参数比约为20:1,70B参数的Chinchilla在1.4T tokens上训练,性能超越280B参数的Gopher。

5.2 双下降现象(Double Descent)

重复数据可能导致"双下降现象":模型训练损失先经历下降→升高→再下降的过程。这一现象揭示了模型容量、数据复杂度和泛化性能之间的微妙关系。

5.3 质量过滤的效率-准确性权衡

启发式规则设计简洁,能迅速过滤10M乃至100M级别的文档集;分类器方法精确度高但消耗更多计算资源。推荐策略:先用启发式规则快速排除,再用轻量级分类器精细过滤,最后用更强大的分类器最终筛选。

六、个人思考与反思

6.1 "数据工程"是LLM成功被低估的基石

阅读本章后,我深刻意识到数据准备工程是LLM成功最被低估的基石之一。公众往往关注模型架构创新、训练技巧优化,但很少意识到数据质量的决定性作用。

💡 关键洞察:

Phi-1仅用1.3B参数就达到了HumanEval 50.6%的pass@1准确率,这比很多10倍以上参数的模型表现更好。这证明了"高质量数据 > 大规模数据"的论断。但实践中,高质量数据的获取成本极高,需要大量人工筛选和专业知识。

6.2 隐私保护是社会责任,不只是技术问题

ChatGPT泄露隐私的案例让我警醒:用户反复要求模型重复某个单词,竟意外泄露了训练数据中的个人隐私信息。这不是技术缺陷,而是设计缺陷。Dolma的隐私处理策略提供了一个很好的平衡点:少量隐私信息用词元替换保留文档,大量隐私信息则直接删除整个文档。

6.3 数据集污染:评估可信度的隐形威胁

本章提到的"基准泄漏"问题让我深思。当评估数据集意外出现在预训练语料中,原本的零样本/少样本评估变成了领域内测试任务。更可怕的是,极端情况下1.3B参数的模型竟能超过正常测评的65B参数模型——这意味着很多模型声称的"突破"可能只是数据集污染的结果。

⚠️ 批判性思考:

当看到某模型声称在某个基准上取得突破时,我们是否应该追问:训练数据是否包含了测试数据?评估结果是否被污染?

七、实践建议

场景 建议 来源
网页数据清洗 过滤超过100个重复单词/句子的文档 Dolma
符号比例过滤 符号和词元比 > 0.1 的文档过滤 Gopher
论坛评论筛选 点赞数 < 3 的用户评论过滤 Dolma
语言识别 网页数据过滤非中英文,维基百科保留多语 YuLan
毒性内容阈值 使用较高阈值(如0.4)保留更多候选数据 Dolma
隐私信息处理 少量替换,大量删除整个文档 Dolma

八、总结

🎯 本章核心要点

1. 数据来源多元化:网页是主要数据源(50%+),但书籍、科学文本、代码等专用数据对特定能力至关重要

2. 质量过滤是门艺术:启发式规则效率高,分类器方法精度高,实践中需要灵活组合

3. 去重不可忽视:重复数据导致过度学习、训练不稳定、性能下降,需在句子/文档/数据集三级别去重

4. 隐私保护是社会责任:PII信息处理不当可能导致模型泄露用户隐私

5. 数据质量 > 数据规模:Phi-1证明了高质量数据能让1.3B参数模型匹敌大10倍的模型

📖 下一篇:Day 8 - 第4章:数据准备 - 词元化与分词技术

评论

此博客中的热门博文

OpenClaw 救援机器人建设与演进全记录 - 从单点故障到双实例自愈体系

Lossless Claw:无损上下文管理插件分析报告

[Hello-Agents] Day 2: 第一章 初识智能体