系列文章: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 自建指令数据集的三种方法

  1. 人工标注:质量最高,但成本也最高。通常需要专业标注团队,每条数据的成本在几元到几十元不等。LIMA 论文证明,仅 1000 条精心挑选的高质量数据就能显著提升模型对话能力。

  2. GPT 辅助生成:用 GPT-4 等强模型生成指令数据,再做人工审核。这是目前性价比最高的方式。Self-Instruct、Evol-Instruct 等方法都属于此类。

  3. 数据增强:对已有数据进行改写、扩充、组合,比如把简单指令变得更复杂,或者把单轮对话扩展为多轮对话。

五、偏好数据:教模型"哪个回答更好"

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 和使用限制。

八、总结

回顾一下今天的核心要点:

  1. 预训练数据是大模型的知识基础,需要经过严格的清洗和去重,数据来源要多样化。

  2. 数据配比决定了模型能力的"方向",需要大量实验来确定最佳配方。

  3. SFT 指令数据质量远比数量重要,1000 条精品数据可能胜过 10 万条平庸数据。

  4. 偏好数据的标注一致性直接影响 RLHF/DPO 的训练效果。

  5. 数据污染、偏见和版权是数据工程中的三大"暗礁",必须提前防范。

一句话总结:在大模型的世界里,数据不是"越多越好",而是"越精越好"。 花 80% 的时间在数据质量上,往往比花 80% 的时间调超参数更值得。


下一篇预告:第二周·第六篇《分布式训练入门:一台GPU不够,那就来一群》—— 我们将深入讲解数据并行、张量并行、流水线并行等分布式训练技术,帮你理解大模型是如何在成百上千张 GPU 上协同训练的。

如果这篇文章对你有帮助,别忘了 点赞、收藏、关注 三连支持一下!你的鼓励是我持续更新的最大动力。有任何问题欢迎评论区交流,我会尽量回复每一条留言

更多推荐