PPO(Proximal Policy Optimization)常被概括为“用重要性采样复用数据,再把概率比截断”。这个说法只说对了一半:PPO 会在同一批新采样的数据上做有限次更新,但它仍然通常被归为 on-policy 策略梯度算法,并不支持像 DQN、SAC 那样长期从经验回放中任意取旧数据训练。
本文从策略梯度开始,依次说明优势函数、Actor-Critic、GAE 和 PPO 的 clipped objective。重点不是记住最终公式,而是回答三个问题:
- 为什么策略梯度里会出现 $\nabla_\theta \log \pi_\theta(a_t\mid s_t)$?
- 为什么 PPO 要比较新旧策略的动作概率?
- 为什么最大化 clipped objective 时使用的是 $\min$,而不是 $\max$?
约定:策略网络参数记为 $\theta$,价值网络参数记为 $\phi$;$\theta_{\mathrm{old}}$ 表示采集当前这批数据时冻结的策略参数。这样可以避免把策略与价值函数混用同一组下标。
1. 从轨迹概率到策略梯度
考虑一个带折扣的马尔可夫决策过程。一条长度为 $T$ 的轨迹写作
$$ \tau=(s_0,a_0,r_0,s_1,a_1,r_1,\ldots,s_T). $$策略 $\pi_\theta$ 产生这条轨迹的概率为
$$ p_\theta(\tau)=\rho_0(s_0)\prod_{t=0}^{T-1} \pi_\theta(a_t\mid s_t)P(s_{t+1},r_t\mid s_t,a_t), $$其中 $\rho_0$ 是初始状态分布,$P$ 是环境的状态转移概率。环境本身不依赖策略参数 $\theta$,因此对轨迹概率求梯度时,真正需要求导的只有策略项。
我们的目标是最大化期望折扣回报
$$ J(\theta)=\mathbb{E}_{\tau\sim p_\theta} \left[\sum_{t=0}^{T-1}\gamma^t r_t\right]. $$使用对数导数技巧 $\nabla p=p\nabla\log p$,可以把梯度写成期望形式。再利用因果性去掉动作发生前的奖励,可得到 REINFORCE 形式的策略梯度估计:
$$ \nabla_\theta J(\theta) =\mathbb{E}_{\tau\sim p_\theta} \left[ \sum_{t=0}^{T-1} \gamma^t\nabla_\theta\log\pi_\theta(a_t\mid s_t)G_t \right], $$其中
$$ G_t=\sum_{k=t}^{T-1}\gamma^{k-t}r_k $$是从时刻 $t$ 开始的实际折扣回报。这里显式的 $\gamma^t$ 来自以初始状态回报定义的目标;有些推导会把它吸收到折扣状态访问分布中。直观地说:如果动作之后的回报较高,就沿着增加该动作概率的方向更新;反之则降低它的概率。
2. Baseline、优势函数与 Actor-Critic
直接使用单条轨迹的 $G_t$ 是无偏的 Monte Carlo 估计,但方差往往很大。可以减去一个只依赖状态、不依赖当前动作的 baseline,而不改变策略梯度的期望:
$$ \mathbb{E}_{a_t\sim\pi_\theta} \left[ \nabla_\theta\log\pi_\theta(a_t\mid s_t)b(s_t) \right]=0. $$最常用的 baseline 是状态价值函数
$$ V^\pi(s)=\mathbb{E}_\pi[G_t\mid s_t=s]. $$动作价值与优势函数分别是
$$ Q^\pi(s,a)=\mathbb{E}_\pi[G_t\mid s_t=s,a_t=a], $$$$ A^\pi(s,a)=Q^\pi(s,a)-V^\pi(s). $$于是策略梯度可以用优势估计 $\hat A_t$ 代替 $G_t$。在把折扣权重吸收到采样分布的常用记号下,对一批样本的估计写成:
$$ \nabla_\theta J(\theta) \approx \frac{1}{N}\sum_{t=1}^{N} \nabla_\theta\log\pi_\theta(a_t\mid s_t)\hat A_t. $$这就形成了 Actor-Critic 的基本分工:
- Actor,即策略网络 $\pi_\theta(a\mid s)$,决定动作分布。
- Critic,即价值网络 $V_\phi(s)$,估计状态价值并帮助构造 $\hat A_t$。
两者可以共享特征提取层,也可以是完全独立的网络;“Actor-Critic”并不要求它们必须共享参数。
3. TD 残差与 GAE
根据 Bellman 方程,真实价值函数满足条件期望关系:
$$ V^\pi(s_t)= \mathbb{E}_\pi\left[r_t+\gamma V^\pi(s_{t+1})\mid s_t\right]. $$训练时只观察到一次具体转移,所以
$$ r_t+\gamma V_\phi(s_{t+1}) $$是一个单样本 bootstrap 目标,而不是与 $V^\pi(s_t)$ 恒等。相应的一步 TD 残差为
$$ \delta_t=r_t+\gamma(1-d_t)V_\phi(s_{t+1})-V_\phi(s_t), $$其中 $d_t=1$ 表示真正的终止状态,避免在 episode 已结束时继续 bootstrap。若只是因为采样长度而截断,则通常仍应使用末状态价值,具体取决于环境 API 对 terminated 与 truncated 的区分。
一步 TD 方差较低,但依赖价值估计,偏差可能较大;Monte Carlo 回报依赖更少的 bootstrap,偏差较小但方差更高。GAE(Generalized Advantage Estimation)用指数加权组合多步 TD 残差:
$$ \hat A_t^{\mathrm{GAE}(\gamma,\lambda)} =\sum_{l=0}^{T-t-1}(\gamma\lambda)^l\delta_{t+l}. $$$\lambda$ 控制偏差与方差之间的权衡:
- $\lambda=0$ 时只保留一步 TD 残差,方差较低但更依赖 Critic。
- $\lambda$ 接近 $1$ 时纳入更长的未来奖励,通常偏差更小、方差更高。
实践中常用
$$ \hat R_t=\hat A_t+V_{\phi_{\mathrm{old}}}(s_t) $$作为价值网络的回归目标。计算优势和目标回报后,应在当前一轮 PPO 更新中把它们视为固定数据,也就是对它们使用 stop-gradient,而不是让梯度穿过这些目标。
4. PPO 为什么需要新旧策略概率比
标准 on-policy 策略梯度每更新一次策略,就应该重新与环境交互,因为数据分布也随策略变化。这样最符合理论假设,但一次采样只做一次梯度更新,样本利用率较低。
PPO 的折中是:
- 冻结行为策略 $\pi_{\theta_{\mathrm{old}}}$ 并采集一批新 rollout。
- 固定这批数据上的优势估计 $\hat A_t$。
- 用同一批数据做若干个 mini-batch epoch,同时限制新策略不能离旧策略太远。
- 丢弃这批数据,用更新后的策略重新采样。
在固定批次内,定义动作概率比
$$ r_t(\theta)= \frac{\pi_\theta(a_t\mid s_t)} {\pi_{\theta_{\mathrm{old}}}(a_t\mid s_t)}. $$未裁剪的局部 surrogate objective 为
$$ L^{\mathrm{CPI}}(\theta)= \mathbb{E}_t\left[r_t(\theta)\hat A_t\right]. $$这个比值修正的是同一状态下动作概率的变化,并为当前 rollout 批次附近的策略更新提供 surrogate。它没有完整修正新旧策略造成的状态访问分布变化,因此不能据此把 PPO 当作一般的 off-policy 算法,也不能无限复用很久以前的数据。
在 RLHF 语境中还要区分两个容易混淆的对象:$\pi_{\theta_{\mathrm{old}}}$ 是采集当前 rollout 的行为旧策略,会在每轮采样前更新;$\pi_{\mathrm{ref}}$ 则通常是用于 KL 正则的冻结参考模型。二者职责不同,不能混为一个“参考策略”。
5. Clipped objective 为什么使用 min
如果在同一批数据上做太多轮更新,$r_t(\theta)$ 可能远离 $1$,局部 surrogate 就不再可靠。PPO-Clip 把目标写成
$$ L^{\mathrm{CLIP}}(\theta)= \mathbb{E}_t\left[ \min\left( r_t(\theta)\hat A_t, \operatorname{clip}(r_t(\theta),1-\epsilon,1+\epsilon)\hat A_t \right) \right]. $$训练时要最大化这个目标。它使用 $\min$,是为了取未裁剪目标与裁剪目标中更保守的那个下界:
- 当 $\hat A_t>0$ 时,提高该动作概率是有利方向;一旦 $r_t>1+\epsilon$,继续提高不再增加 clipped objective。
- 当 $\hat A_t<0$ 时,降低该动作概率是有利方向;一旦 $r_t<1-\epsilon$,继续降低也不再带来目标收益。
因此,裁剪限制的是“继续朝有利方向走得过远所获得的额外收益”,并不是把所有概率比强制锁死在区间内。单个样本仍可能越界,所以实现中通常还会监控近似 KL 散度,并在策略变化过大时提前结束当前批次的更新。
若优化器按最小化损失工作,则策略损失才写成
$$ \mathcal{L}_{\mathrm{policy}}(\theta)=-L^{\mathrm{CLIP}}(\theta). $$这里的负号只改变优化方向,不会把公式内部的 $\min$ 改成 $\max$。
6. 完整训练目标
PPO 实现通常还会同时训练价值网络,并加入熵奖励鼓励探索。一个常见的最小化目标是
$$ \mathcal{L}(\theta,\phi)= -L^{\mathrm{CLIP}}(\theta) +c_v\mathbb{E}_t\left[(V_\phi(s_t)-\hat R_t)^2\right] -c_e\mathbb{E}_t\left[\mathcal{H}(\pi_\theta(\cdot\mid s_t))\right]. $$其中 $\hat R_t$ 在优化时使用 stop-gradient,$c_v$ 和 $c_e$ 分别控制价值损失与熵奖励的权重。有些实现还会裁剪价值函数更新,但这属于实现选择,不是 PPO-Clip 策略目标本身的必要定义。
PPO 原论文还给出了自适应 KL penalty 版本。它与 PPO-Clip 是两种相关方案:前者直接在目标中惩罚 KL 偏离,后者使用概率比裁剪构造保守 surrogate。不能简单理解为“因为 KL 算不出来,所以用 clip 替代”;对常见离散分布和高斯策略,KL 通常可以估计或直接计算。
7. 一轮 PPO 更新的实际流程
把前面的公式串起来,一轮典型 PPO-Clip 更新如下:
- 用 $\pi_{\theta_{\mathrm{old}}}$ 与环境交互,记录 $s_t,a_t,r_t$、终止标记和旧动作对数概率。
- 用冻结的价值估计计算 $\delta_t$、$\hat A_t$ 与 $\hat R_t$,通常再对批次内优势做标准化。
- 将 rollout 打乱成 mini-batch,做有限个 epoch。
- 每个 mini-batch 重新计算新策略的动作对数概率,由两者之差稳定地得到 $r_t(\theta)=\exp(\log\pi_\theta-\log\pi_{\mathrm{old}})$。
- 最小化策略损失、价值损失与熵项组成的总损失,同时观察 clip fraction 和近似 KL。
- 当前批次更新结束后令 $\theta_{\mathrm{old}}\leftarrow\theta$,重新采样,而不是把旧 rollout 长期放进 replay buffer。
8. 容易混淆的四个结论
PPO 仍然是 on-policy。 它有限复用刚由旧策略采集的数据,但每轮优化后会重新采样;动作概率比不等于完整的 off-policy 分布修正。
最大化 clipped objective 时仍然使用 $\min$。 写成最小化损失时是在整个目标外加负号,而不是把内部换成 $\max$。
Bellman 方程描述的是条件期望。 单条转移上的 $r_t+\gamma V(s_{t+1})$ 是采样得到的 bootstrap 目标,$\delta_t$ 是 TD 残差。
Actor 与 Critic 不必共享参数。 共享主干只是常见实现之一,独立网络同样属于 Actor-Critic。
总结
PPO 的核心并不只是一个 clip 函数,而是三层配合:策略梯度给出优化方向,GAE 在优势估计的偏差与方差之间折中,clipped surrogate 则限制同一批 rollout 上的策略更新幅度。理解新旧策略的角色以及目标函数的符号后,PPO 的训练循环就不再是一组需要死记的公式。
这篇文章最初由 RethinkFun 的 PPO 入门视频启发;本次校订以 PPO、GAE 原论文及标准教材中的定义为准。
参考资料
- Richard S. Sutton and Andrew G. Barto, Reinforcement Learning: An Introduction, Second Edition, 2018.
- Ronald J. Williams, Simple Statistical Gradient-Following Algorithms for Connectionist Reinforcement Learning, 1992.
- John Schulman et al., High-Dimensional Continuous Control Using Generalized Advantage Estimation, 2015.
- John Schulman et al., Proximal Policy Optimization Algorithms, 2017.
- OpenAI Spinning Up, Proximal Policy Optimization.