跳到主要内容

策略梯度 — 从 REINFORCE 到 PPO

这一章讲三件事: 「拿奖励当权重(即每个字的重要度)调概率」这个最朴素的想法(策略梯度) 怎么从数学上立住;它的估计为什么天生抖、baseline 怎么止痛; PPO 的 clip 到底在防什么——六种情况逐一走查。这是原书最重的一章, 我们拆成两半:本章管「策略梯度和 PPO」,下一章管 GRPO 之后的世界。

1. 这一章讲什么

奖励模型给一条回答打了个分(比如 3.0)。怎么把这个分数换算成模型参数的调整? 这就是 RLHF 第三步的全部内容,而所有主流答案都属于一个家族:策略梯度 (policy gradient)算法——用「按好坏加权地调整概率」直接估出梯度1

本章的主线是一条退化链:朴素策略梯度 → REINFORCE(加上 baseline)→ RLOO (baseline 换成同伴平均)→ PPO(再加一条安全带)。后一个都是前一个的小改, 认清楚这一点,后面满天飞的算法缩写就不再吓人。

2. 顶层全景与主走查

主走查:一个 prompt 采样出两条回答,奖励模型分别打 3.0 分1.0 分。 贯穿全章的问题是:这组数怎么变成参数更新2?

prompt:「解释一下机会成本」
├─ 回答 A:3.0 分
└─ 回答 B:1.0 分

第 1 步 找 baseline(基准线):两条的平均 = 2.0
第 2 步 算优势(advantage):
A:3.0 − 2.0 = +1.0 → 「比预期好」,调高 A 里每个字的概率
B:1.0 − 2.0 = −1.0 → 「比预期差」,调低 B 里每个字的概率
第 3 步 每个字的损失 = −优势 × 概率比
A 的字:损失为负 → 最小化损失 = 推高概率
B 的字:损失为正 → 推低概率
第 4 步 (PPO 才有)概率比出界时按 clip 封顶,见第 4 节

图说:基线 2.0、优势 ±1.0 的走法是「组内平均 baseline」的编会示范;
「两条回答得 3.0/1.0 分」这一形状来自书里的代码示例。

每个机制都会在这条走查上占一步:第 3 节讲第 2 步(baseline 与优势), 第 4 节讲第 4 步(clip 的六种情况)。

3. 核心原理

3.1 策略梯度:推导到最后只剩一句话

书里完整走了一遍推导,值得复述它的骨架,因为每一步都在扔东西3:

  1. 目标:让期望奖励最大。期望是对「所有可能的回答序列」取的;
  2. 对模型参数求梯度时,用「先取对数(把连乘变成连加的数学操作)再求导」的技巧把梯度挪进期望内部;
  3. 展开序列概率的 log:prompt 的分布项、环境转移项——都不含模型参数,全部消掉;
  4. 剩下的只有:

梯度 = 期望[ 奖励(或优势)× ∇log(模型输出这条回答的概率) ]

翻成大白话:一条回答里的每个字,按「这条回答比预期好多少」加权,好的推高、 差的压低。没有反向传播穿越环境、没有对奖励求导——奖励只是一个乘在旁边的数。

书里还给了这个「旁边的数」的六种选法(总奖励、后续奖励、减 baseline 的版本、 Q 函数、优势函数、TD 残差(残差=实际结果与预测的差)),并点明优势函数是其中最好的一种。

好在哪:优势函数是理论上方差(衡量抖动大小的量)最低的选法4。语言模型场景下的优势有个特别的形状:整条回答只拿一个分时, 「回答的奖励 − 这个 prompt 本身的价值」就是可用的优势5

3.2 高方差与 baseline:止痛药

朴素策略梯度有个大毛病:。原因有三层:采样条数少;模型生成时温度高,输出 本来就散;奖励稀疏(得分大多是 0、很少非零)时,估计的波动更剧烈6

解法就是主走查第 2 步的 baseline:不拿原始奖励当权重,拿「减去基准之后的好坏」。 书里的口径很实在:哪怕是批内平均、滑动平均这种最简单的 baseline,也足以 把梯度的系统性偏移去掉,学习信号立刻干净很多7。baseline 好比给分数 除掉「这批题普遍给分松」的水位—— absolute 分数没有意义,「比同批平均好多少」 才有意义。

RLOO(REINFORCE Leave One Out)把这一步推到干净的形式:每条回答的 baseline = 同一 prompt 下其他回答的平均分(「留一」= 计算某条的基准时把它自己排除, 免得自己拖高自己的基准)8。它不需要任何额外的模型,是「免费」的 baseline。

3.3 PPO:给更新装一条安全带

