HiHuo
首页
博客
手册
工具
关于
首页
博客
手册
工具
关于

训练数据长什么样

大模型训练,三要素:算力、数据、算法。

算力讲过了,这篇开始讲数据。

很多人对训练数据的印象停留在「一堆文本」。实际上,不同阶段的训练数据格式完全不同,处理方式也不一样。

这篇讲清楚:预训练、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 学「偏好」,数据要人工标注

下一篇讲数据标注:这些高质量数据是怎么来的。