第 30 天 · 不写奖励函数,让人挑哪段录像更好
一句话
Christiano 等人让人类只比较两段 1–2 秒的智能体录像,用这些偏好训练奖励模型,再用强化学习优化这个奖励。人类反馈不到交互量的 1%,就能解决 Atari 和 MuJoCo 任务,还教会了机器人后空翻。
论文讲了什么
强化学习需要奖励函数,但很多目标写不出奖励。“做一个漂亮的后空翻”该怎么打分?手写的奖励容易被智能体钻空子,让人给每一步打分又太贵。这篇论文提出第三条路:人只做比较,奖励函数由模型学出来。
系统由 3 个异步运行的过程组成:
- 策略在环境中行动,并用当前奖励模型给出的奖励做强化学习。Atari 任务用 A2C,MuJoCo 任务用 TRPO。
- 标注者观看两段 1–2 秒的轨迹片段,选出更好的一段。标注者也可以选“一样好”或“无法比较”,后者不进入训练数据。
- 奖励模型用这些比较结果做监督学习。
奖励模型用 Bradley-Terry 模型把奖励和偏好连起来。片段 σ1 胜过 σ2 的概率是:
P(σ1 ≻ σ2) = exp(Σ r̂(σ1)) / (exp(Σ r̂(σ1)) + exp(Σ r̂(σ2)))
训练时对人的选择最小化交叉熵。论文还加了 3 个工程设计:
- 训练 3 个奖励模型组成集成(ensemble),每个模型单独归一化后再取平均。
- 假设标注者有 10% 的概率随机作答,让模型容忍标注错误。
- 优先询问集成成员分歧最大的片段对,用更少的标注获得更多信息。
关键结果有 5 条:
- MuJoCo:在 8 个模拟机器人任务上,700 次真人比较就接近用真实奖励训练的强化学习。
- Atari:在 7 个游戏上使用 5,500 次比较。BeamRider 和 Pong 接近真实奖励的效果。在 Enduro 上,标注者会奖励“正在超车”的进展,结果超过了用真实奖励训练的 A3C。
- 新行为:Hopper 机器人用 900 次比较、不到 1 小时人类时间学会连续后空翻。Half-Cheetah 用 800 次比较学会单腿前进。
- 成本:人类反馈不到智能体交互的 1%。每组真人实验需要 30 分钟到 5 小时人类时间。
- 必须在线标注:只在训练开始时收集标注,奖励模型只学到真实目标的一部分。在 Pong 中,这样训练的智能体学会了不丢分,却不去得分,打出极长的来回。
关键概念
- 奖励模型(Reward model)
- 输入观测和动作(后来是文本),输出一个标量奖励的网络。它从人类比较中学出来,代替手写奖励函数,供强化学习优化。
- Bradley-Terry 模型(Bradley–Terry model)
- 把两项比较的胜率写成 <code>P(A 胜) = e^a / (e^a + e^b)</code>,a 和 b 是两项的得分。它把“哪个更好”的数据变成可微的交叉熵损失。
- 成对偏好(Pairwise preference)
- 标注者只判断两段片段哪段更好,不给绝对分数。人做比较判断比打分更一致,也不需要事先统一评分尺度。
- 主动查询(Active query selection)
- 优先把奖励模型最不确定的片段对交给人标注。论文用集成成员预测结果的方差近似不确定性,并承认这只是粗略近似。
- 奖励钻空子(Reward hacking)
- 策略找到让学到的奖励很高、真实目标却没达成的行为。奖励模型只在见过的状态上可靠,策略一旦进入新区域,奖励就可能失真。
- 非平稳奖励(Non-stationary reward)
- 奖励模型在训练中持续更新,同一个行为的奖励会变化。论文因此选用对奖励变化较稳健的策略梯度方法,并在训练全程持续收集标注。
历史位置:为什么值得读
这篇论文是 OpenAI 与 DeepMind 的合作。第一作者 Paul Christiano 和末位作者 Dario Amodei 当时在 OpenAI,Jan Leike 和 Shane Legg(第 27 天的作者)在 DeepMind。作者关心的不是 Atari 分数,而是 AI 安全:目标复杂到写不成公式时,怎样让系统做人真正想要的事。
从偏好中学习并不是新想法。此前已有基于偏好的强化学习研究,但大多用于低维任务和简单的奖励形式。本文的贡献是把它扩展到深度强化学习,并把人类时间压到 1 小时左右。
此后的路线很清晰:
- 2019 年,Ziegler 等人把方法用到 GPT-2 的文本续写和摘要任务上。
- 2020 年,Stiennon 等人用人类反馈训练摘要模型,人类评估结果超过监督微调。
- 2022 年,InstructGPT 把“监督微调、奖励模型、PPO”3 步做成标准流程。在人类评估中,13 亿参数的 InstructGPT 胜过 1750 亿参数的 GPT-3。同年 ChatGPT 发布。
在清单里,本篇是终点站。第 25 天解释了怎样把预训练模型做大,第 29 天的 PPO 提供优化器,本篇提供把模型对齐到人类意图的方法。
学前准备
- 先看第 29 天,理解 PPO 或至少一种策略梯度算法
- 懂二分类交叉熵和 logistic 函数
- 会用 PyTorch 训练一个小型回归网络
- 知道奖励函数在强化学习训练中起什么作用
在原仓库怎么学
仓库用模拟标注者代替真人,对应论文里的合成标注实验。
- README.md:看本日的内容安排和文件清单。
- setup.py:运行它,检查依赖和实现是否可用。
- implementation.py:按顺序读 5 个部分。RewardModel 输出标量奖励。compute_preference_loss 实现 Bradley-Terry 交叉熵。SyntheticOracle 用真实奖励模拟标注者。PPOAgent 是策略。RLHF_Trainer 把整个循环串起来。
- data/README.md:了解偏好数据怎样在 CartPole-v1 上在线生成,本日不需要下载数据集。
- train_minimal.py:运行完整循环:采集片段、模拟标注、训练奖励模型、更新策略。可以用 --pairs、--segment_len、--rm_epochs、--ppo_epochs 参数调节规模。
- visualization.py:对比真实奖励与学到的奖励随训练的变化,并画奖励模型与模拟标注者的一致率。
- notebook.ipynb:在笔记本里逐步运行上面的流程。
- exercises/:做 5 个练习,依次是 Bradley-Terry 模型、偏好损失、奖励归一化、模拟标注者、完整 RLHF 循环。答案在 exercises/solutions/。
今天再看
这篇论文的框架几乎原样进入了每一个聊天模型。2026 年回看,有 3 个变化:
- 标注者从人变成 AI:Anthropic 2022 年提出的 Constitutional AI 让模型按一组书面原则做比较,即 RLAIF,大幅减少了人工标注。
- 奖励模型可以省掉:DPO 证明 Bradley-Terry 偏好目标可以直接改写成策略的损失,不必单独训练奖励模型,也不必运行 PPO。
- 可验证奖励兴起:数学和代码任务可以用答案对错当奖励。偏好学习主要留给有用性、无害性、写作风格这类主观目标。
论文担心的核心问题仍未解决。Gao 等人 2022 年发现,策略对奖励模型优化得越狠,真实质量先升后降,这叫奖励模型过度优化。论文里 Pong 智能体“只防守、不进攻”的现象,就是这个问题的早期版本。
容易卡住的地方
- 把偏好当成分数回归:奖励模型只从两段奖励的差值中学习,所有奖励加同一个常数不改变损失。奖励的绝对值没有意义,交给策略之前要先归一化。
- 片段长度不固定:Bradley-Terry 公式对片段内每一步的奖励求和。片段长度不同时,长片段的总和天然更大。实现时要固定片段长度,与论文保持一致。
- 只在开头收集标注:离线训练的奖励模型会被策略钻空子。要在整个训练过程中持续采集新片段并标注,让奖励模型覆盖策略新到达的状态。
- 模拟标注者太完美:用真实奖励模拟人,会高估方法的效果。可以在 SyntheticOracle 里以 10% 的概率翻转标签,观察奖励模型准确率的变化。
延伸阅读
- 原论文:Deep Reinforcement Learning from Human Preferences
- 原仓库第 30 天目录:30_RLHF/ —— 代码、笔记本、练习与答案(英文)
- Training language models to follow instructions with human feedback(InstructGPT) —— 把本方法用到语言模型的标准流程
- Fine-Tuning Language Models from Human Preferences —— 首次把偏好学习用到 GPT-2
- Direct Preference Optimization —— 不训练奖励模型的偏好优化
- Scaling Laws for Reward Model Overoptimization —— 奖励模型被过度优化的规律