PPO:别让一次更新把策略踢飞
WARNING
🧪 Beta公测版本提示:教程主体已完成,正在优化细节,欢迎大家提Issue反馈问题或建议。
s20 的 REINFORCE 用整条轨迹的回报
去推 ,方差大、步子也野。AlphaGo 的自我对弈已经是策略梯度,但棋上可以靠 MCTS 把「这一手」算稳。控制任务和大模型生成没有那棵树——更新必须自己稳住。 PPO(Proximal Policy Optimization, Schulman et al., 2017)就是目前最常用的那根缰绳。学完这一章,RLHF 里出现的裁剪目标和 GAE 都不必再从头推。

图解说明:TRPO 用 KL 球限制更新;PPO 用
的盒子近似这颗球。
一、策略梯度为什么会一步跨崩
on-policy 梯度的期望是在当前
TRPO 的想法是:在一次更新里限制
这是信任域(trust region):只在「旧策略还认得的邻域」里爬坡。TRPO 要用二阶近似和共轭梯度,工程重。PPO 用一阶优化,换两种便宜的近似:裁剪和(较少用的)KL 惩罚。
二、重要性采样:用旧数据评估新策略
同一条轨迹
未裁剪的替代目标是
数字例。 某步
逐步推导:裁剪目标与 GAE(点击展开)
三、裁剪替代目标
PPO-Clip 的核心:
通常
分两种情况看(这是后面所有实现都要记住的图):
好动作
想提高
坏动作
想压低该动作概率。若

图解说明:这是后面所有实现都要记住的图。
保证你不能靠把 推得更极端来刷分。
同一批轨迹通常会做
四、GAE:优势函数怎么估
| 行为 | |
|---|---|
| 单步 TD,低方差、高偏差 | |
| 接近 Monte Carlo 回报,高方差、低偏差 | |
| 实践默认,在偏差和方差之间折中 |
Critic 拟合
完整的 PPO 一步更新可以记成:
(符号随实现:有人把价值项写成

图解说明:Critic 提供
; 决定用多少步 TD。GRPO 会把这根尺子换成组内相对分。
五、实现里真正要命的细节
论文公式之外,稳定 PPO 几乎总要:
- 优势标准化:一个 batch 里
减均值除标准差,梯度尺度不随奖励量纲乱跑。 - 价值损失裁剪(可选):价值网络也限制相对旧
的步长。 - ratio 爆掉就丢掉:
超出 太多说明 off-policy 已经离谱。 - 与参考策略的 KL(控制 / LLM 里更常见):RLHF 会把
加进奖励;那不是 PPO-Clip 的定义,是任务侧的安全带。下一节 GRPO 则把它写进损失。
PPO 是 on-policy:数据来自
六、和前后章的地图
- 没有 Critic、只在同一 prompt 的一组样本里比相对好坏 → GRPO(DeepSeek)。
- 有人类偏好、奖励模型和 KL 到 SFT → RLHF,优化器就是本章的 PPO,不必再推一遍
。
下一节 GRPO:DeepSeek 把 Critic 拿掉,用组内均值当基线。读完再进 RLHF。

图解说明:同一批 on-policy 数据能跑
个 epoch,靠的就是 clip。
七、本节小结
| 概念 | 一句话 |
|---|---|
| 信任域 | 新策略不能离采样策略太远,否则梯度失效 |
| 新/旧策略在同一动作上的概率比 | |
| 裁剪 | |
| GAE | 用 |
| Critic | 学 |
| 多 epoch | 同一批 on-policy 数据反复用,靠 clip 保命 |
📥 Code
| File | View | Download |
|---|---|---|
| demo.py | Open | Download |
| exercise.py | Open | Download |
参考
- Schulman, J., et al. (2015). Trust Region Policy Optimization. ICML. [arXiv:1502.05477]
- Schulman, J., et al. (2016). High-Dimensional Continuous Control Using Generalized Advantage Estimation. ICLR. [arXiv:1506.02438]
- Schulman, J., et al. (2017). Proximal Policy Optimization Algorithms. [arXiv:1707.06347]