Skip to content

PPO:别让一次更新把策略踢飞

WARNING

🧪 Beta公测版本提示:教程主体已完成,正在优化细节,欢迎大家提Issue反馈问题或建议。

s20 的 REINFORCE 用整条轨迹的回报 Gt 去推 logπ,方差大、步子也野。AlphaGo 的自我对弈已经是策略梯度,但棋上可以靠 MCTS 把「这一手」算稳。控制任务和大模型生成没有那棵树——更新必须自己稳住。 PPO(Proximal Policy Optimization, Schulman et al., 2017)就是目前最常用的那根缰绳。学完这一章,RLHF 里出现的裁剪目标和 GAE 都不必再从头推。

从 REINFORCE 到信任域再到 PPO 裁剪

图解说明:TRPO 用 KL 球限制更新;PPO 用 [1ε,1+ε] 的盒子近似这颗球。


一、策略梯度为什么会一步跨崩

on-policy 梯度的期望是在当前 πθold 下采的轨迹。参数一改,数据立刻过期。更糟的是:logπ 的梯度在概率很小的动作上可以很大——一次坏更新能把好策略的概率质量抽走,再也采不回原来的好轨迹。

TRPO 的想法是:在一次更新里限制

Es[DKL(πθold(s)πθ(s))]δ

这是信任域(trust region):只在「旧策略还认得的邻域」里爬坡。TRPO 要用二阶近似和共轭梯度,工程重。PPO 用一阶优化,换两种便宜的近似:裁剪和(较少用的)KL 惩罚。


二、重要性采样:用旧数据评估新策略

同一条轨迹 (st,at),新策略下的目标可以写成比率

rt(θ)=πθ(atst)πθold(atst)

未裁剪的替代目标是

LCPI(θ)=Et[rt(θ)A^t]

A^t>0 时加大 r 会提高目标;A^t<0 时减小 r 会提高目标。没有限制的话,优化器会把 r 推到极端。

数字例。 某步 A^=+1πold(a|s)=0.2,新策略若把该动作推到 0.8,比率 r=4ε=0.2clip(r,0.8,1.2)=1.2,目标最多按 1.2A^ 计,不会按 4 计。优势为负时对称:不允许比率掉得太深去「过度惩罚」。

逐步推导:裁剪目标与 GAE(点击展开)LCLIP=Et[min(rtA^t,clip(rt,1ε,1+ε)A^t)].

A^>0min 取较小的那个,防止 r 过大;A^<0clip 的下界阻止 r 过小。取 min 是悲观界:只在信任域里保证改进。GAE:δt=rt+γV(st+1)V(st)A^t=l=0γλlδt+lλ=0 是一步 TD,λ=1 是蒙特卡洛。价值损失另算 MSE;熵奖励鼓励探索。卡点:一轮数据可更新 K 个 epoch,但 K 太大等于离策略太远,裁剪也会失效。


三、裁剪替代目标

PPO-Clip 的核心:

LCLIP(θ)=Et[min(rt(θ)A^t,clip(rt(θ),1ε,1+ε)A^t)]

通常 ε=0.2min 保证:你不能靠把 r 推得更极端来刷分,更新是保守的。

分两种情况看(这是后面所有实现都要记住的图):

好动作 A^t>0
想提高 π(atst)。若 r 已经 >1+ε,裁剪后目标不再随 r 上升——「已经够近了,别再猛加」。

坏动作 A^t<0
想压低该动作概率。若 r 已经 <1ε,同样封顶——「已经够远了,别再猛减」,以免把策略抽成确定性的灾难。

PPO 裁剪:A>0 与 A<0 两条曲线

图解说明:这是后面所有实现都要记住的图。min 保证你不能靠把 r 推得更极端来刷分。

同一批轨迹通常会做 K 个 epoch 的梯度步(数据复用),因为有裁剪兜底。这是 PPO 比纯 REINFORCE 样本效率高的原因之一。


四、GAE:优势函数怎么估

A^t 从哪来?s20 用 TD 误差 δt=rt+γV(st+1)V(st) 当优势,偏差小方差仍可以再压。**广义优势估计(GAE)**把多步 TD 残差按 λ 衰减求和:

δt=rt+γVϕ(st+1)Vϕ(st)A^tGAE(γ,λ)==0Tt1(γλ)δt+
λ行为
0单步 TD,低方差、高偏差
1接近 Monte Carlo 回报,高方差、低偏差
0.90.97实践默认,在偏差和方差之间折中

Critic 拟合 Vϕ,损失一般是 (A^t+Vold(st)Vϕ(st))2(用 GAE 构造的回报当回归目标)。总损失还常加熵奖励 cHH[π],防止过早塌成确定性策略。

完整的 PPO 一步更新可以记成:

L=LCLIPcVLV+cHH[π]

(符号随实现:有人把价值项写成 + 再在 LV 前加负号。)

GAE:λ 在单步 TD 与整条回报之间滑动

图解说明:Critic 提供 Vϕλ 决定用多少步 TD。GRPO 会把这根尺子换成组内相对分。


五、实现里真正要命的细节

论文公式之外,稳定 PPO 几乎总要:

  1. 优势标准化:一个 batch 里 A^ 减均值除标准差,梯度尺度不随奖励量纲乱跑。
  2. 价值损失裁剪(可选):价值网络也限制相对旧 V 的步长。
  3. ratio 爆掉就丢掉r 超出 [1ε,1+ε] 太多说明 off-policy 已经离谱。
  4. 与参考策略的 KL(控制 / LLM 里更常见):RLHF 会把 βKL(ππref) 加进奖励;那不是 PPO-Clip 的定义,是任务侧的安全带。下一节 GRPO 则把它写进损失。

PPO 是 on-policy:数据来自 πold。它不是 DQN 那种回放缓冲区里随便抽旧转移。


六、和前后章的地图

  • 没有 Critic、只在同一 prompt 的一组样本里比相对好坏 → GRPO(DeepSeek)。
  • 有人类偏好、奖励模型和 KL 到 SFT → RLHF优化器就是本章的 PPO,不必再推一遍 LCLIP

下一节 GRPO:DeepSeek 把 Critic 拿掉,用组内均值当基线。读完再进 RLHF。

PPO 一次迭代:采样、算 GAE、K 次裁剪更新

图解说明:同一批 on-policy 数据能跑 K 个 epoch,靠的就是 clip。


七、本节小结

概念一句话
信任域新策略不能离采样策略太远,否则梯度失效
rt(θ)新/旧策略在同一动作上的概率比
裁剪ε 盒子挡住「靠极端 r 刷分」
GAEλ 混合多步 TD,得到 A^t
CriticVϕ,给 GAE 提供自举
多 epoch同一批 on-policy 数据反复用,靠 clip 保命

📥 Code

FileViewDownload
demo.pyOpenDownload
exercise.pyOpenDownload

参考

  1. Schulman, J., et al. (2015). Trust Region Policy Optimization. ICML. [arXiv:1502.05477]
  2. Schulman, J., et al. (2016). High-Dimensional Continuous Control Using Generalized Advantage Estimation. ICLR. [arXiv:1506.02438]
  3. Schulman, J., et al. (2017). Proximal Policy Optimization Algorithms. [arXiv:1707.06347]