RLOO/PPO 这类算法还有一个共同的前置步骤:理论上梯度要在「生成数据的那个模型」 下取;实践里我们想在同一批数据上多走几步梯度——模型已经偏离了数据。校正这个 偏差的乘子是概率比:新模型给这条回答的概率 ÷ 旧模型给的概率9。第一批 梯度时比值恰为 1;走得越远,比值离 1 越远。

比值离 1 太远,说明一步迈太大会翻车。PPO 的全部智慧就是把比值夹在 [1−ε, 1+ε] 区间里(ε 通常 0.2):目标函数取「夹之前」与「夹之后」两者中 更悲观的那个——等价于永远选更小的更新步子10

六种情况走查完,这个设计才真正立体(比值记 r,优势记 A;数值为演示编的)11:

情况A > 0(想推高)A < 0(想压低)
r < 1−ε(如 0.8)正常梯度:推高不更新(已经压够了,再压就是过度矫正)
r 在界内(如 1.1)正常梯度:继续推高正常梯度:继续压低
r > 1+ε(如 1.3)不更新(已经推够了,防过推)正常梯度:压低

对称性一目了然:只在「你想推但还没推够」或「你想压但还没压够」时给力; 一旦越界,梯度直接归零。这就是书里反复强调的那句话的完整含义——信任区 (trust region,信任步子不会失控的那一段)之内,PPO 就是一般的策略梯度; 信任区之外,目标函数是平的,推不动12

PPO 还有一件 RLOO 没有的行李:一个学出来的价值函数(额外一份模型,逐 token 预测「从这里往后还能拿多少分」),充当更精细的 baseline13。学它的目标可以 用蒙特卡洛回报,也可以用下一章的 GAE。价值函数让 PPO 有了 token 级的信用分配, 代价是显存(模型训练时放数据的内存)里多养一份模型——这个代价正是下一章 GRPO 存在的理由。

3.4 实现里最容易被忽略的两件事

书里的实现章点了两处要害。其一,「old logprobs」是采样那一刻的策略, 而参考模型(reference policy)只用于 KL 惩罚——两个「旧」不是一回事,混了 就出 bug14。其二,如果每批数据只走一步梯度,概率比恒等于 1,clip 逻辑 整段删除,算法退化成 REINFORCE 加 KL——这不是理论游戏,「每批一步」恰恰是 语言模型实践的常态(下一章末尾展开)15

4. 作者的判断与证据

书里有证据的部分:REINFORCE 的三件套拆解出自 1992 年的原始论文(书里还考证 REINFORCE 大概是个硬凑的缩写:「REward Increment = Nonnegative Factor × Offset Reinforcement × Characteristic Eligibility」)16;PPO 六情况的分析与「信任区 来自 TRPO 一系」都有出处。书里给判断的部分:作者强调这些算法**「可以互相改装」** ——RLOO 的优势配上 PPO 的 clip 也完全成立——算法之间的界限比论文标题暗示的 模糊得多17

判断(我们的,不是书里的): 这一章最值得带走的不是某个算法,而是一张 「症状→药」对照表:估计抖 → baseline;一步太大 → clip;信用分配粗 → 价值函数。 后面所有新算法(GSPO/CISPO/DAPO)全是这张表上的新药,没有第三种病。 如果错,会错在: 如果出现了不属于这三种症状的新失败模式(比如奖励本身 系统性错位,那是第 14 章的 Goodhart 问题,不是训练方法(行话叫优化器)的问题),把它们硬塞进 这张表会开错药。

5. 边界与局限

  • 推导假设「从当前策略采样」(on-policy);实践中「完全同步」做不到,所有真实 系统都轻微违反理论前提——书里直说「设计给什么有效,而不是什么优雅」18;
  • 优势函数「理论方差最低」的前提是它算得准;语言模型上算准优势恰恰是最难的 (GAE,下一章);
  • 本章不覆盖价值函数的具体学法(GAE 在下一章)和多机不同步(行话叫异步)带来的偏差(下一章)。

6. 可带走的

  1. 策略梯度 = 按好坏加权调概率,推导中环境和 prompt 的项全部消掉,只剩 ∇log 概率;
  2. 高方差是天性:baseline 是第一止痛药,RLOO 是它的免模型版;
  3. 概率比 = 新旧模型给同一条回答的概率之比;第一批梯度时恒为 1;
  4. PPO 的 clip 只在一件事上花钱:防止单步更新过猛;六种情况背不下, 记住「推够/压够就撒手」;
  5. 信任区内 PPO ≈ 朴素策略梯度——clip 不是算法的灵魂,是安全带;
  6. PPO 的行李 = 价值函数(逐 token 基线)+ 两个 loss;RLOO 没有这份行李;
  7. 「old 策略」与「参考策略」是两个东西,前者管概率比,后者管 KL;
  8. 每批一步梯度时,clip 永不触发——实践中的 PPO 往往就是 REINFORCE

