Xiaohei's Blog
headpicBlur image

前言#

需要说明的是,这个系列的博客是由我的幕布笔记转化而来,如果你更喜欢图文并茂的阅读,你可以去我的幕布空间进行阅读,受限于篇幅的原因,第十二章幕布笔记在这。如果你发现有哪些地方由逻辑错误,可以通过评论告知我,十分感谢!

前言#

如果说 REINFORCE 的体验是“能学但很抖”,那 PPO 的体验往往是“终于像个工程算法了”。

PPO 解决的是一个特别现实的问题:

on-policy 方法要的数据很新鲜,但代价是采样量像无底洞一样被消耗;off-policy 方法能复用数据,样本效率高,可一旦更新把策略推离了数据分布太远,训练又会非常容易崩。PPO 基本就是在这两个诉求之间做平衡:既想把数据用得更充分,又不想让策略每次跨太大一步。

于是文档里先引入重要性采样,再引出 PPO 的关键点:限制新旧策略差距

重要性采样:用旧数据估计新策略#

文档说“通过重要性采样,把同策略换成异策略”,直观可以理解为:

  • 数据是用旧策略 πθ\pi_{\theta'} 采的;
  • 但我们想优化新策略 πθ\pi_\theta
  • 用一个比率把分布差异补回来:
rt(θ)=πθ(atst)πθ(atst)r_t(\theta)=\frac{\pi_\theta(a_t|s_t)}{\pi_{\theta'}(a_t|s_t)}

问题就在这里:如果新旧策略差太大,这个比率会爆炸或趋近 0,更新会非常不稳定。

PPO 的核心:别更新太猛#

文档描述 PPO 的目标:避免 pθ(as)p_\theta(a|s)pθ(as)p_{\theta'}(a|s) 相差太多。

TRPO 的做法是用 KL 散度做约束(但实现复杂);PPO 把“约束”塞进目标函数里,让优化变得像普通的梯度法。

PPO 最常用的是 clipped objective(文档里虽然没展开公式,但思想一致):

LCLIP(θ)=E[min(rt(θ)At,clip(rt(θ),1ϵ,1+ϵ)At)]\mathcal{L}^{\text{CLIP}}(\theta) = \mathbb{E}\big[\min(r_t(\theta) A_t, \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) A_t)\big]

这里 AtA_t 是优势(通常来自 critic 或 GAE)。

PPO 实战要点(我觉得比公式更重要)#

1) PPO 仍然是 on-policy#

文档强调:虽然用了重要性采样,但 PPO 通常只用上一轮策略的数据,所以行为策略和目标策略非常接近,可认为是同策略。

这是你写代码时必须遵守的约束:

  • 采样 buffer 不能像 DQN 那样攒很多轮;
  • 最多复用 K 个 epoch(mini-batch 多轮优化),但还是基于同一批 rollout。

2) 优势估计决定了稳定性#

PPO 本体只是“更新约束”,真正决定学习信号质量的是 AtA_t

工程上常见做法:

  • 用 critic 估计 V(s)V(s)
  • 用 GAE(λ\lambda) 计算优势

【图片占位:GAE 计算流程图(TD residual 逐步衰减累加)】

3) 两个最常调的旋钮#

  • clip epsilon(比如 0.1 ~ 0.3)
  • entropy bonus 系数(鼓励探索,避免过早坍缩)

本章小结:PPO 的贡献是“可控”#

PPO 在我看来最重要的贡献不是它有多“新”,而是它让策略梯度的更新变得可控:

  • 你可以用 KL / clip 来约束更新幅度;
  • 你可以通过多 epoch 复用同一批数据,提高样本利用率;
  • 它和 actor-critic 架构天然契合。

下一章我们会回到 value-based 阵营:DQN。你会发现它也在做“稳定性工程”,只是手段完全不同:经验回放 + 目标网络。

RL 学习笔记(5):PPO
https://xiaohei-blog.vercel.app/blog/rl-learning-5
Author 红鼻子小黑
Published at May 6, 2025
Comment seems to stuck. Try to refresh?✨