模块 08 · 约 25 分钟 · "听话"的秘密

预训练 → SFT → RLHF:让模型"听话"

你跟 ChatGPT / Claude / Gemini 聊天,它们温和、有礼、会拒绝危险请求。这不是参数变多换来的 —— GPT-3(175B)刚出来时和 ChatGPT 一样大,但它非常"野"。把"野模型"变成"听话助手",靠的是这一节讲的三阶段训练

① 一个直观对比:同一个问题,三个阶段回答的差距

切换不同的问题,看一个模型在预训练 / SFT / RLHF 三个阶段会怎么回答。 三个阶段用的模型可能参数量完全一样,差距全在训练目标:

用户提问:
用户法国的首都是?
阶段 1:预训练(Base Model)只会"续写",不会"对话"
法国的首都是巴黎。法国的首都是巴黎。法国的首都是巴黎。 (基座模型会继续补完它在网上看到的"模式",可能复读、可能继续填本应是文章其他部分的内容。)
阶段 2:SFT(监督微调)学会"按指令回答",但还很机械
法国的首都是巴黎(Paris),位于法国北部,塞纳河流经市区。
阶段 3:RLHF(人类反馈强化学习)懂得拒绝、共情、详细解释
法国的首都是巴黎(Paris)。它位于法国北部塞纳河畔,是法国的政治、经济、文化中心,也是欧洲最大的都市圈之一。 如果你想了解更多(比如著名景点、历史、人口),可以告诉我。

三种回答的差距,不是模型变大了(参数量可能一样),而是训练目标不同导致的。 Base 学的是"续写互联网文本";SFT 学的是"按问答格式回答";RLHF 学的是"什么样的回答更被人类喜欢"。

关键观察:(1)Base 不"理解"你在跟它说话;(2)SFT 学会了对话格式但回答机械; (3)RLHF 多了"共情"、"主动拒绝"、"详细解释"这些人类偏好的特质。

② 阶段 1:预训练(Pretraining)

预训练就是上节讲的"大规模自回归语言建模":拿几 TB 的互联网文本(CommonCrawl + Wikipedia + Books + Code + ...), 训练目标只有一个:给定上文预测下一个 token

  • 数据:几 TB 的无标注原始文本。 GPT-3 用 ~570GB,LLaMA-2 用 ~5TB,Claude 3 估计 ~10TB+。
  • 目标L=ilogP(tit<i)\mathcal{L} = -\sum_i \log P(t_i \mid t_{<i})(交叉熵 loss)
  • 算力:GPT-3 训练用了 ~3640 PFLOP-days,相当于 1024 × A100 跑 ~30 天。
  • 输出:一个"LLM 基座(base model)"。 它什么都"知道",但它不会"对话" —— 你给它什么前缀它就续写什么。

关键认知:预训练教的是"世界知识 + 语言能力",不是"如何成为助手"。 基座模型见过维基百科,所以"知道"巴黎是法国首都;但你问它"法国的首都是?"它可能续写成一篇地理博客的开头,而不是直接回答 —— 因为它在互联网上见过的"问题—回答"格式远远少于"问题—讨论 / 复读 / 标题"等噪音。

③ 阶段 2:SFT(监督微调)—— 教模型"按问答格式回答"

SFT = Supervised Fine-Tuning。在基座模型上继续训练,但用精挑细选的"指令—回答"对话格式数据:

### 用户:写一封请假邮件给我老板,理由是发烧 38.5 度。
### 助手:尊敬的 X 总,您好:
  由于今天早上发烧到 38.5 度...

训练目标和预训练完全一样—— 还是 next-token prediction,还是交叉熵。 但数据从"互联网原汁原味文本"换成"人工编写的优质对话",模型就学会了:

  • 遇到 ### 用户:... 时,应该跟 ### 助手: + 实际回答
  • 回答要直接、有条理、按用户的请求格式来
  • 不要继续续写其他无关内容

SFT 数据规模通常是 1 万 ~ 10 万条,远比预训练(万亿 token)少,但质量要求极高。 Anthropic、OpenAI 都雇了几百人专门写、审核、改这些对话样本。

python
直接编辑这段代码即可。输入 np. 看自动提示,⌘/Ctrl + Enter运行。

④ SFT 之后还差什么?