7. 原文地图

主题原书章原文位置
RLHF 训练环与 on-policyThis chapter covers(第 6 章导语)text/09-fm-this-chapter-covers.txt:24(搜「slowly updates」) · text/09-fm-this-chapter-covers.txt:24(搜「on-policy data」)
三主角与记号This chapter covers(第 6 章导语)text/09-fm-this-chapter-covers.txt:30(搜「policy-gradient reinforcement learning」) · text/09-fm-this-chapter-covers.txt:55(搜「single action」)
策略梯度推导This chapter covers(第 6 章导语)text/09-fm-this-chapter-covers.txt:225(搜「log-derivative trick」) · text/09-fm-this-chapter-covers.txt:281(搜「only survives」) · text/09-fm-this-chapter-covers.txt:311(搜「taxonomy adopted」)
优势方差最低This chapter covers(第 6 章导语)text/09-fm-this-chapter-covers.txt:329(搜「lowest possible theoretical variance」)
高方差与 baseline6.1.1 Vanilla Policy Gradienttext/10-ch06-01-6-1-1-vanilla-policy-gradient.txt:20(搜「high variance」) · text/10-ch06-01-6-1-1-vanilla-policy-gradient.txt:20(搜「de-bias the gradients」)
REINFORCE 三件套6.1.2 REINFORCEtext/11-ch06-01-6-1-2-reinforce.txt:13(搜「REward Increment」) · text/11-ch06-01-6-1-2-reinforce.txt:75(搜「Monte Carlo estimator」)
RLOO6.1.3 REINFORCE Leave One Out (RLOO)text/12-ch06-01-6-1-3-reinforce-leave-one-out-rloo.txt:7(搜「leave one out」) · text/12-ch06-01-6-1-3-reinforce-leave-one-out-rloo.txt:58(搜「turning them off entirely」)
广播 vs 逐 token6.1.3 REINFORCE Leave One Out (RLOO)text/12-ch06-01-6-1-3-reinforce-leave-one-out-rloo.txt:64(搜「broadcast to all tokens」)
PPO 目标与 importance sampling6.1.4 Proximal Policy Optimization (PPO)text/13-ch06-01-6-1-4-proximal-policy-optimization-ppo.txt:20(搜「importance sampling」) · text/13-ch06-01-6-1-4-proximal-policy-optimization-ppo.txt:32(搜「destructively large」)
六种情况与信任区6.1.4 Proximal Policy Optimization (PPO)text/13-ch06-01-6-1-4-proximal-policy-optimization-ppo.txt:113(搜「trust region」) · text/13-ch06-01-6-1-4-proximal-policy-optimization-ppo.txt:227(搜「over-reinforce」) · text/13-ch06-01-6-1-4-proximal-policy-optimization-ppo.txt:321(搜「over-suppress」)
价值函数与两个 loss6.1.4 Proximal Policy Optimization (PPO)text/13-ch06-01-6-1-4-proximal-policy-optimization-ppo.txt:338(搜「learned baseline」) · text/13-ch06-01-6-1-4-proximal-policy-optimization-ppo.txt:344(搜「two losses」)
每批 1–4 步6.1.4 Proximal Policy Optimization (PPO)text/13-ch06-01-6-1-4-proximal-policy-optimization-ppo.txt:95(搜「1-4 gradient steps」)
最简实现与三 case6.2.1 Policy Gradient Basicstext/18-ch06-02-6-2-1-policy-gradient-basics.txt:14(搜「pg_loss」)
PPO 代码与「悲观」6.2.4 Proximal Policy Optimizationtext/21-ch06-02-6-2-4-proximal-policy-optimization.txt:91(搜「pessimistic」) · text/21-ch06-02-6-2-4-proximal-policy-optimization.txt:13(搜「only used for the KL」)
一批一步的退化6.2.4 Proximal Policy Optimizationtext/21-ch06-02-6-2-4-proximal-policy-optimization.txt:109(搜「1 gradient step」)

