RLHFReinforcement Learning from Human Feedback
PPO 学会了优化"奖励",但谁来定义奖励?RLHF 的答案:人类。把"哪个回答更好"的偏好对喂给一个奖励模型,再用 PPO 优化策略去迎合奖励模型——ChatGPT 与 Claude 的对齐秘密就在这三步里。
奖励模型训练 · 人类偏好对
哪个回答更好?点选你的偏好(扮演人类标注员)
你的每一次点击都生成一条偏好对 (a, b, 胜者)。奖励模型用 Bradley-Terry 目标学习:给胜者高分、败者低分。一致率 = 最近 20 条中奖励模型的判断与你的选择一致的占比。
PPO × 奖励模型 · 三模型闭环
三模型流程示意:策略被训练、奖励模型冻结、参考模型 π_ref 提供 KL 约束(防止策略走极端)。本演示聚焦"策略 vs 奖励模型"。
策略只为迎合"奖励模型",不会直接看到真实偏好。当奖励模型忠实于人类,两者同步上升;当奖励模型有偏差,策略会找到它的漏洞——RM 分数越涨越高,真实偏好分数却一路走低。这就是 reward hacking。
11.1 语言模型为什么需要对齐
预训练的语言模型博学但不「听话」:它会续写、会编造、偶尔还会说出有害的内容。RLHF 的思路是:让人类对「哪个回答更好」做选择题,训练一个奖励模型学会这种偏好,再用上一章的 PPO 去优化语言模型迎合它。这就是 ChatGPT 变得「有用、诚实、无害」的核心技术 —— 也会看到它失控的一面:reward hacking。
下一步预告:把 DQN、PPO、奖励模型的知识组装起来,做一次完整的智能体训练收官实战。
📌 发生了什么
- 偏好对 (y_w, y_l) 只给"谁更好",不给分数——人类擅长排序
- Bradley-Terry 把偏好对变成可微的打分函数(奖励模型)
- PPO 用奖励模型分数当奖励优化策略,KL 约束防偏离参考模型
- 奖励模型有偏差时策略会"钻空子"——reward hacking
⚠️ 常见陷阱
- 误以为 RM 分数=真实偏好——RM 只是代理,总有偏差与盲区
- RLHF 阶段不做 KL 约束——策略会走极端,输出重复/空洞文本
- 偏好对太少或标注噪声大——RM 学错方向,对齐跟着错
✅ 本章小结
- RLHF = 偏好数据 → 奖励模型 → PPO 优化 + KL 约束
- 奖励模型质量决定对齐上限;策略只是"迎合奖励"的放大器
- reward hacking 不可避免,只能缓解(数据质量、KL、人类校准)
11.2 奖励模型:把偏好对变成打分
假设存在一个潜在的"真实偏好强度" r(x)(人类对回答 x 的喜爱程度)。人类在两个回答间选择时,偏好 a 而非 b 的概率正比于指数强度差——这是 Bradley-Terry 模型的假设。
奖励模型 r_φ 就是用神经网络参数化的打分函数。对每条标注 (x, y_w, y_l)(w=胜者,l=败者),最大似然即最小化胜者负对数几率——胜者分数被推高、败者分数被压低,差得越大损失越小。
11.3 KL 约束:别离参考模型太远
RLHF 的 RL 阶段把 RM 分数当奖励:策略 π_θ 生成回答 y,得到分数 r_φ(x,y)。为防止策略只刷分、输出与人类常识脱节的文本,加入 KL 约束——策略不能离"参考模型"(SFT 模型)太远,β 控制偏离的代价。
11.4 逐 token 奖励:PPO 原样登场
实际实现中,KL 项可近似为逐 token 的即时奖励 r_t = r_φ(x, y_≤t) − β·log(π_θ/π_ref),再交给 PPO 的标准 pipeline(GAE + 裁剪目标)优化——你上一章学的 PPO 在这里原样登场。
11.5 RLHF 关键超参
RLHF 的多数"翻车"都能追溯到这几处旋钮。
| 超参 | 表现 | 结果 |
|---|---|---|
| 偏好对太少(< 1k) | RM 只覆盖少量风格 | 外推错误 + 被攻击 |
| 标注一致率 ~70-80% | 人类本身有噪声 | 论文常见区间 |
| β 太小(< 0.01) | KL 约束形同虚设 | 策略走极端 / 重复文本 |
| β 适中(0.01~0.1) | 贴合 RM 又不失控 | 推荐 |
💡 经验法则:先保证 RM 在留出集上的偏好一致率(> 70%),再调 RL 阶段的 β;一旦发现策略输出开始退化,优先加大 β,而不是减少训练步数。
11.6 三阶段核心循环走读
SFT → 奖励模型 → PPO(Python),每一阶段都复用你已学过的组件。
# 阶段一:监督微调(SFT,略)
# 阶段二:训练奖励模型 r_phi —— 偏好对最大似然
for (x, y_w, y_l) in preference_dataset:
r_w, r_l = reward_model(x, y_w), reward_model(x, y_l)
loss = -log(sigmoid(r_w - r_l)) # Bradley-Terry
reward_model.step(loss)
# 阶段三:RL —— PPO 以 r_phi 分数为奖励,KL 约束
for rollout in range(epochs):
for x in prompts:
y = policy.sample(x)
r = reward_model(x, y) # 冻结的 RM 打分
kl = beta * log(policy(x, y) / ref(x, y)) # 参考模型约束
advantage = gae(r - kl, gamma, lam) # 上一章的 GAE
policy.step(clipped_objective(advantage))
📚 参考文献与延伸阅读
- Christiano, P. et al. (2017), Deep Reinforcement Learning from Human Preferences, NeurIPS — 用人类偏好训练奖励模型的开山之作
- Ouyang, L. et al. (2022), Training Language Models to Follow Instructions with Human Feedback (InstructGPT), NeurIPS — RLHF 三阶段流程的经典范式
- Touvron, H. et al. (2023), Llama 2: Open Foundation and Fine-Tuned Chat Models, arXiv:2307.09288 — 开源界 RLHF 完整细节(含 reward model 数据分布与拒绝采样)
- Hugging Face: Illustrating RLHF — 从数学到工程的 RLHF 图解
📝 课后练习
检验你的理解——答对为止