SFT 模型已经"会对话"了,但还有问题:

  • 回答机械、缺乏共情 —— 因为标注员只能写"对的"回答,没法精确表达"好的"回答
  • 很难拒绝危险请求 —— SFT 数据里"如何回答 X"清晰,但"什么时候不要回答 X"难以穷举
  • 有些回答虽然格式对、内容不一定有用 —— 模型不知道哪种风格人类更喜欢

要解决这些,就需要给模型一个更高维度的反馈信号:不仅告诉它"这样答对了", 还要告诉它"两个都对的回答里,哪个更好"。这就是 RLHF。

⑤ 阶段 3:RLHF(人类反馈强化学习)

RLHF 是 InstructGPT 论文(OpenAI 2022)公开的方案,三步走:

5.1 收集偏好数据

对每个 prompt,让 SFT 模型生成 2~4 个候选回答,让标注员排序谁更好:

prompt: "今天心情不好"
A: "听你这么说,挺为你担心的..."   ← 标注:1st 喜欢
B: "心情不好就别问我了。"     ← 标注:2nd

5.2 训练奖励模型(Reward Model)

把上面的偏好数据训成一个奖励模型:输入 (prompt, response),输出一个标量分数 r。 训练目标是"被偏好的回答分数 > 被拒绝的回答分数":

LRM=logσ(rchosenrrejected)\mathcal{L}_{RM} = -\log \sigma(r_{\text{chosen}} - r_{\text{rejected}})
↓ 对应的 Python 实现(可以直接改、直接运行)

跑一下:

python
直接编辑这段代码即可。输入 np. 看自动提示,⌘/Ctrl + Enter运行。

5.3 用 PPO 优化 SFT 模型

最后一步:把 SFT 模型当作"策略 π",让它生成回答,RM 打分PPO 强化学习更新 π, 让 π 越来越倾向输出 RM 打分高的回答。

maxπ  ExD,yπ(x)[r(x,y)βKL(ππSFT)]\max_{\pi} \; \mathbb{E}_{x \sim D, y \sim \pi(\cdot|x)} \big[ r(x, y) - \beta \, \mathrm{KL}(\pi \| \pi_{\text{SFT}}) \big]
↓ 对应的 Python 实现(可以直接改、直接运行)
python
直接编辑这段代码即可。输入 np. 看自动提示,⌘/Ctrl + Enter运行。

PPO(Proximal Policy Optimization)是 OpenAI 2017 提出的强化学习算法, 核心是"每步只走一小步,clip 掉太大的更新"。RLHF 用 PPO 而不是 SGD,因为它在不稳定的奖励信号下更鲁棒。

⑥ 三阶段一张图概览

阶段数据目标规模
预训练几 TB 原始文本学语言 + 世界知识~10⁻¹² token
SFT人工编写的对话样本学对话格式~1万-10万条
RLHF人工偏好排序 → 奖励模型 → PPO学"人类喜好"~10万-100万 偏好对

⑦ 现代变体:DPO、Constitutional AI、RLAIF

RLHF 在 2024–2025 出现了几个简化方案:

  • DPO(Direct Preference Optimization, 2023):跳过显式训奖励模型, 直接用偏好数据优化策略。数学上等价于"RM + PPO",但代码简单 50 倍,已经成为开源社区主流。
  • Constitutional AI(Anthropic 2022):Claude 用的方法, 用一份"宪法"(一组原则)让模型自己批评、自己改进自己的回答,减少对人类标注的依赖。
  • RLAIF(RL from AI Feedback):用一个强模型当"标注员",给弱模型的输出打分。 比 RLHF 便宜得多,效果接近。

⑧ 一个常见误区

听到"RLHF 是 ChatGPT 的核心"很容易以为它"教会了模型新知识"。不是。 RLHF 只是把"已经存在但被压抑的能力"解锁出来。 基座模型本就能回答你的问题(它见过几乎一切),只是不知道"应该回答"。 SFT + RLHF 不教知识,只教"什么时候、用什么风格去用知识"。

这也是为什么开源社区只要拿 LLaMA-2 base + 几万条 SFT 数据,就能做出表现接近 ChatGPT 的助手 —— 知识早就在那了。

⑨ 小测验

Q1.为什么"基座模型(Base Model)"在没经过 SFT 之前,你问它问题它会瞎续写?
Q2.RLHF(人类反馈强化学习)的三步,正确顺序是哪个?

⑩ 延伸阅读