Proximal Policy Optimization Algorithms
2026/7/12
来源:arxiv17
Takeaway message: PPO 要解决的核心问题是:策略梯度可以直接训练连续动作策略,但一次更新如果走得太远,刚采集到的数据就会迅速失效,策略性能甚至会突然崩溃;如果每批数据只做一次很小的更新,又会非常浪费样本。PPO 通过比较"新策略"和"采样时的旧策略"选择同一动作的概率,并用裁剪目标限制过度更新,使一批交互数据能够安全地进行多轮小批量优化。它并没有彻底解决强化学习的不稳定性,却以很低的实现复杂度,在稳定性、样本利用率和计算效率之间取得了非常实用的平衡,因此后来成为机器人运动控制中最常见的强化学习算法之一。
一、先建立强化学习的基本图景
你可以先把强化学习理解成一种"通过反复试错学习控制策略"的方法。与监督学习不同,强化学习通常没有数据集直接告诉模型"当前输入对应的正确输出是什么"。智能体只能在环境中做动作,观察动作带来的后果,并获得一个标量奖励。它需要从这些延迟、稀疏甚至带噪声的奖励中,反推出哪些动作值得增加,哪些动作应该减少。
一次交互通常写成
\[s_t \xrightarrow[\text{policy}]{a_t} r_t,\ s_{t+1}.\]其中 $s_t$ 是时刻 $t$ 的状态,$a_t$ 是动作,$r_t$ 是环境在这一步给出的奖励,$s_{t+1}$ 是下一状态。机器人场景中,状态可能包括关节位置、关节速度、机身姿态、角速度、速度指令和地形观测;动作可能是十二个关节目标位置、关节力矩或电机位置增量;奖励则可能包含速度跟踪、姿态稳定、能耗、动作平滑性和跌倒惩罚。
策略记作
\[\pi_\theta(a\mid s),\]它表示在状态 $s$ 下,参数为 $\theta$ 的策略选择动作 $a$ 的概率。这里的"概率"非常重要。PPO 通常训练的是随机策略,而不是直接输出唯一确定的动作。对于连续控制,神经网络经常输出一个高斯分布:
\[a_t\sim \mathcal N\bigl(\mu_\theta(s_t),\sigma_\theta(s_t)^2\bigr).\]网络给出动作分布的均值和标准差,再从中采样实际动作。训练早期标准差较大,机器人会尝试更多动作;训练后期,策略通常逐渐集中在表现较好的动作附近。实际部署时,人们经常直接使用均值 $\mu_\theta(s)$,从而得到确定性动作。
从初始状态一直交互到 episode 结束,会得到一条轨迹:
\[\tau=(s_0,a_0,r_0,s_1,a_1,r_1,\ldots).\]强化学习的目标不是让每一步即时奖励最大,而是让长期累计奖励最大。一般定义从时刻 $t$ 开始的折扣回报为
\[G_t=r_t+\gamma r_{t+1}+\gamma^2r_{t+2}+\cdots,\]其中 $\gamma\in[0,1)$ 是折扣因子。论文实验中常用 $\gamma=0.99$。它一方面表达对未来奖励的重视程度,另一方面也让无限时域的回报在数学上保持有限。若控制频率很高,$\gamma=0.99$ 并不意味着只关心几步以后;但它对应的真实时间尺度还会受到控制周期和奖励设计的影响。
于是策略训练的总体目标可以写成
\[J(\theta)=\mathbb E_{\tau\sim\pi_\theta} \left[\sum_{t=0}^{\infty}\gamma^t r_t\right].\]这里最大的困难是,奖励通常不能直接对神经网络参数求导。例如,机器人跌倒这一结果经过了复杂的动力学演化,我们无法像普通监督学习那样直接计算"跌倒奖励对网络参数的梯度"。策略梯度方法解决的正是这个问题。
二、Policy、Value、Q 和 Advantage 分别是什么
在理解 PPO 之前,需要先区分四个概念。
策略 $\pi(a\mid s)$ 回答的是:"处于状态 $s$ 时,我应该怎样选择动作?"
状态价值函数
\[V^\pi(s)= \mathbb E_\pi[G_t\mid s_t=s]\]回答的是:"从状态 $s$ 开始,后续一直按照当前策略行动,预期能获得多少累计奖励?"
动作价值函数
\[Q^\pi(s,a) =\mathbb E_\pi[G_t\mid s_t=s,a_t=a]\]回答的是:"在状态 $s$ 先执行动作 $a$,之后再按照当前策略行动,预期能获得多少累计奖励?"
优势函数定义为
\[A^\pi(s,a)=Q^\pi(s,a)-V^\pi(s).\]它回答的是:"这个动作相对于当前策略在该状态下的平均水平,究竟好多少?"
这是 PPO 中最关键的量之一。假设一个状态的价值是 10,某动作对应的预期回报是 13,那么它的优势是 $+3$,说明该动作比当前策略通常会做的选择更好;如果某动作的预期回报是 7,它的优势就是 $-3$,说明它比平均水平差。
为什么不直接使用回报 $G_t$,而要减去 $V(s_t)$?因为策略梯度真正关心的不是"这个动作最终得到的回报是否绝对很大",而是"这个动作是否比在当前状态下通常能够获得的回报更好"。例如,在一个本来就很容易获得高奖励的状态中,回报 100 未必说明动作很好;如果该状态平均能得到 120,那么这个动作反而较差。减去状态价值相当于加入了一个 baseline,可以显著降低梯度估计的方差,同时不会改变期望意义下的正确梯度方向。
三、Actor-Critic 是什么
PPO 通常以 Actor-Critic 的形式实现。Actor 就是策略网络 $\pi_\theta(a\mid s)$,负责产生动作;Critic 是价值网络 $V_\phi(s)$,负责估计状态价值。
Actor 根据优势函数更新:优势为正,就提高该动作出现的概率;优势为负,就降低该动作出现的概率。Critic 则通过监督学习拟合回报或某种 bootstrap 目标。例如:
\[L^{VF}(\phi) =\left(V_\phi(s_t)-V_t^{\text{target}}\right)^2.\]Critic 并不直接控制机器人。它的主要作用是帮助 Actor 判断:当前动作比平均水平好还是差,并降低策略梯度的方差。训练结束以后,如果只需要执行策略,通常可以丢掉 Critic,只保留 Actor。
论文中把策略损失、价值损失和熵奖励合并为一个目标:
\[L_t^{\text{CLIP+VF+S}} = L_t^{\text{CLIP}} -c_1L_t^{VF} +c_2S[\pi_\theta](s_t).\]论文把这个式子写成"最大化"的形式,所以价值误差前面是负号,熵前面是正号。实际 PyTorch 代码通常使用梯度下降,因此会写成
\[L_{\text{total}} =L_{\text{policy}} +c_1L_{\text{value}} -c_2H.\]两种写法只是最大化目标和最小化损失之间的符号差异。
熵 $H$ 描述动作分布有多分散。熵较高意味着策略保留更多随机性和探索;熵太低时,策略可能很早收缩到一个并不理想的动作附近。连续控制中的熵通常与高斯分布的标准差有关。熵奖励因此是在告诉策略:"不要过早变得过分确定。"
四、策略梯度究竟在做什么
论文第二节首先给出经典策略梯度估计:
\[\hat g = \hat{\mathbb E}_t \left[ \nabla_\theta\log\pi_\theta(a_t\mid s_t)\hat A_t \right].\]其中 $\hat{\mathbb E}_t$ 表示对采样得到的一批时间步取经验平均,$\hat A_t$ 是优势估计。
这个式子可以从直觉上拆成两部分:
\[\nabla_\theta\log\pi_\theta(a_t\mid s_t)\]表示"怎样修改参数,才能提高当前动作 $a_t$ 在状态 $s_t$ 下的概率";再乘以优势 $\hat A_t$,就决定了修改方向和力度。
当 $\hat A_t>0$ 时,梯度上升会提高这个动作的概率;当 $\hat A_t<0$ 时,会降低这个动作的概率;当优势接近零时,说明这个动作与平均水平差不多,没有必要大幅修改。
为什么用 $\log \pi$,而不是直接用 $\pi$?关键恒等式是
\[\nabla_\theta \pi_\theta(a\mid s) =\pi_\theta(a\mid s) \nabla_\theta\log\pi_\theta(a\mid s).\]log-derivative trick 使得我们可以通过从策略中采样,构造期望梯度的无偏估计,而不需要对环境动力学求导。
在自动微分框架里,人们会构造一个形式上的目标:
\[L^{PG}(\theta) =\hat{\mathbb E}_t \left[ \log\pi_\theta(a_t\mid s_t)\hat A_t \right].\]对它求梯度就能得到前面的策略梯度估计。但这里有一个容易混淆的地方:它不是普通监督学习意义上的真实损失函数,更像是一个为了让自动微分产生所需梯度而构造出来的代理目标。
五、为什么不能直接把同一批数据反复训练很多次
假设当前策略为 $\pi_{\theta_{\text{old}}}$。我们用它与环境交互,收集一批状态、动作和奖励。此时数据中的动作是旧策略采样出来的。
如果只做一次很小的梯度更新,新策略和旧策略仍然很接近,这批数据仍然大致能够代表新策略的行为。但如果对同一批数据做很多轮普通策略梯度更新,策略会逐渐偏离生成数据的旧策略。此时数据分布和当前策略不再匹配,梯度估计就会越来越不可靠。
例如,旧策略在某状态下输出动作 $a$ 的概率为 0.1,这个动作碰巧获得正优势。反复最大化
\[\log \pi_\theta(a\mid s)\hat A\]可能会把它的概率从 0.1 推到 0.9。可是训练数据只告诉我们,这个动作相对于旧策略还不错;它并没有充分证明,把这个动作变成几乎必选的动作仍然是好事。
强化学习中的状态分布还会随策略变化。机器人动作稍有变化,就可能进入完全不同的姿态和接触状态。策略一次更新太大,不只是改变某个动作的概率,还会改变之后会访问哪些状态。于是局部上看似合理的梯度,可能使整条轨迹彻底改变,导致策略性能突然坍塌。
论文明确指出,直接对普通策略梯度目标使用同一批轨迹做多次更新,在理论上缺乏正当性,实践中经常造成破坏性的大幅策略更新。PPO 的设计就是为了同时满足两点:允许对同一批数据进行多个 epoch 的 minibatch 训练,但又不让策略离采样时的旧策略偏离太远。
六、TRPO 是 PPO 的直接前身
在 PPO 之前,Schulman 等人提出了 TRPO,也就是 Trust Region Policy Optimization。其思想是:我们可以提高代理目标,但必须明确限制新旧策略之间的距离。
TRPO 的代理目标是
\[\hat{\mathbb E}_t \left[ \frac{\pi_\theta(a_t\mid s_t)} {\pi_{\theta_{\text{old}}}(a_t\mid s_t)} \hat A_t \right].\]同时施加约束
\[\hat{\mathbb E}_t \left[ D_{\mathrm{KL}} \left( \pi_{\theta_{\text{old}}}(\cdot\mid s_t) \Vert \pi_\theta(\cdot\mid s_t) \right) \right] \leq \delta.\]KL 散度在这里衡量新旧动作分布差异有多大。TRPO 相当于说:"在一个可信的小邻域内,尽可能提升策略,但不要离开这个邻域。"
这种方法比普通策略梯度稳定得多,但实现复杂。它需要对目标做一阶近似,对 KL 约束做二阶近似,并使用共轭梯度、Fisher-vector product 和线搜索等步骤。它也不太方便与共享参数、某些随机网络结构和普通深度学习训练流程结合。
PPO 的目标并不是提出一个完全不同的强化学习范式,而是用普通的一阶优化方法近似 TRPO 的信赖域效果。论文希望保留 TRPO 的稳定性和样本利用率,同时只需要 Adam、minibatch 和标准自动微分。
七、概率比率 $r_t(\theta)$ 是 PPO 的中心变量
PPO 定义
\[r_t(\theta) = \frac{\pi_\theta(a_t\mid s_t)} {\pi_{\theta_{\text{old}}}(a_t\mid s_t)}.\]它衡量的是:对于数据中已经执行过的动作 $a_t$,新策略给它的概率相对于旧策略改变了多少。
若 $r_t=1$,说明新旧策略对这个动作的概率相同。
若 $r_t=1.2$,说明新策略选择该动作的概率是旧策略的 1.2 倍。
若 $r_t=0.7$,说明新策略把该动作的概率降到了旧策略的 70%。
在连续动作空间里,这里的概率严格来说是概率密度。例如,一个动作向量在旧高斯策略下的密度是 $p_{\text{old}}$,在新高斯策略下的密度是 $p_{\text{new}}$,那么
\[r_t=\frac{p_{\text{new}}}{p_{\text{old}}}.\]实际代码一般不会直接计算两个很小的概率再相除,而是保存旧策略的 log probability:
\[\log \pi_{\text{old}}(a_t\mid s_t).\]训练时重新计算
\[\log \pi_\theta(a_t\mid s_t),\]然后得到
\[r_t = \exp\left( \log\pi_\theta(a_t\mid s_t) - \log\pi_{\text{old}}(a_t\mid s_t) \right).\]这样在数值上更稳定。
为什么代理目标是 $r_t\hat A_t$?因为数据是由旧策略采样的,而我们希望估计新策略下的目标。概率比率在这里承担重要性采样修正的作用。直观地说,如果新策略比旧策略更倾向于选择某动作,就需要提高这条样本在新策略目标中的权重;反之则降低。
当 $\theta=\theta_{\text{old}}$ 时,所有样本都有 $r_t=1$,目标退化为平均优势。随着优化进行,$r_t$ 偏离 1,反映策略相对于数据采集时发生的变化。
八、PPO 的 clipped surrogate objective
论文提出的核心目标为
\[L^{\text{CLIP}}(\theta) = \hat{\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].\]论文中常取 $\epsilon=0.2$。表面上看,它只是一个 min 和一个 clip,但真正的含义要分别讨论优势为正和优势为负的情况。
优势为正
假设
\[\hat A_t>0.\]这个动作比平均水平好,因此我们希望提高它的概率,也就是让 $r_t$ 增大。
当
\[1\leq r_t\leq1+\epsilon\]时,目标随 $r_t$ 增加,策略受到鼓励去提高动作概率。
当
\[r_t>1+\epsilon\]时,裁剪项变为
\[(1+\epsilon)\hat A_t.\]因为优势为正,min 会选择这个被截平的值。于是继续增大 $r_t$ 不再带来目标收益。对于这一条样本,梯度不再鼓励新策略继续提高动作概率。
如果 $\epsilon=0.2$,可以粗略理解为:一个好动作的概率相对于旧策略提高到 1.2 倍以后,仅凭这条样本就不再奖励进一步提高。
需要注意,这并不意味着概率比率永远不能超过 1.2。不同样本共享同一组网络参数,其他样本的梯度仍可能间接让这一比率超过边界。PPO 的 clip 是软性的目标裁剪,而不是对参数或 KL 距离的严格约束。
优势为负
假设
\[\hat A_t<0.\]这个动作比平均水平差,因此我们希望降低它的概率,也就是让 $r_t$ 减小。
当 $r_t$ 从 1 降向 $1-\epsilon$ 时,目标有所改善。
当
\[r_t<1-\epsilon\]时,裁剪项变成
\[(1-\epsilon)\hat A_t.\]由于优势为负,符号关系会反转。此时 min 会保留更悲观的那个值,使得继续降低该动作概率不再获得额外奖励。
若 $\epsilon=0.2$,可以粗略理解为:对于一个坏动作,把其概率降低到旧策略的 0.8 倍以后,就不再凭这一样本继续鼓励降低。
为什么不是简单地把 $r_t$ 永远裁剪
假如只使用
\[\operatorname{clip}(r_t,1-\epsilon,1+\epsilon)\hat A_t,\]那么某些让策略变差的变化也会被裁掉。例如,对于正优势动作,如果新策略错误地大幅降低了它的概率,即 $r_t<1-\epsilon$,简单裁剪会让损失不再继续恶化,反而掩盖了这种坏变化。
PPO 使用
\[\min(r_t\hat A_t,\operatorname{clip}(r_t)\hat A_t)\]的目的,就是只截断那些看起来让代理目标继续变好、但更新幅度已经过大的变化,而不截断使目标变差的变化。
因此,PPO 的目标是一种悲观代理目标。它不会因为策略走得过远而继续给出虚假的额外收益,但策略朝错误方向变化时,损失仍会如实反映出来。论文第 3 页的图 1 正是分别画出了正优势和负优势时这一分段函数的形状。
九、用四种情况完整理解 PPO-Clip
将优势符号和比率变化组合起来,可以得到四种直观情况。
当 $\hat A_t>0$、$r_t>1$ 时,这是正确方向:好动作的概率正在提高。但提高得太多以后,收益会被截平。
当 $\hat A_t>0$、$r_t<1$ 时,这是错误方向:好动作的概率反而下降。PPO 不会裁掉这部分惩罚,而会继续推动策略纠正。
当 $\hat A_t<0$、$r_t<1$ 时,这是正确方向:坏动作的概率正在下降。但下降过多以后,收益会被截平。
当 $\hat A_t<0$、$r_t>1$ 时,这是错误方向:坏动作的概率反而提高。PPO 会保留这一恶化,不会用 clip 把它遮掉。
所以,PPO 的 clip 不是简单地要求
\[1-\epsilon\leq r_t\leq1+\epsilon.\]更准确地说,它是在代理目标中取消过度朝有利方向改变概率所产生的额外激励。
十、为什么它叫 Proximal Policy Optimization
"Proximal"可以理解为"邻近的"或"近端的"。PPO 希望每次得到的新策略都停留在旧策略附近,不要突然发生剧烈变化。
TRPO 通过显式 KL 约束定义这个邻域;PPO-Clip 则通过裁剪概率比率,间接抑制策略偏离旧策略。它不是严格的 trust region 方法,也不保证每次更新后策略性能单调提升,但实践中经常能获得类似的稳定效果。
论文第 4 页的图 2 展示了沿一次更新方向移动时不同目标的变化。未经裁剪的代理目标可能持续上升,使优化器误以为越走越好;PPO 的裁剪目标会在更新达到一定幅度后转而下降,因此更倾向于在旧策略附近取得最大值。
十一、GAE 为什么会出现在 PPO 中
PPO 的裁剪机制解决的是策略更新过大的问题,但还需要估计每个时间步的优势 $\hat A_t$。如果优势估计噪声很大,策略仍然很难训练。论文采用的是截断版 Generalized Advantage Estimation,也就是 GAE。
先定义一步 TD 误差:
\[\delta_t = r_t+\gamma V(s_{t+1})-V(s_t).\]这里的 $r_t$ 是环境奖励,不是前面的概率比率。二者在论文里使用了相同字母,阅读时很容易混淆。
$\delta_t$ 的含义是:当前得到的奖励,加上下一状态的估计价值,与当前状态原本的价值估计之间有多大差异。
如果
\[r_t+\gamma V(s_{t+1})>V(s_t),\]说明这一步的结果比 Critic 原先预期更好,TD 误差为正;反之则为负。
GAE 将未来多个 TD 误差加权累积:
\[\hat A_t = \delta_t + \gamma\lambda\delta_{t+1} + (\gamma\lambda)^2\delta_{t+2} +\cdots.\]在长度为 $T$ 的 rollout 中,它会截断在片段末尾。论文采用的典型参数是
\[\gamma=0.99,\qquad \lambda=0.95.\]$\lambda$ 控制 bias–variance trade-off。若 $\lambda$ 较小,优势更接近一步 TD,方差较低,但更依赖 Critic 的准确性,偏差较大。若 $\lambda$ 接近 1,优势更接近完整 Monte Carlo 回报,对 Critic 偏差不那么敏感,但会把更多未来奖励噪声传播回来,方差更高。
因此,GAE 可以理解成在"一步 TD"和"完整轨迹回报"之间进行连续插值。它并不是 PPO 的核心创新,但 PPO 实际性能高度依赖稳定的优势估计,所以现代 PPO 实现几乎都会配合 GAE。
十二、为什么 rollout 不必等到 episode 结束
论文算法不是要求每次都采集完整 episode,而是让每个 actor 运行固定的 $T$ 步。例如论文 MuJoCo 实验中使用 $T=2048$,Atari 实验使用 $T=128$。
如果第 $T$ 步时 episode 还没有结束,就用 Critic 对片段末端状态进行 bootstrap:
\[V(s_T).\]例如,片段中的回报目标可以写成
\[r_t+\gamma r_{t+1}+\cdots+ \gamma^{T-t-1}r_{T-1} + \gamma^{T-t}V(s_T).\]这表示:片段内部的奖励我们已经真实观察到,片段以后的未来奖励则由价值网络估计。
但如果 episode 是因为机器人跌倒等真正终止条件结束,通常不应该再 bootstrap,终止状态后的价值应视为 0。现代环境还会区分 terminated 和 truncated:前者表示任务本身终止,如跌倒;后者可能只是达到最大时间长度。对于时间限制截断,是否 bootstrap 需要按环境语义谨慎处理。这虽然不是 PPO 论文重点,却是实现中非常常见的误差来源。
十三、一轮完整 PPO 训练到底发生了什么
可以把 PPO 的训练过程分成采样阶段和优化阶段。
采样开始时,将当前策略固定为旧策略
\[\pi_{\theta_{\text{old}}}.\]让 $N$ 个并行环境分别运行 $T$ 步。每一步保存
\[s_t,\quad a_t,\quad r_t,\quad V_{\text{old}}(s_t),\quad \log\pi_{\text{old}}(a_t\mid s_t),\]以及终止标记等信息。总数据量为 $N\times T$。
随后使用奖励、价值预测和终止标记,反向计算 GAE 优势 $\hat A_t$ 和 value target。实践中通常还会对这一批优势进行标准化:
\[\hat A_t \leftarrow \frac{\hat A_t-\operatorname{mean}(\hat A)} {\operatorname{std}(\hat A)+\varepsilon}.\]优势标准化不是论文核心公式的一部分,但现代实现中很常见,它可以让优化尺度更加稳定。
进入优化阶段后,把 $NT$ 条样本打乱并划分为 minibatch。对于每个 minibatch,用当前正在更新的新策略重新计算
\[\log\pi_\theta(a_t\mid s_t), \quad V_\theta(s_t), \quad H[\pi_\theta(\cdot\mid s_t)].\]再由新旧 log probability 得到
\[r_t(\theta) = \exp(\log\pi_\theta-\log\pi_{\text{old}}).\]据此计算 clipped policy objective、value loss 和 entropy bonus,执行一次 Adam 更新。整批 rollout 数据会被反复打乱并训练 $K$ 个 epoch。论文 MuJoCo 基准中使用 $K=10$、minibatch size 为 64。
完成这 $K$ 轮更新后,旧数据被丢弃。把当前更新后的策略设为下一轮的旧策略,重新与环境交互,采集新的 on-policy 数据。
因此 PPO 不是像普通监督学习那样不断训练同一个固定数据集,也不是像 DQN、SAC 那样长期使用巨大的 replay buffer。它会短暂复用当前 rollout 若干轮,然后丢弃并重新采样。
十四、PPO 为什么仍然属于 on-policy 算法
"On-policy"通常表示训练所用数据是由当前策略或与当前策略非常接近的策略产生的。
在 PPO 的一次优化期间,数据确实是由更新前的旧策略产生,而参数已经开始变化。严格来说,后几轮 epoch 中的新策略已经不是数据采集策略。但 PPO 使用概率比率进行修正,并通过 clip 限制偏离程度,因此允许这种有限度的数据复用。
这与真正的 off-policy 算法仍有明显区别。SAC、TD3 或 DQN 可以长期使用很多历史策略产生的数据;PPO 通常只复用最新一批 rollout 几个 epoch。一旦完成更新,这批数据就被丢弃。
所以 PPO 可以理解为"近似 on-policy"或者"带有限局部数据复用的 on-policy policy-gradient 方法"。它的样本效率通常不如成熟的 off-policy 方法,但并行采样简单,训练目标相对直接,在大规模仿真机器人训练中尤其方便。
十五、KL penalty 版本与 clip 版本
论文还讨论了另一种 PPO 形式,即 KL penalty:
\[L^{\text{KLPEN}}(\theta) = \hat{\mathbb E}_t \left[ r_t(\theta)\hat A_t - \beta D_{\mathrm{KL}} \left( \pi_{\text{old}}(\cdot\mid s_t) \Vert \pi_\theta(\cdot\mid s_t) \right) \right].\]这里 $\beta$ 控制对策略变化的惩罚强度。若实际 KL 小于目标值太多,就减小 $\beta$,允许更大的更新;若实际 KL 超过目标值太多,就增大 $\beta$,加强惩罚。
它的逻辑很像一个反馈控制器:目标是让每次策略更新的 KL 维持在期望范围附近。
但论文实验发现,自适应 KL penalty 整体不如 clipped objective,因此后来人们所说的 PPO 通常默认指 PPO-Clip。论文连续控制实验中,$\epsilon=0.2$ 的 clip 版本取得了最好的平均归一化分数,高于无约束版本以及多种固定或自适应 KL penalty 设置。
现代实现仍经常监控 approximate KL,甚至在 KL 超过阈值时提前终止当前 epoch。原因是 clip 并不能严格限制总体策略距离,而 KL 提供了更直接的诊断量。由此形成一种常见实践:用 clip 作为训练目标,用 KL 作为监控和 early stopping 指标。
十六、PPO 中 Actor 和 Critic 可以怎样组织
论文指出,PPO 可以使用相互独立的 policy network 和 value network,也可以共享前面的特征提取层,再分别接 policy head 和 value head。
在低维机器人状态输入中,常见结构是两个 MLP:Actor 输入 observation,输出动作均值和可学习标准差;Critic 输入 observation 或 privileged observation,输出一个标量价值。
在机器人 locomotion 中,Critic 经常比 Actor 看到更多信息。例如 Actor 只接收真机可获得的本体感知和有限地形观测,Critic 在仿真训练中还可以看到真实地形高度、接触力、摩擦系数或扰动参数。这被称为 asymmetric actor-critic。Critic 的特权信息只用于提供更准确的价值估计和优势信号,部署时仍然只需要 Actor。
这并不改变 PPO 的基本推导。概率比率仍然只与 Actor 有关;Critic 的作用仍然是估计 value target 和 advantage。
十七、连续动作策略中的 log probability 怎么算
假设机器人有 $d$ 维动作,策略输出独立高斯分布:
\[\pi_\theta(a\mid s) = \prod_{i=1}^{d} \mathcal N(a_i;\mu_i(s),\sigma_i^2).\]整条动作向量的 log probability 是各维之和:
\[\log\pi_\theta(a\mid s) = \sum_{i=1}^{d} \log\mathcal N(a_i;\mu_i,\sigma_i^2).\]因此概率比率是整条动作向量联合概率密度之比:
\[r_t = \exp \left[ \sum_i \log\mathcal N_{\text{new}}(a_{t,i}) - \sum_i \log\mathcal N_{\text{old}}(a_{t,i}) \right].\]动作维度越高,多维 log probability 差值越容易累积,使比率偏离 1。因此高维控制中,clip fraction 和 KL 可能对学习率、标准差以及动作参数化较敏感。
机器人代码里还经常先从高斯分布采样一个未约束动作 $u$,再通过 $\tanh$ 映射到有限动作范围:
\[a=\tanh(u).\]如果使用这种 squashed Gaussian,严格来说 log probability 要包含变量变换的 Jacobian 修正。部分 PPO 实现则直接采样高斯动作,再对输出进行硬裁剪。后者更简单,但执行动作和计算 log probability 所对应的分布并不完全一致,在动作经常触碰边界时可能产生偏差。
十八、价值函数为什么也会不稳定
PPO 的主要创新针对 policy update,但 Critic 同样会对同一批数据训练多个 epoch。如果 Critic 变化过快,优势估计和后续训练也会不稳定。
原论文的主要公式使用普通均方误差:
\[L_t^{VF} = \left(V_\theta(s_t)-V_t^{\text{target}}\right)^2.\]后来的实现有时也会对 value update 做裁剪,例如限制新价值预测不要相对于旧价值预测变化过大。这种 value clipping 并不是 PPO 论文最核心的统一定义,不同代码库实现也不完全相同,因此读代码时应区分"原论文明确提出的 policy ratio clipping"和"工程实现附加的 value clipping"。
另一个常见指标是 explained variance,它衡量 Critic 对 value target 变化的解释程度。接近 1 通常说明拟合较好,接近 0 说明和用均值预测差不多,负值则表示价值估计可能比常数预测还差。但 Critic loss 很小也未必意味着策略一定优秀,因为奖励尺度、目标方差和 value normalization 都会影响损失数值。
十九、几个关键超参数到底控制什么
$\epsilon$ 控制 clip 区间。较小的 $\epsilon$ 通常使策略更新更保守,稳定但可能学习较慢;较大的 $\epsilon$ 允许更激进地复用数据,但也更容易导致策略漂移。论文 MuJoCo 实验中 $\epsilon=0.2$ 表现最好,而 Atari 使用了从 0.1 线性衰减的设置。
学习率控制每次参数更新幅度。clip 不是学习率的替代品。即使使用 clip,学习率过大仍可能让共享参数同时改变很多样本的动作分布,使 KL 突然升高。
rollout horizon 决定一次更新前采集多少步。更长的 rollout 通常提供更稳定的梯度和更完整的长期信息,但每次更新等待更久,也会增加内存和旧策略数据量。
并行环境数决定采样多样性和吞吐量。机器人训练中常使用成百上千个并行环境,一次收集大量不同初始状态和随机化条件下的数据。
epoch 数决定每批数据复用多少次。epoch 太少浪费样本,太多则会过拟合当前 batch 并让策略偏离旧策略。
minibatch size 影响梯度噪声和计算效率。太小可能噪声过大;太大则每轮更新次数减少,且梯度可能缺少一定随机性。
$\gamma$ 决定长期奖励权重,$\lambda$ 决定 GAE 的 bias–variance 平衡。论文 MuJoCo 配置为 $\gamma=0.99,\lambda=0.95$,这后来也成为最常见的默认组合之一。
entropy coefficient 控制探索强度。过大时策略始终过于随机,难以形成精确控制;过小时策略可能过早塌缩。
value loss coefficient 控制 Critic 误差在共享优化中的权重。若 Actor 和 Critic 完全分开并使用不同优化器,这个系数的意义会有所不同。
二十、训练日志中常见指标应该怎样看
policy loss 单独看通常意义有限,而且不同代码库符号相反。更重要的是结合 KL、clip fraction、entropy 和 reward 观察。
approx_kl 反映新旧策略的平均差异。它持续很小,可能说明更新过于保守;突然很大,则可能意味着学习率太高或训练 epoch 太多。
clip_fraction 表示有多少样本的概率比率越过了 clip 边界。它很高说明大量样本已经进入截平区,当前 batch 正被较激进地利用;长期接近零可能说明更新非常小。不过不存在脱离具体任务的绝对理想值。
entropy 反映策略随机性。它持续快速下降可能意味着探索过早消失;但在连续控制中,熵的绝对值依赖动作维数和分布参数化,不能跨任务简单比较。
value loss 反映 Critic 拟合误差,但其尺度取决于奖励大小。奖励放大十倍,value target 和 value loss 也会大幅变化,因此更适合看趋势,而不是孤立看绝对值。
episode reward 是最直接的总体指标,但也要拆解各个 reward component。机器人总奖励升高不一定表示真正学会了任务,也可能是利用了奖励函数漏洞,例如通过抖动获取存活奖励,或者以异常姿态换取局部速度奖励。
二十一、论文实验真正说明了什么
论文首先在七个 MuJoCo 连续控制任务上比较不同代理目标。没有 clipping 或 penalty 的版本表现最差,甚至因为 HalfCheetah 中出现严重负回报而得到负的平均归一化分数;clip 版本中 $\epsilon=0.2$ 最好,优于多组固定和自适应 KL penalty。这个实验支持了论文最核心的判断:同一批数据进行多轮优化时,必须限制策略更新,而简单的 ratio clipping 是有效且容易使用的方式。
随后,论文把 PPO 与 TRPO、vanilla policy gradient、A2C、带 trust region 的 A2C 和 CEM 等方法比较。在当时的 MuJoCo 基准上,PPO 几乎在所有连续控制任务中都取得了更好的结果。论文还在高维 3D humanoid 任务中展示了跑步、转向和跌倒后起身等行为,说明 PPO 能够扩展到复杂连续控制。
在 Atari 上,PPO 与 A2C 和 ACER 比较。按照整个训练期的平均 episode reward,PPO 在 49 个游戏中的 30 个取得最好结果;按照最后 100 个 episode 的最终表现,ACER 赢得更多游戏。论文据此并不是声称 PPO 在所有任务和所有指标上都绝对最好,而是强调它在性能、样本复杂度、实现难度和 wall-clock time 之间取得了较好的综合平衡。
二十二、PPO 的贡献应该怎样准确概括
PPO 没有发明策略梯度,也没有发明 Actor-Critic、优势函数或 GAE。它建立在此前 policy gradient、TRPO 和 GAE 的基础上。
它最重要的贡献是提出一个极其简单的 clipped surrogate objective,使 on-policy 策略梯度可以对同一批 rollout 数据进行多轮 minibatch SGD,同时减少过大策略更新带来的崩溃风险。
从算法思想上,它是在近似 TRPO 的信赖域更新;从工程角度看,它把复杂的二阶约束优化转化成普通 Adam 可以直接训练的目标;从历史影响看,它大幅降低了稳定训练 policy gradient 的实现门槛。
二十三、PPO 并没有提供哪些保证
虽然论文用"pessimistic estimate"描述 clipped objective,但不能把它理解成对真实策略性能的严格全局下界。它主要是对未裁剪代理目标逐样本构造的保守形式,不代表新策略在真实环境中的回报一定提升。
PPO 也没有严格保证新旧策略的 KL 一定很小。比率是针对采样到的动作计算的,而且神经网络参数共享会使不同状态相互影响。某些样本被裁剪后,其他样本仍可推动参数继续变化。
它也没有解决 reward design、exploration、credit assignment、partial observability 和 sim-to-real gap。PPO 只是提供了较稳定的策略更新机制。如果奖励函数有漏洞、观测不足、控制动作定义不合理或仿真动力学偏差过大,PPO 仍然会失败。
此外,PPO 的样本效率并不算高。它要反复与环境交互,并在每轮更新后丢弃旧数据。之所以在机器人仿真中仍然流行,是因为仿真可以高度并行,采样吞吐量很大,而 PPO 本身实现简单、计算规律、容易扩展到成千上万个环境。
二十四、把整篇论文压缩成一段训练逻辑
PPO 首先用当前策略在大量并行环境中运行若干步,保存状态、动作、奖励、旧策略 log probability 和价值预测;随后利用 Critic 和 GAE 估计每个动作比平均水平好多少。优化时重新计算新策略对旧动作的概率,通过新旧概率比率判断动作概率改变了多少:正优势动作应该提高概率,负优势动作应该降低概率,但当这种改变超过约 $1\pm\epsilon$ 后,裁剪目标不再奖励继续朝同一方向扩大。与此同时,Critic 拟合回报目标,熵项鼓励探索。整批数据进行若干轮 minibatch Adam 更新后被丢弃,再用更新后的策略重新采样。论文的核心价值就在于:它让"采一次、训练多轮"这件事变得相对可靠,而实现成本仅比普通 Actor-Critic 多出概率比率和一项 clip 运算。