RLHFReinforcement Learning from Human Feedback
PPO 学会了优化"奖励",但谁来定义奖励?RLHF 的答案:人类。把"哪个回答更好"的偏好对喂给一个奖励模型,再用 PPO 优化策略去迎合奖励模型——ChatGPT 与 Claude 的对齐秘密就在这三步里。
奖励模型训练 · 人类偏好对
哪个回答更好?点选你的偏好(扮演人类标注员)
你的每一次点击都生成一条偏好对 (a, b, 胜者)。奖励模型用 Bradley-Terry 目标学习:给胜者高分、败者低分。一致率 = 最近 20 条中奖励模型的判断与你的选择一致的占比。
PPO × 奖励模型 · 三模型闭环
三模型流程示意:策略被训练、奖励模型冻结、参考模型 π_ref 提供 KL 约束(防止策略走极端)。本演示聚焦"策略 vs 奖励模型"。
策略只为迎合"奖励模型",不会直接看到真实偏好。当奖励模型忠实于人类,两者同步上升;当奖励模型有偏差,策略会找到它的漏洞——RM 分数越涨越高,真实偏好分数却一路走低。这就是 reward hacking。
为什么学这步?
大模型能背下海量文本,但"说什么话对人类有帮助、有礼貌、不有害"——这是意图与价值观问题,靠预测下一个 token 学不出来。RLHF 用人类反馈把模型的输出"对齐"到人类偏好上,是 ChatGPT、Claude、Llama 3 等大模型训练的最后一步关键工序,也是强化学习在真实世界最有影响力的应用。
下一步预告:把 DQN、PPO、奖励模型的知识组装起来,做一次完整的智能体训练收官实战。
📌 发生了什么
- 偏好对 (y_w, y_l) 只给"谁更好",不给分数——人类擅长排序
- Bradley-Terry 把偏好对变成可微的打分函数(奖励模型)
- PPO 用奖励模型分数当奖励优化策略,KL 约束防偏离参考模型
- 奖励模型有偏差时策略会"钻空子"——reward hacking
⚠️ 常见陷阱
- 误以为 RM 分数=真实偏好——RM 只是代理,总有偏差与盲区
- RLHF 阶段不做 KL 约束——策略会走极端,输出重复/空洞文本
- 偏好对太少或标注噪声大——RM 学错方向,对齐跟着错
✅ 本章小结
- RLHF = 偏好数据 → 奖励模型 → PPO 优化 + KL 约束
- 奖励模型质量决定对齐上限;策略只是"迎合奖励"的放大器
- reward hacking 不可避免,只能缓解(数据质量、KL、人类校准)
📐 Bradley-Terry 推导:偏好对 → 打分函数
假设存在一个潜在的"真实偏好强度" r(x)(人类对回答 x 的喜爱程度)。人类在两个回答间选择时,偏好 a 而非 b 的概率正比于指数强度差——这是 Bradley-Terry 模型的假设。
奖励模型 r_φ 就是用神经网络参数化的打分函数。对每条标注 (x, y_w, y_l)(w=胜者,l=败者),最大似然即最小化胜者负对数几率——胜者分数被推高、败者分数被压低,差得越大损失越小。
RLHF 的 RL 阶段把 RM 分数当奖励:策略 π_θ 生成回答 y,得到分数 r_φ(x,y)。为防止策略只刷分、输出与人类常识脱节的文本,加入 KL 约束——策略不能离"参考模型"(SFT 模型)太远,β 控制偏离的代价。
实际实现中,KL 项可近似为逐 token 的即时奖励 r_t = r_φ(x, y_≤t) − β·log(π_θ/π_ref),再交给 PPO 的标准 pipeline(GAE + 裁剪目标)优化——你上一章学的 PPO 在这里原样登场。
🎛 RLHF 关键超参对比
RLHF 的多数"翻车"都能追溯到这几处旋钮。
| 超参 | 表现 | 结果 |
|---|---|---|
| 偏好对太少(< 1k) | RM 只覆盖少量风格 | 外推错误 + 被攻击 |
| 标注一致率 ~70-80% | 人类本身有噪声 | 论文常见区间 |
| β 太小(< 0.01) | KL 约束形同虚设 | 策略走极端 / 重复文本 |
| β 适中(0.01~0.1) | 贴合 RM 又不失控 | 推荐 |
💡 经验法则:先保证 RM 在留出集上的偏好一致率(> 70%),再调 RL 阶段的 β;一旦发现策略输出开始退化,优先加大 β,而不是减少训练步数。
💻 RLHF 三阶段核心循环
SFT → 奖励模型 → PPO,每一阶段都复用你已学过的组件。
# 阶段一:监督微调(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 图解
📝 课后练习
检验你的理解——答对为止