拆解大模型四:ChatGPT是怎么调教出来的???

4 阅读6分钟

拆解大模型四:ChatGPT 不是"训练出来的",是"驯化出来的"

很多人以为大模型的训练就是:

喂数据 → 模型变聪明 → 完成。

这个理解只对了三分之一。

真实的训练过程分三个完全不同的阶段,目标、数据、方法全不一样。理解这三个阶段,你才能明白为什么 GPT-3 和 ChatGPT 用的是同一个架构,但一个像"文字接龙机器",另一个像"真正的助手"。


一、预训练:造一个"什么都见过"的大脑

第一阶段叫预训练(Pre-training)

目标只有一个:在海量文本上,学会预测下一个 Token。

训练数据是从互联网上爬下来的文本,规模大到难以想象——Common Crawl、Wikipedia、GitHub、书籍……GPT-3 的训练数据大约 3000 亿 Token,LLaMA-3 用了 15 万亿 Token。

训练过程:把一段文本切成 Token 序列,遮住最后一个,让模型猜,猜错了就调整参数,反复迭代。

# 预训练的核心损失函数
logits = model(input_ids)           # (B, T, vocab_size)
loss = F.cross_entropy(
    logits[:, :-1].reshape(-1, vocab_size),
    input_ids[:, 1:].reshape(-1)    # 目标是下一个 Token
)

这一步结束后,模型学会了语言的统计规律,积累了大量世界知识。但它只会"续写",不会"对话"。

你问它"法国的首都是哪里?",它可能会续写成:

法国的首都是哪里?这是一道地理题,答案是……
法国的首都是哪里?很多人不知道……
法国的首都是哪里?巴黎当然是……

它不知道你是在问问题,它只是在做文字接龙。


二、SFT:教模型"怎么回答问题"

第二阶段叫 SFT(Supervised Fine-Tuning,有监督微调)

目标:让模型学会"问答"这种格式,而不是无脑续写。

做法:收集一批高质量的"问题-回答"对,让人工标注员写出理想的回答,然后在这些数据上继续训练模型。

[问题] 法国的首都是哪里?
[回答] 法国的首都是巴黎。

训练方式跟预训练一样,还是预测下一个 Token,但数据换成了这种有明确格式的对话。

数据量远比预训练小——OpenAI 做 InstructGPT 时只用了大约 1.3 万条标注数据,但效果显著。原因是:模型在预训练阶段已经积累了大量知识,SFT 只是在教它"用什么格式输出"。

这一步结束后,模型知道如何回答问题了。但还有个问题没解决:

它只知道怎么"看起来像回答",不知道什么叫"好的回答"。


三、RLHF:用人类偏好来"驯化"模型

这是最关键、也最容易被讲烂的一步——RLHF(Reinforcement Learning from Human Feedback,基于人类反馈的强化学习)

分两个子步骤。

3.1 训练一个 Reward Model

首先要解决一个问题:怎么让计算机知道哪个回答"更好"?

办法是训练一个 Reward Model(奖励模型)

具体做法:对同一个问题,让 SFT 模型生成多个不同的回答,然后让人工标注员对这些回答排序("A 比 B 好,B 比 C 好")。用这些排序数据训练一个模型,让它学会给任意一个回答打分。

问题:帮我写一首关于秋天的诗
回答 A:秋风吹落叶,天高云淡……   → 人工评分:好
回答 B:秋天是一个季节,特点是……  → 人工评分:差

Reward Model 训练好之后,就变成了一个自动化的"人类偏好评分器"——给它任意一个(问题,回答)对,它能输出一个分数。

3.2 用 PPO 优化语言模型

有了 Reward Model,就可以用强化学习来优化语言模型了。

算法用的是 PPO(Proximal Policy Optimization) 。直觉上很简单:

  • 语言模型是"策略"(Policy):给定问题,输出回答
  • Reward Model 是"环境":给回答打分
  • 目标:调整语言模型的参数,让它生成的回答得分越来越高
模型生成回答
    ↓
Reward Model 打分
    ↓
PPO 根据分数调整模型参数
    ↓
循环

但这里有个关键细节:训练时会同时惩罚模型"跑偏太远"——如果模型为了拿高分开始生成奇怪的文本,会有一个 KL 散度惩罚把它拉回来,防止它钻 Reward Model 的空子。

# PPO 的目标函数(简化版)
reward = reward_model(question, response)
kl_penalty = kl_divergence(policy, reference_policy)  # 防止跑偏太远

loss = -(reward - beta * kl_penalty)  # beta 控制惩罚力度

这个过程就是"驯化"——模型不只是在学格式,而是在学"什么样的输出让人满意"。


四、三个阶段的对比

预训练SFTRLHF
目标学会语言学会格式学会讨好人类
数据数万亿 Token数万条标注对话数万条人工排序
方法下一个 Token 预测下一个 Token 预测强化学习(PPO)
计算量极大中等
产出Base ModelInstruct ModelChat Model

一个有趣的认知:预训练花了 99% 的算力,RLHF 只花了不到 1%,但 RLHF 决定了用户的直接体验。

GPT-3(Base Model)和 ChatGPT 架构几乎一样,差距主要来自 SFT 和 RLHF。


五、RLHF 之后的演进:DPO

RLHF 有个明显的缺点:流程复杂,需要单独训练 Reward Model,PPO 训练也不稳定。

2023 年有人提出了 DPO(Direct Preference Optimization) ,把 Reward Model 和强化学习这两步合并成一个简单的分类损失:

直接告诉模型"这个回答比那个好",模型自己调整参数,不需要显式的 Reward Model。

# DPO 损失(简化)
# chosen: 偏好回答, rejected: 不偏好回答
loss = -log_sigmoid(
    beta * (log_prob(chosen) - log_prob(rejected))
)

效果跟 RLHF 相当,但简单得多。现在很多开源模型的对齐训练都在用 DPO。


小结

大模型的训练不是一步,是三步:

预训练:在海量数据上学语言规律,产出 Base Model,只会续写,不会对话。

SFT:在少量标注数据上学对话格式,产出 Instruct Model,知道怎么回答问题。

RLHF:用人类偏好数据做强化学习,产出 Chat Model,知道什么叫"好的回答"。

颠覆一下认知:你每天用的 ChatGPT,它的"聪明"来自预训练,它的"好用"来自 RLHF——而 RLHF 用的算力,还不到整个训练的 1%。


下一篇,我们聊推理阶段:

模型训练好之后,生成一个 Token 到底发生了什么?KV Cache 为什么能让推理快几十倍?我带大家手撕KV cache!