Footnotes

  1. 出处:「6.1.1 Vanilla Policy Gradient」第 7 段(text/10-ch06-01-6-1-1-vanilla-policy-gradient.txt:7,搜「differentiating with respect to the policy parameters」)与第 6 章导语第 30 段(text/09-fm-this-chapter-covers.txt:30,搜「policy-gradient」)。

  2. 出处:「6.2.2 Loss Aggregation」第 255 段(text/19-ch06-02-6-2-2-loss-aggregation.txt:255,搜「reward = torch.tensor([3.0, 1.0])」)。代码示例用两条回答 3.0/1.0 的奖励演示序列级优势;组内平均 baseline 的走法同样是该示例的形状。

  3. 出处:第 6 章导语第 225 段(text/09-fm-this-chapter-covers.txt:225,搜「log-derivative trick」)与第 281 段(text/09-fm-this-chapter-covers.txt:281,搜「only survives」)。推导中初始状态项与环境动态项先后被划掉。

  4. 出处:第 6 章导语第 329 段(text/09-fm-this-chapter-covers.txt:329,搜「advantage function」)。

  5. 出处:第 6 章导语第 343 段(text/09-fm-this-chapter-covers.txt:343,搜「advantage trick」)。

  6. 出处:「6.1.1 Vanilla Policy Gradient」第 20 段(text/10-ch06-01-6-1-1-vanilla-policy-gradient.txt:20,搜「high variance」)。原文点名三个来源:rollouts 少、温度随机、稀疏奖励(0 或 1 而非聚拢)。

  7. 出处:「6.1.1 Vanilla Policy Gradient」第 20 段(text/10-ch06-01-6-1-1-vanilla-policy-gradient.txt:20,搜「de-bias the gradients」)。

  8. 出处:「6.1.3 REINFORCE Leave One Out (RLOO)」第 7 段(text/12-ch06-01-6-1-3-reinforce-leave-one-out-rloo.txt:7,搜「average reward of the other samples」)。

  9. 出处:「6.1.4 Proximal Policy Optimization (PPO)」第 20 段(text/13-ch06-01-6-1-4-proximal-policy-optimization-ppo.txt:20,搜「importance sampling」)与第 32 段(text/13-ch06-01-6-1-4-proximal-policy-optimization-ppo.txt:32,搜「destructively large」)。

  10. 出处:「6.2.4 Proximal Policy Optimization」第 91 段(text/21-ch06-02-6-2-4-proximal-policy-optimization.txt:91,搜「pessimistic」)。原文:取 max 选的是「更悲观的梯度——产生更小的策略更新」。

  11. 出处:「6.1.4 Proximal Policy Optimization (PPO)」第 107 段(text/13-ch06-01-6-1-4-proximal-policy-optimization-ppo.txt:107,搜「fig. 6.2」)及第 17–39 段的六情况分析(text/13-ch06-01-6-1-4-proximal-policy-optimization-ppo.txt:211,搜「NO UPDATE」;text/13-ch06-01-6-1-4-proximal-policy-optimization-ppo.txt:261,搜「NO UPDATE」)。

  12. 出处:「6.1.4 Proximal Policy Optimization (PPO)」第 113 段(text/13-ch06-01-6-1-4-proximal-policy-optimization-ppo.txt:113,搜「trust region」)与第 326 段(text/13-ch06-01-6-1-4-proximal-policy-optimization-ppo.txt:326,搜「roughly the same as standard」)。

  13. 出处:「6.1.4 Proximal Policy Optimization (PPO)」第 338 段(text/13-ch06-01-6-1-4-proximal-policy-optimization-ppo.txt:338,搜「additional copy of the model」)与第 344 段(text/13-ch06-01-6-1-4-proximal-policy-optimization-ppo.txt:344,搜「two losses」)。

  14. 出处:「6.2.4 Proximal Policy Optimization」第 13 段(text/21-ch06-02-6-2-4-proximal-policy-optimization.txt:13,搜「only used for the KL」)。

  15. 出处:「6.2.4 Proximal Policy Optimization」第 109 段(text/21-ch06-02-6-2-4-proximal-policy-optimization.txt:109,搜「1 gradient step」)与「6.3.2 Double Regularization」第 25 段(text/24-ch06-03-6-3-2-double-regularization.txt:25,搜「never applied」)。

  16. 出处:「6.1.2 REINFORCE」第 7 段(text/11-ch06-01-6-1-2-reinforce.txt:7,搜「backronym」)与第 13 段(text/11-ch06-01-6-1-2-reinforce.txt:13,搜「REward Increment」)。

  17. 出处:「6.1.3 REINFORCE Leave One Out (RLOO)」第 58 段(text/12-ch06-01-6-1-3-reinforce-leave-one-out-rloo.txt:58,搜「could be combined with the clipping」)。

  18. 出处:「6.2.3 Asynchronicity」第 7 段(text/20-ch06-02-6-2-3-asynchronicity.txt:7,搜「slightly outside of the theoretical proofs」)。