训练数据长什么样
大模型训练,三要素:算力、数据、算法。
算力讲过了,这篇开始讲数据。
很多人对训练数据的印象停留在「一堆文本」。实际上,不同阶段的训练数据格式完全不同,处理方式也不一样。
这篇讲清楚:预训练、SFT、RLHF 各阶段的数据分别长什么样。
预训练数据
是什么
预训练(Pre-training)是大模型训练的第一阶段。这个阶段的目标是让模型学会「语言」本身——理解语法、积累知识、学会推理。
预训练数据就是大规模的文本语料,越多越好,越多样越好。
数据格式
预训练数据格式很简单,就是纯文本。
{"text": "这是一段文本内容,可以是新闻、书籍、网页..."}
{"text": "另一段文本内容..."}
{"text": "..."}
一行一条数据,JSON 格式,里面就一个 text 字段。
或者更简单,直接纯文本文件,每行一个文档,用特殊分隔符隔开:
文档1的内容...
<|endoftext|>
文档2的内容...
<|endoftext|>
数据来源
预训练语料通常来自:
| 来源 | 说明 | 质量 |
|---|---|---|
| CommonCrawl | 互联网爬取的网页 | 量大但质量参差 |
| Wikipedia | 维基百科 | 质量高但量不大 |
| Books | 电子书 | 质量高 |
| 学术论文 | arXiv、PubMed 等 | 专业性强 |
| 代码 | GitHub | 学习编程能力 |
| 社交媒体 | Reddit、Twitter | 对话风格 |
数据规模
GPT-3:45TB 文本,约 3000 亿 token LLaMA:1.4 万亿 token GPT-4:据传超过 10 万亿 token
Token 是模型处理的基本单位。英文大约 1 个词 = 1.3 个 token,中文大约 1 个字 = 1-2 个 token。
数据处理流程
原始数据不能直接用,要经过一系列处理:
原始数据 → 去重 → 过滤 → 清洗 → 分词 → 打包
去重:网上重复内容太多,重复数据会影响模型效果
过滤:去掉低质量内容(广告、乱码、色情暴力等)
清洗:去除 HTML 标签、特殊字符、修复编码问题
分词(Tokenization):把文本转成 token 序列
打包:把多个短文档拼接成固定长度的训练样本
SFT 数据
是什么
SFT(Supervised Fine-Tuning,监督微调)是预训练之后的阶段。目标是让模型学会「按指令行事」——用户问什么,就答什么。
预训练后的模型只会「续写」,给它一段话它会继续往下写。但我们需要的是「问答」,用户提问,模型回答。SFT 就是教会模型这种交互方式。
数据格式
SFT 数据是对话格式:
{
"conversations": [
{"role": "user", "content": "什么是机器学习?"},
{"role": "assistant", "content": "机器学习是人工智能的一个分支,它让计算机能够从数据中学习规律..."}
]
}
或者简化版:
{
"instruction": "解释什么是机器学习",
"input": "",
"output": "机器学习是人工智能的一个分支..."
}
核心就是「问」和「答」的配对。
多轮对话
实际的 SFT 数据通常是多轮对话:
{
"conversations": [
{"role": "user", "content": "帮我写一首诗"},
{"role": "assistant", "content": "好的,请问您想要什么主题的诗?"},
{"role": "user", "content": "关于春天的"},
{"role": "assistant", "content": "春风又绿江南岸,明月何时照我还...(以下是一首关于春天的诗)"}
]
}
数据规模
SFT 数据量比预训练小很多,但质量要求更高。
- 小规模微调:几千到几万条
- 中等规模:几十万条
- 大规模:几百万条
关键不是数量,是质量和多样性。
数据来源
- 人工标注:专业标注员写的问答对,质量最高
- 自动生成:用 GPT-4 等强模型生成,成本低但有同质化风险
- 开源数据集:Alpaca、ShareGPT、BELLE 等
- 用户反馈:真实用户的使用数据
RLHF 数据
是什么
RLHF(Reinforcement Learning from Human Feedback,人类反馈强化学习)是训练的最后阶段。目标是让模型的回答更符合人类偏好——更有帮助、更安全、更诚实。
Reward Model 数据
RLHF 的第一步是训练一个 Reward Model(奖励模型),用来给模型的回答打分。
训练 Reward Model 需要「偏好数据」:同一个问题的多个回答,标注哪个更好。
{
"prompt": "如何学习编程?",
"chosen": "学习编程可以从以下几步开始:1. 选择一门语言... 2. 找一个好教程...",
"rejected": "编程很简单,随便学学就会了。"
}
chosen 是更好的回答,rejected 是较差的回答。
偏好标注标准
标注员通常按这些维度评判:
- 有帮助(Helpful):回答是否解决了用户的问题
- 诚实(Honest):是否承认不知道、不编造
- 无害(Harmless):是否安全、不产生有害内容
PPO 训练数据
有了 Reward Model 之后,用 PPO(Proximal Policy Optimization)算法训练模型。
这个阶段的「数据」其实是 prompt 集合:
{"prompt": "写一篇关于环保的文章"}
{"prompt": "解释量子力学"}
{"prompt": "如何做番茄炒蛋"}
模型生成回答,Reward Model 打分,根据分数更新模型。
DPO 简化
PPO 比较复杂,现在很多团队用 DPO(Direct Preference Optimization)替代。
DPO 直接用偏好数据训练,不需要单独的 Reward Model:
{
"prompt": "如何学习编程?",
"chosen": "学习编程可以从以下几步开始...",
"rejected": "编程很简单,随便学学就会了。"
}
格式和 Reward Model 数据一样,但训练方法不同。
数据存储格式
JSONL
最常用的格式,每行一条 JSON:
{"text": "..."}
{"text": "..."}
优点:流式处理,不用一次性加载全部数据
Parquet
列式存储格式,压缩率高,读取快:
import pandas as pd
df = pd.read_parquet("data.parquet")
Hugging Face Datasets 默认用这个格式。
Arrow
内存映射格式,支持零拷贝读取:
from datasets import load_dataset
dataset = load_dataset("json", data_files="data.jsonl")
二进制格式
预训练大规模数据通常转成二进制:
# 预处理:文本 → token ids → 二进制
import numpy as np
tokens = tokenizer.encode(text)
np.save("data.npy", tokens)
省空间,读取快。
数据工程实践
数据质量 > 数据数量
现在的共识是:高质量的小数据集,效果可能比低质量的大数据集更好。
LLaMA 用 1.4T token 训练出的效果,和 GPT-3 用 300B token 差不多。关键是数据质量和配比。
数据配比很重要
不同来源的数据要按比例混合:
代码 : 网页 : 书籍 : 学术 = 2 : 5 : 2 : 1
配比不同,模型的能力侧重也不同。代码多了编程强,书籍多了知识丰富。
数据去污染
评测数据不能出现在训练数据里,否则就是「作弊」。
# 检查训练数据是否包含评测集的内容
for test_sample in test_set:
if test_sample in train_set:
train_set.remove(test_sample)
数据版本管理
数据也要版本控制,记录每次训练用的是哪个版本的数据:
- 用什么过滤规则
- 去重率是多少
- 数据配比是什么
- 总 token 数是多少
小结
三个阶段的数据格式:
| 阶段 | 格式 | 规模 | 重点 |
|---|---|---|---|
| 预训练 | 纯文本 | 万亿 token 级 | 量大、多样 |
| SFT | 问答对/对话 | 万到百万条 | 质量、多样 |
| RLHF | 偏好对比 | 万到十万条 | 标注一致性 |
关键认知:
- 预训练学「语言」,数据要多要广
- SFT 学「交互」,数据要准要全
- RLHF 学「偏好」,数据要人工标注
下一篇讲数据标注:这些高质量数据是怎么来的。