小白也能看懂的训练数据工程:大模型“吃什么“才能变强
系列文章:AI大模型知识体系 | 第二周·第五篇
一、引言:Garbage in, garbage out
大模型圈里有一句被反复引用的名言——"Garbage in, garbage out"(垃圾进,垃圾出)。
不管你的模型架构有多精妙、训练框架有多高效,如果喂进去的数据质量不行,模型的上限就被锁死了。反过来,哪怕模型规模不算最大,高质量的数据也能让它"以小博大"。Phi-2 只有 27 亿参数,却在很多 benchmark 上超越了参数量十倍于自己的模型,秘诀正是教科书级别的高质量训练数据。
打个比方:训练大模型就像培养一个厨师。模型架构是厨师的天赋,训练算法是厨师的练习方法,而训练数据就是食材。你用烂菜叶和过期调料,就算厨师天赋再高、练习再刻苦,做出来的菜也不可能好吃。
今天我们就来系统地聊一聊:大模型在各个训练阶段到底"吃什么",以及这些数据是怎么被加工出来的。
二、预训练数据:食材采购与清洗
2.1 数据从哪来?
预训练阶段需要的数据量极其庞大——通常是数万亿(Trillion)个 token。主要来源包括:
|
数据来源 |
说明 |
代表数据集 |
|---|---|---|
|
Common Crawl |
互联网网页抓取存档,覆盖面最广 |
C4、RedPajama、DCLM |
|
维基百科 |
高质量、多语言的百科知识 |
各语言 Wikipedia dump |
|
arXiv |
学术论文,提供科学推理能力 |
peS2o(来自 AI2) |
|
GitHub |
代码数据,赋予编程能力 |
StarCoder 训练集 |
|
书籍 |
长文本、叙事能力 |
BookCorpus、Project Gutenberg |
|
论坛/问答 |
对话与推理 |
Stack Exchange、Reddit |
2.2 清洗流程:从"脏食材"到"净菜"
原始数据(尤其是网页数据)里充斥着广告、乱码、重复内容和有害信息,必须经过严格清洗。核心步骤如下:
第一步:语言识别 —— 把中文、英文、日文等不同语言的数据分开,用 fastText 等工具即可高效完成。
第二步:去重 —— 这是最关键的一步。互联网上大量内容是重复或近似的,如果不去重,模型会反复"看"同样的内容,导致过拟合。常用算法有:
-
MinHash + LSH:先对文档生成多个哈希签名(MinHash),再用局部敏感哈希(LSH)快速找到相似文档对。这是目前大规模去重的主流方案,RedPajama 等数据集都采用此方法。
-
SimHash:对文档生成一个定长的指纹(如 64 bit),通过比较汉明距离来判断相似度,速度更快但精度略低。
# MinHash 去重的简化示例(使用 datasketch 库)
from datasketch import MinHash, MinHashLSH
lsh = MinHashLSH(threshold=0.8, num_perm=128)
def get_minhash(text):
m = MinHash(num_perm=128)
for word in text.split():
m.update(word.encode('utf-8'))
return m
# 如果新文档与已有文档相似度超过 80%,则丢弃
doc_hash = get_minhash(new_document)
if not lsh.query(doc_hash):
lsh.insert(doc_id, doc_hash)
# 保留该文档
第三步:过滤低质量内容 —— 基于规则(如文本太短、特殊字符比例过高、重复率过高)和质量分类器(训练一个二分类模型判断"高质量/低质量")来剔除噪音。
第四步:去毒 —— 使用敏感内容检测器去除包含仇恨言论、色情、暴力等有害内容的数据。这一步对模型安全性至关重要。
2.3 一锅好汤的类比
做一锅好汤,首先要选好食材:要去市场挑选新鲜的肉和蔬菜(数据采集),要洗干净泥沙和烂叶(数据清洗),还要把不同食材按比例搭配(数据配比,下面会讲)。预训练数据的处理流程,本质上就是在做"食材准备"这件事。
三、数据配比:食材的黄金搭配
同样是做汤,牛肉放多少、蔬菜放多少、调料怎么搭配,直接决定了汤的味道。大模型训练也是如此——不同领域数据的混合比例会深刻影响模型的最终能力。
3.1 配比为什么重要?
-
代码数据占比高 → 模型编程能力强,但可能文学创作变弱
-
学术数据占比高 → 模型推理能力好,但日常对话可能变得生硬
-
多语言数据配比 → 直接影响模型对各语言的支持程度
3.2 知名模型的配比策略
LLaMA 系列:Meta 的 LLaMA 在预训练中显著增加了英文 Wikipedia、代码和学术论文的权重,同时对 Common Crawl 数据只保留了经过严格过滤的高质量部分。这使得 LLaMA 在推理和代码任务上表现突出。
Dolma(OLMo 的训练数据):AI2 开源的 Dolma 数据集总量超过 3 万亿 token,配比为:Common Crawl 约占 60%,代码约占 15%,学术论文约占 10%,维基百科约占 5%,书籍和其他来源约占 10%。AI2 还通过大量消融实验验证了不同配比对下游任务的影响。
实际操作中,数据配比通常不是一次确定的,而是需要多轮实验:先训一个小模型快速验证,再根据 benchmark 结果调整比例,最终确定配方。
四、SFT 指令数据:质量远大于数量
预训练让模型"读了很多书",但还不会"好好回答问题"。SFT(Supervised Fine-Tuning,监督微调)阶段就是用高质量的指令数据来教模型"怎么按照人类的方式回答"。
4.1 好的指令数据长什么样?
一条好的 SFT 数据通常包含三个要素:
-
清晰的指令:告诉模型要做什么,不含歧义
-
多样的任务类型:问答、写作、代码、推理、角色扮演、多轮对话等
-
有挑战性的内容:不能全是"今天天气怎么样"这种简单问题
// 一条质量较好的 SFT 数据示例
{
"instruction": "请用Python实现一个LRU缓存,要求支持get和put操作,时间复杂度为O(1)。请附上代码注释和使用示例。",
"output": "以下是使用 OrderedDict 实现的 LRU 缓存:\n\n```python\nfrom collections import OrderedDict\n\nclass LRUCache:\n def __init__(self, capacity: int):\n self.cache = OrderedDict()\n self.capacity = capacity\n \n def get(self, key: int) -> int:\n if key not in self.cache:\n return -1\n self.cache.move_to_end(key) # 标记为最近使用\n return self.cache[key]\n \n def put(self, key: int, value: int) -> None:\n if key in self.cache:\n self.cache.move_to_end(key)\n self.cache[key] = value\n if len(self.cache) > self.capacity:\n self.cache.popitem(last=False) # 淘汰最久未使用\n```\n\n使用示例:\ncache = LRUCache(2)\ncache.put(1, 1)\ncache.put(2, 2)\nprint(cache.get(1)) # 返回 1\n"
}
4.2 自建指令数据集的三种方法
-
人工标注:质量最高,但成本也最高。通常需要专业标注团队,每条数据的成本在几元到几十元不等。LIMA 论文证明,仅 1000 条精心挑选的高质量数据就能显著提升模型对话能力。
-
GPT 辅助生成:用 GPT-4 等强模型生成指令数据,再做人工审核。这是目前性价比最高的方式。Self-Instruct、Evol-Instruct 等方法都属于此类。
-
数据增强:对已有数据进行改写、扩充、组合,比如把简单指令变得更复杂,或者把单轮对话扩展为多轮对话。
五、偏好数据:教模型"哪个回答更好"
RLHF(基于人类反馈的强化学习)和 DPO(直接偏好优化)都需要偏好数据——即同一个问题的两个回答,标注哪个更好。
5.1 偏好对的标注方法
一条偏好数据的基本结构:
Prompt: "如何评价《三体》这部小说?"
回答A: "《三体》是中国科幻文学的里程碑之作..." (详细、有深度)
回答B: "还行吧,挺好看的。" (简短、敷衍)
标注结果: A > B(A更好)
标注时需要注意:
-
评判维度要明确:是看准确性、有用性、安全性,还是综合评判?通常需要提供详细的标注指南。
-
标注员要多元:同一个偏好对让多个标注员独立打分,取一致意见,避免个人偏见。
-
难度梯度要合理:如果两个回答差距太大(一个满分一个零分),模型学不到什么;差距适中的"难分高下"的偏好对反而最有训练价值。
5.2 标注一致性的重要性
假设一个偏好数据集中,标注员之间的一致率只有 60%,那模型就有 40% 的数据在学"噪音"。业界通常要求一致率达到 80% 以上 才会用于训练。提高一致性的常用手段包括:细化标注指南、增加标注员培训、引入黄金标准测试题(Gold Set)进行质量监控。
六、常见数据问题与对策
6.1 数据污染(Benchmark Leakage)
问题:训练数据中包含了 benchmark 的测试题,模型在评测时"作弊"了。
对策:
-
训练前用 n-gram 重叠检测扫描训练集,移除与 benchmark 高度相似的内容
-
OpenAI、Anthropic 等公司会在技术报告中披露污染检测结果
-
使用全新的、未被公开的评测集做交叉验证
6.2 数据偏见
问题:训练数据中某些观点、性别、文化被过度代表,导致模型输出有偏见。
对策:
-
在数据配比阶段有意识地平衡不同来源
-
使用偏见检测工具(如 Bias Audit)对模型输出进行评估
-
在 SFT 阶段加入多样性和公平性相关的指令数据
6.3 版权问题
问题:训练数据中可能包含受版权保护的内容,引发法律风险。
对策:
-
优先使用开放许可(Creative Commons 等)的数据
-
建立数据溯源机制,记录每条数据的来源
-
关注各国 AI 相关法规的最新动态,及时调整数据策略
七、开源数据集推荐
以下是一份实用的开源数据集清单,覆盖预训练、SFT、偏好三个阶段:
|
数据集名称 |
阶段 |
规模 |
特点 |
获取方式 |
|---|---|---|---|---|
|
RedPajama |
预训练 |
1T tokens |
高质量网页数据,严格清洗 |
HuggingFace |
|
DCLM |
预训练 |
4T tokens |
DataComp-LM,系统性对比数据源 |
HuggingFace |
|
Dolma |
预训练 |
3T tokens |
OLMo 配套,配比透明 |
HuggingFace |
|
SlimPajama |
预训练 |
627B tokens |
RedPajama 的精简版 |
HuggingFace |
|
Alpaca |
SFT |
52K 条 |
斯坦福出品,经典入门 |
GitHub |
|
OpenAssistant |
SFT + 偏好 |
161K 条 |
多语言,含偏好标注 |
HuggingFace |
|
UltraChat |
SFT |
1.5M 条 |
多样性好,覆盖广泛 |
HuggingFace |
|
Magpie |
SFT |
300K+ |
通过 LLM 自动提取指令 |
HuggingFace |
|
Nectar |
偏好 |
183K 条 |
多回答偏好排序 |
HuggingFace |
|
UltraFeedback |
偏好 |
64K 条 |
GPT-4 标注的偏好数据 |
HuggingFace |
小贴士:HuggingFace 上搜索 "dataset" + 关键词即可找到大部分数据集。下载前注意查看数据集的 License 和使用限制。
八、总结
回顾一下今天的核心要点:
-
预训练数据是大模型的知识基础,需要经过严格的清洗和去重,数据来源要多样化。
-
数据配比决定了模型能力的"方向",需要大量实验来确定最佳配方。
-
SFT 指令数据质量远比数量重要,1000 条精品数据可能胜过 10 万条平庸数据。
-
偏好数据的标注一致性直接影响 RLHF/DPO 的训练效果。
-
数据污染、偏见和版权是数据工程中的三大"暗礁",必须提前防范。
一句话总结:在大模型的世界里,数据不是"越多越好",而是"越精越好"。 花 80% 的时间在数据质量上,往往比花 80% 的时间调超参数更值得。
下一篇预告:第二周·第六篇《分布式训练入门:一台GPU不够,那就来一群》—— 我们将深入讲解数据并行、张量并行、流水线并行等分布式训练技术,帮你理解大模型是如何在成百上千张 GPU 上协同训练的。
如果这篇文章对你有帮助,别忘了 点赞、收藏、关注 三连支持一下!你的鼓励是我持续更新的最大动力。有任何问题欢迎评论区交流,我会尽量回复每一条留言
更多推荐


所有评论(0)