强化学习(14):PPO——近端策略优化与裁剪目标

从 A2C 到 PPO
上一篇已经讨论过 A2C 与 A3C。它们仍然建立在行动器—评判器(Actor-Critic)框架之上:Actor 负责学习参数化策略
$$ \pi(a\mid s;\boldsymbol{\theta}) $$Critic 负责估计状态价值
$$ V(s;\mathbf{w}) $$并利用价值估计构造优势信号,为 Actor 的策略更新提供依据。
如果使用优势估计 $\hat A_t$,Actor 的基本更新形式可以写成
$$ \boldsymbol{\theta} \leftarrow \boldsymbol{\theta} + \alpha \hat A_t \nabla_{\boldsymbol{\theta}} \log \pi(a_t\mid s_t;\boldsymbol{\theta}) $$其中,$\hat A_t$ 衡量动作 $a_t$ 相对于当前状态平均水平的好坏。
当
$$ \hat A_t>0 $$时,当前动作的表现高于预期,梯度更新会倾向于提高策略在状态 $s_t$ 下选择动作 $a_t$ 的概率;当
$$ \hat A_t<0 $$时,更新则倾向于降低该动作的概率。
A2C 在这一结构上进一步采用同步的并行采样方式。多个环境副本同时运行当前策略,收集一批轨迹数据,然后根据这些数据计算价值目标和优势估计,再统一更新 Actor 与 Critic。这样可以提高采样效率,同时获得更加丰富的一批训练数据。
因此,从上一篇结束的位置来看,我们已经具备了后续 PPO 所需要的大部分基本结构:
- 参数化的随机策略 $\pi(a\mid s;\boldsymbol{\theta})$;
- Critic 提供的状态价值估计 $V(s;\mathbf{w})$;
- 用于策略更新的优势估计 $\hat A_t$;
- 多个环境并行收集一批训练轨迹;
- 根据一批样本进行梯度优化。
PPO 并没有放弃这些结构。实际使用的 PPO 通常仍然采用 Actor-Critic,也通常利用多个并行环境采样,并通过优势估计来训练 Actor。
真正需要继续处理的是策略应该怎样更新。
前面的策略梯度公式告诉了我们一个局部方向:
$$ \hat A_t \nabla_{\boldsymbol{\theta}} \log \pi(a_t\mid s_t;\boldsymbol{\theta}) $$它说明,在当前参数附近,应当怎样改变 $\boldsymbol{\theta}$ 才能提高预期回报。但是,这个梯度方向本身并没有直接规定:一次参数更新之后,新策略可以和原来的策略相差多大。
更新幅度当然会受到学习率 $\alpha$ 的影响,但学习率限制的是参数空间中的步长。对于神经网络策略来说,参数变化多大与最终动作概率变化多大之间并不存在简单的一一对应关系。一次看似正常的参数更新,也可能使某些状态下的动作概率发生较明显的改变。
这一点在策略梯度方法中尤其值得关注,因为训练数据本身是由策略产生的。
假设当前使用策略
$$ \pi_{\boldsymbol{\theta}_{\mathrm{old}}} $$与环境交互,并通过多个并行环境收集出一批轨迹。这批轨迹反映的是旧策略
$$ \pi_{\boldsymbol{\theta}_{\mathrm{old}}}(a\mid s) $$所产生的数据分布。
随后,我们利用这批数据更新策略参数,得到新的策略
$$ \pi_{\boldsymbol{\theta}}(a\mid s) $$如果一次更新之后,新策略已经和采样时的旧策略相差很大,那么当前这批轨迹对于新策略的代表性就会明显下降。我们仍然在利用“旧策略产生的数据”训练一个已经发生较大变化的新策略,梯度估计与当前策略之间的偏差可能随之增加,训练过程也更容易产生较大的波动。
而且在实际深度强化学习中,我们通常希望对刚刚采集的一批数据进行多次梯度更新,以提高样本利用率。如果每一次梯度更新都可以自由地大幅改变策略,那么随着更新次数增加,新策略会越来越远离产生这批数据的旧策略,这个问题会更加明显。
因此,在 Actor-Critic、优势估计和并行采样已经建立之后,策略优化还需要解决一个新的核心问题:
怎样利用当前这批数据持续改进策略,同时避免新策略在一次训练阶段中偏离旧策略过远?
近端策略优化(Proximal Policy Optimization, PPO)正是围绕这一问题展开的。
它的核心出发点可以先概括为:在继续使用策略梯度和优势估计的同时,对新旧策略之间的变化进行控制,使每一轮策略优化尽量发生在旧策略附近。
要理解 PPO 如何实现这一点,下一步需要先把“旧策略”和“正在优化的新策略”严格区分开,并进一步讨论为什么限制两者之间的差异会与信赖域(Trust Region)思想联系起来。
策略更新幅度与信赖域
前面已经看到,普通策略梯度给出了策略参数的更新方向:
$$ \boldsymbol{\theta} \leftarrow \boldsymbol{\theta} + \alpha \hat A_t \nabla_{\boldsymbol{\theta}} \log\pi(a_t\mid s_t;\boldsymbol{\theta}) $$这个更新规则关注的是:根据当前样本和优势估计,怎样调整参数才能提高策略目标。
但在实际训练中,还需要进一步考虑更新之后的策略发生了多大变化。
设当前用于采样的策略为
$$ \pi_{\boldsymbol{\theta}_{\mathrm{old}}}(a\mid s) $$利用这一策略与环境交互后,可以得到一批轨迹数据。随后,我们根据这些轨迹计算优势估计 $\hat A_t$,并开始优化新的策略
$$ \pi_{\boldsymbol{\theta}}(a\mid s) $$在一次训练刚开始时,通常有
$$ \boldsymbol{\theta} = \boldsymbol{\theta}_{\mathrm{old}} $$因此新旧策略完全相同。
但是随着梯度更新不断进行,参数 $\boldsymbol{\theta}$ 会逐渐偏离 $\boldsymbol{\theta}_{\mathrm{old}}$,对应的动作概率分布也会发生变化。
问题的关键就在这里:当前用于优化的数据仍然来自旧策略,而正在优化的策略却在不断变化。
如果新策略只发生较小变化,那么旧策略采集的数据通常仍然能够较合理地反映新策略附近的情况。但如果一次训练过程中策略变化很大,新策略在相同状态下可能已经给出完全不同的动作概率,此时原有数据对于当前策略的代表性会下降。
例如,假设旧策略在某个状态 $s$ 下对两个动作给出的概率为
$$ \pi_{\boldsymbol{\theta}_{\mathrm{old}}}(a_1\mid s)=0.5 $$$$ \pi_{\boldsymbol{\theta}_{\mathrm{old}}}(a_2\mid s)=0.5 $$因此,在旧策略采集的数据中,两个动作都有较大概率出现。
如果经过一次较大的策略更新后,新策略变成
$$ \pi_{\boldsymbol{\theta}}(a_1\mid s)=0.99 $$$$ \pi_{\boldsymbol{\theta}}(a_2\mid s)=0.01 $$那么当前新策略的行为已经与生成这批数据时的策略明显不同。之前关于 $a_2$ 的大量样本,是在一个会频繁选择 $a_2$ 的策略下得到的;而当前策略几乎已经不再选择它。
因此,随着新旧策略差异增大,继续反复利用这一批旧数据更新当前策略时,就需要更加谨慎。
这种现象和同策略学习中的数据分布有关。
对于同策略(On-policy)方法,我们通常希望训练数据来自当前策略,或者至少来自与当前策略足够接近的策略。策略更新之后,新的策略又会改变接下来访问哪些状态、采取哪些动作以及产生怎样的轨迹。因此,策略和训练数据之间存在直接联系。
这也说明,仅仅通过调小学习率 $\alpha$ 并不能完整解决这个问题。
学习率控制的是神经网络参数
$$ \boldsymbol{\theta} $$每次改变多少,但我们真正关心的是策略分布
$$ \pi_{\boldsymbol{\theta}}(\cdot\mid s) $$改变多少。
对于复杂神经网络来说,参数空间中的相同步长,并不意味着策略概率空间中的相同变化。在某些状态附近,参数稍微变化就可能明显改变动作分布;在另一些状态附近,即使参数变化较大,策略输出也可能变化有限。
因此,一个更直接的想法是:**既然真正需要控制的是策略本身的变化,那么可以直接约束新策略与旧策略之间的距离。**这就是信赖域(Trust Region)思想进入策略优化的位置。
所谓信赖域,可以先从非常直观的角度理解:每次更新时,只允许新策略在旧策略附近的一定范围内进行优化。也就是说,我们希望在提高策略目标的同时,避免一次更新使策略发生过大的变化。
可以把这一思想抽象地写成
$$ \max_{\boldsymbol{\theta}} \quad L(\boldsymbol{\theta}) $$同时要求
$$ D\left( \pi_{\boldsymbol{\theta}_{\mathrm{old}}}, \pi_{\boldsymbol{\theta}} \right) \leq \delta $$其中,$L(\boldsymbol{\theta})$ 表示希望优化的策略目标,而
$$ D\left( \pi_{\boldsymbol{\theta}_{\mathrm{old}}}, \pi_{\boldsymbol{\theta}} \right) $$表示新旧策略之间的某种差异度量,$\delta$ 则限制允许的变化范围。
在强化学习中,常见的策略分布差异度量之一是 KL 散度(Kullback-Leibler Divergence, KL Divergence)。基于这一思想,一个重要的方法是信赖域策略优化(Trust Region Policy Optimization, TRPO)。
TRPO 希望在优化策略的同时显式约束新旧策略之间的 KL 散度,从而避免策略一步变化过大。从思想上看,它直接解决了前面提出的问题:怎样让策略改进发生在旧策略附近。
不过,TRPO 的实际求解过程较复杂。它涉及二阶近似以及相应的约束优化过程,实现和计算成本都高于普通的一阶梯度优化。
PPO 延续了同样的基本目标:**希望策略能够持续改进,同时避免一次训练阶段中偏离旧策略过远。**它采取了更容易实现的处理方式,不再要求每一步都显式求解严格的信赖域约束,而是通过构造特殊的优化目标,对过大的策略变化进行抑制。
要理解 PPO 怎样做到这一点,接下来需要首先建立一个能够直接描述“新策略相对于旧策略如何变化”的量。这个量就是新旧策略的概率比率(Probability Ratio)。
新旧策略与概率比率
为了描述一次策略更新到底发生了多大变化,PPO 首先需要明确区分两套策略。
第一套是用于收集当前这批训练数据的旧策略(Old Policy):
$$ \pi_{\boldsymbol{\theta}_{\mathrm{old}}}(a\mid s) $$其中,$\boldsymbol{\theta}_{\mathrm{old}}$ 表示采样时使用的策略参数。
第二套是当前正在通过梯度更新进行优化的新策略(New Policy):
$$ \pi_{\boldsymbol{\theta}}(a\mid s) $$其中,$\boldsymbol{\theta}$ 是当前正在优化的策略参数。
在一轮 PPO 训练刚开始时,通常有
$$ \boldsymbol{\theta} = \boldsymbol{\theta}_{\mathrm{old}} $$因此,此时新旧策略完全相同。随后固定这一批由旧策略采集的数据,并对 $\boldsymbol{\theta}$ 进行多次梯度更新。随着优化过程进行,新策略逐渐变化,而旧策略仍然保持不变,作为这一批训练数据对应的参考策略。
因此,在这一轮优化过程中,需要始终区分
$$ \pi_{\boldsymbol{\theta}_{\mathrm{old}}} $$和
$$ \pi_{\boldsymbol{\theta}} $$前者表示产生当前这批数据的策略,后者表示当前正在被优化的策略。
有了这一区分之后,就可以进一步衡量:对于某个已经采样到的状态—动作对 $(s_t,a_t)$,新策略相对于旧策略,对动作 $a_t$ 的选择倾向发生了怎样的变化。
PPO 为此引入了概率比率(Probability Ratio):
$$ r_t(\boldsymbol{\theta}) = \frac{ \pi_{\boldsymbol{\theta}}(a_t\mid s_t) }{ \pi_{\boldsymbol{\theta}_{\mathrm{old}}}(a_t\mid s_t) } $$这个比率比较的是:在同一个状态 $s_t$ 下,新策略和旧策略分别给动作 $a_t$ 多大的概率。
如果
$$ r_t(\boldsymbol{\theta})=1 $$那么有
$$ \pi_{\boldsymbol{\theta}}(a_t\mid s_t) = \pi_{\boldsymbol{\theta}_{\mathrm{old}}}(a_t\mid s_t) $$说明新旧策略对当前动作给出的概率相同。
如果
$$ r_t(\boldsymbol{\theta})>1 $$那么有
$$ \pi_{\boldsymbol{\theta}}(a_t\mid s_t) > \pi_{\boldsymbol{\theta}_{\mathrm{old}}}(a_t\mid s_t) $$说明新策略提高了动作 $a_t$ 在状态 $s_t$ 下被选择的概率。
相反,如果
$$ r_t(\boldsymbol{\theta})<1 $$则说明新策略降低了该动作的概率。
例如,假设旧策略在状态 $s_t$ 下选择动作 $a_t$ 的概率为
$$ \pi_{\boldsymbol{\theta}_{\mathrm{old}}}(a_t\mid s_t)=0.4 $$更新之后,新策略给出的概率变为
$$ \pi_{\boldsymbol{\theta}}(a_t\mid s_t)=0.48 $$那么概率比率为
$$ r_t(\boldsymbol{\theta}) = \frac{0.48}{0.4} = 1.2 $$这表示新策略将该动作的概率提高到了旧策略的 $1.2$ 倍。
如果新策略将该动作的概率降低到
$$ \pi_{\boldsymbol{\theta}}(a_t\mid s_t)=0.32 $$那么
$$ r_t(\boldsymbol{\theta}) = \frac{0.32}{0.4} = 0.8 $$表示新策略将该动作的概率降低到了旧策略的 $0.8$ 倍。
因此,$r_t(\boldsymbol{\theta})$ 可以看作一个局部的策略变化指标。它关注的并不是策略网络参数 $\boldsymbol{\theta}$ 本身变化了多少,而是在当前采样到的状态—动作对上,新策略相对于旧策略改变了多少动作概率。
这里需要特别注意符号。
在强化学习的交互过程中,通常使用
$$ r_t $$表示时刻 $t$ 获得的奖励。而在 PPO 中,又经常使用
$$ r_t(\boldsymbol{\theta}) $$表示新旧策略之间的概率比率。
两者只是使用了相同的字母 $r$,含义完全不同。后文中带有参数 $\boldsymbol{\theta}$ 的 $r_t(\boldsymbol{\theta})$ 都表示策略概率比率。
概率比率还有另一个重要作用:它使我们能够利用旧策略采集的数据构造与新策略有关的优化目标。这里需要简单引入重要性采样(Importance Sampling)的基本思想。
假设希望计算随机变量在分布 $p(x)$ 下的期望
$$ \mathbb E_{x\sim p}[f(x)] $$但手中的样本实际上来自另一个分布 $q(x)$。在满足相应条件时,可以写成
$$ \mathbb E_{x\sim p}[f(x)] = \mathbb E_{x\sim q} \left[ \frac{p(x)}{q(x)}f(x) \right] $$其中
$$ \frac{p(x)}{q(x)} $$就是重要性采样中的权重。
它的作用是根据两个分布之间的概率比例,对来自 $q(x)$ 的样本重新加权,使这些样本能够用于估计与 $p(x)$ 有关的期望。
PPO 中存在类似的关系。
当前这批动作 $a_t$ 是由旧策略
$$ \pi_{\boldsymbol{\theta}_{\mathrm{old}}}(a_t\mid s_t) $$采样得到的,而我们希望利用这些样本优化新的策略
$$ \pi_{\boldsymbol{\theta}}(a_t\mid s_t) $$因此,可以利用两者的概率比率
$$ \frac{ \pi_{\boldsymbol{\theta}}(a_t\mid s_t) }{ \pi_{\boldsymbol{\theta}_{\mathrm{old}}}(a_t\mid s_t) } $$对旧策略产生的样本进行重新加权。
这正是
$$ r_t(\boldsymbol{\theta}) $$在 PPO 中出现的重要原因。
这里不需要展开完整的重要性采样理论。对于理解 PPO,只需要抓住下面这一点:
数据由旧策略产生,而当前优化的是新策略,因此可以利用新旧策略的概率比率描述两者之间的差异,并调整旧策略样本在新策略目标中的作用。
将这个概率比率与前面已经使用的优势估计 $\hat A_t$ 结合起来,可以得到一个重要的中间目标:
$$ L^{\mathrm{PG}}(\boldsymbol{\theta}) = \mathbb E_t \left[ r_t(\boldsymbol{\theta})\hat A_t \right] $$这个目标通常称为代理目标(Surrogate Objective)。
它仍然保留了普通策略梯度的基本含义:优势为正的动作应该提高概率,优势为负的动作应该降低概率。此时,策略变化被显式表示在概率比率
$$ r_t(\boldsymbol{\theta}) $$之中。
接下来就可以进一步分析,当 $\hat A_t>0$ 和 $\hat A_t<0$ 时,最大化
$$ r_t(\boldsymbol{\theta})\hat A_t $$会怎样推动策略变化,以及为什么仅使用这一目标仍然无法有效限制策略更新幅度。
未裁剪的代理目标
前面已经引入了新旧策略之间的概率比率
$$ r_t(\boldsymbol{\theta}) = \frac{ \pi_{\boldsymbol{\theta}}(a_t\mid s_t) }{ \pi_{\boldsymbol{\theta}_{\mathrm{old}}}(a_t\mid s_t) } $$它描述了对于已经采样到的状态—动作对 $(s_t,a_t)$,新策略相对于旧策略如何改变当前动作的选择概率。将这个概率比率与优势估计 $\hat A_t$ 结合起来,可以得到一个用于优化策略的目标:
$$ L^{\mathrm{PG}}(\boldsymbol{\theta}) = \mathbb E_t \left[ r_t(\boldsymbol{\theta})\hat A_t \right] $$这个目标通常称为代理目标(Surrogate Objective)。这里的“代理”表示,我们利用旧策略采集的数据、优势估计以及新旧策略之间的概率比率,构造一个更便于优化的策略目标。
理解这个目标时,关键是分别讨论 $\hat A_t>0$ 和 $\hat A_t<0$ 两种情况。
先考虑
$$ \hat A_t>0 $$这表示动作 $a_t$ 在状态 $s_t$ 下的表现高于当前策略的平均水平,因此策略应该提高这个动作被选择的概率。
对于这一条样本,代理目标中的对应项为
$$ r_t(\boldsymbol{\theta})\hat A_t $$由于 $\hat A_t$ 为正,如果希望最大化这一项,就需要增大
$$ r_t(\boldsymbol{\theta}) $$而在当前这一轮 PPO 优化过程中,旧策略
$$ \pi_{\boldsymbol{\theta}_{\mathrm{old}}}(a_t\mid s_t) $$保持固定,因此增大概率比率实际上意味着增大
$$ \pi_{\boldsymbol{\theta}}(a_t\mid s_t) $$也就是提高新策略选择动作 $a_t$ 的概率。
例如,假设
$$ \hat A_t=2 $$当新旧策略完全相同时,
$$ r_t(\boldsymbol{\theta})=1 $$于是
$$ r_t(\boldsymbol{\theta})\hat A_t = 1\times 2 = 2 $$如果策略更新后概率比率变为
$$ r_t(\boldsymbol{\theta})=1.2 $$那么目标值变为
$$ 1.2\times 2 = 2.4 $$目标值提高,因此优化过程会倾向于继续提高这个动作的概率。
再考虑
$$ \hat A_t<0 $$此时动作 $a_t$ 的表现低于状态 $s_t$ 下的平均水平,因此策略应该降低这个动作被选择的概率。
由于 $\hat A_t$ 是负数,要使
$$ r_t(\boldsymbol{\theta})\hat A_t $$增大,就需要减小 $r_t(\boldsymbol{\theta})$。
例如,假设
$$ \hat A_t=-2 $$当
$$ r_t(\boldsymbol{\theta})=1 $$时,
$$ r_t(\boldsymbol{\theta})\hat A_t = -2 $$如果概率比率降低到
$$ r_t(\boldsymbol{\theta})=0.8 $$那么
$$ r_t(\boldsymbol{\theta})\hat A_t = 0.8\times(-2) = -1.6 $$由于
$$ -1.6>-2 $$所以目标值提高了。
因此,当 $\hat A_t<0$ 时,最大化代理目标会推动 $r_t(\boldsymbol{\theta})$ 减小,也就是降低新策略选择当前动作的概率。
于是,未裁剪代理目标的基本作用可以概括为:
- 当 $\hat A_t>0$ 时,提高当前动作的概率;
- 当 $\hat A_t<0$ 时,降低当前动作的概率。
这与普通策略梯度的基本方向是一致的。区别在于,现在新旧策略之间的变化已经通过概率比率 $r_t(\boldsymbol{\theta})$ 显式表示出来。
在一轮策略优化刚开始时,有
$$ \boldsymbol{\theta} = \boldsymbol{\theta}_{\mathrm{old}} $$因此
$$ r_t(\boldsymbol{\theta})=1 $$随着对同一批数据进行梯度更新,新策略逐渐变化,$r_t(\boldsymbol{\theta})$ 也开始偏离 $1$。
但如果只使用
$$ L^{\mathrm{PG}}(\boldsymbol{\theta})= \mathbb E_t \left[ r_t(\boldsymbol{\theta})\hat A_t \right] $$仍然没有直接限制概率比率能够偏离 $1$ 多远。
例如,当
$$ \hat A_t=2 $$时,如果
$$ r_t(\boldsymbol{\theta})=1 $$目标值为
$$ 2 $$当
$$ r_t(\boldsymbol{\theta})=1.5 $$时,目标值变为
$$ 3 $$如果继续增大到
$$ r_t(\boldsymbol{\theta})=2 $$目标值进一步变成
$$ 4 $$从这个目标本身来看,只要 $\hat A_t>0$,继续提高动作概率就能够持续增加目标值,并没有一个明确的位置告诉优化器当前动作的概率已经提高得足够多。
负优势下也有类似情况。
如果
$$ \hat A_t<0 $$那么不断减小 $r_t(\boldsymbol{\theta})$ 会持续提高目标值,因此优化过程可能继续压低当前动作的概率。
这说明,概率比率虽然让我们能够描述新旧策略之间的变化,但单独使用
$$ r_t(\boldsymbol{\theta})\hat A_t $$仍然无法有效控制策略更新幅度。
这一点在 PPO 中尤其重要,因为同一批由旧策略采集的数据通常会被划分为多个 mini-batch,并用于多个 epoch 的梯度更新。随着更新次数增加,新策略可能逐渐远离产生这批数据的旧策略,使某些状态—动作对对应的概率比率明显偏离 $1$。
因此,PPO 接下来需要解决的问题已经很明确:**当概率变化已经足够大之后,怎样减少继续沿着同一方向大幅改变策略的动力。**PPO-Clip 的核心做法,就是在这个未裁剪代理目标的基础上,对概率比率引入裁剪机制。
PPO-Clip 的裁剪目标
前面已经看到,如果只使用未裁剪的代理目标
$$ L^{\mathrm{PG}}(\boldsymbol{\theta}) = \mathbb E_t \left[ r_t(\boldsymbol{\theta})\hat A_t \right] $$那么只要某个方向能够提高目标值,优化过程就可能持续推动概率比率 $r_t(\boldsymbol{\theta})$ 远离 $1$。因此,PPO-Clip 在这个目标上进一步加入了裁剪机制。
PPO-Clip 的核心目标写作
$$ L^{\mathrm{CLIP}}(\boldsymbol{\theta}) = \mathbb E_t \left[ \min \left( r_t(\boldsymbol{\theta})\hat A_t, \operatorname{clip} \left( r_t(\boldsymbol{\theta}), 1-\epsilon, 1+\epsilon \right) \hat A_t \right) \right] $$其中,$\epsilon$ 是一个较小的正数,用来确定裁剪区间
$$ [1-\epsilon,\;1+\epsilon] $$例如,当
$$ \epsilon=0.2 $$时,裁剪区间就是
$$ [0.8,\;1.2] $$这里的裁剪函数定义为
$$ \operatorname{clip}(r_t,1-\epsilon,1+\epsilon) = \begin{cases} 1-\epsilon, & r_t<1-\epsilon \\ r_t, & 1-\epsilon\le r_t\le 1+\epsilon \\ 1+\epsilon, & r_t>1+\epsilon \end{cases} $$也就是说,如果概率比率位于区间内部,就保持原值;如果超出区间,就把它截到对应的边界。
不过,仅仅看到这个 $\operatorname{clip}$ 还不足以理解 PPO。真正关键的是,它后面还乘上了优势估计 $\hat A_t$,并且最终还要与原始目标通过 $\min$ 进行比较。
因此,需要分别讨论正优势和负优势两种情况。
先考虑
$$ \hat A_t>0 $$此时当前动作表现好于平均水平,因此我们希望提高动作概率,也就是推动
$$ r_t(\boldsymbol{\theta})>1 $$假设
$$ \epsilon=0.2 $$那么当概率比率从 $1$ 增大到 $1.1$ 时,它仍然位于裁剪区间内部,因此
$$ \operatorname{clip}(1.1,0.8,1.2)=1.1 $$两个目标完全相同:
$$ r_t\hat A_t = 1.1\hat A_t $$以及
$$ \operatorname{clip}(r_t,0.8,1.2)\hat A_t = 1.1\hat A_t $$因此,此时 PPO 与普通代理目标没有区别,仍然会鼓励提高这个动作的概率。
如果继续更新,使
$$ r_t=1.2 $$那么仍然刚好处于允许范围的上边界。
但如果进一步增大到
$$ r_t=1.5 $$那么裁剪之后得到
$$ \operatorname{clip}(1.5,0.8,1.2)=1.2 $$于是两个候选目标分别为
$$ 1.5\hat A_t $$和
$$ 1.2\hat A_t $$由于 $\hat A_t>0$,显然有
$$ 1.2\hat A_t < 1.5\hat A_t $$而 PPO 取两者中的较小值,因此
$$ \min \left( 1.5\hat A_t, 1.2\hat A_t \right) = 1.2\hat A_t $$这意味着,当 $r_t$ 已经超过 $1+\epsilon$ 后,继续提高当前动作概率,不再使这一条样本的 PPO 目标继续增加。
因此,在正优势情况下,PPO 会限制优化器继续大幅提高该动作概率的动力。
可以把这种情况写成
$$ \hat A_t>0 $$时,
$$ L_t^{\mathrm{CLIP}} = \begin{cases} r_t\hat A_t, & r_t\le 1+\epsilon \\ (1+\epsilon)\hat A_t, & r_t>1+\epsilon \end{cases} $$这里真正受到限制的是“继续向有利方向增大概率”的收益。
接下来考虑
$$ \hat A_t<0 $$此时动作表现低于平均水平,因此策略希望降低这个动作的概率,也就是推动
$$ r_t(\boldsymbol{\theta})<1 $$仍然令
$$ \epsilon=0.2 $$如果概率比率下降到
$$ r_t=0.9 $$它仍然位于区间 $[0.8,1.2]$ 内,因此没有发生裁剪:
$$ \operatorname{clip}(0.9,0.8,1.2)=0.9 $$于是 PPO 仍然会鼓励继续降低这个动作的概率。
如果进一步下降到
$$ r_t=0.5 $$那么裁剪之后得到
$$ \operatorname{clip}(0.5,0.8,1.2)=0.8 $$此时两个候选目标分别为
$$ 0.5\hat A_t $$和
$$ 0.8\hat A_t $$由于现在
$$ \hat A_t<0 $$乘以负数之后,大小关系会反过来。例如取
$$ \hat A_t=-2 $$那么
$$ 0.5\times(-2)=-1 $$而
$$ 0.8\times(-2)=-1.6 $$因此
$$ -1.6<-1 $$PPO 使用 $\min$,所以会选择
$$ 0.8\hat A_t $$也就是裁剪后的结果。
于是,当 $r_t$ 已经低于 $1-\epsilon$ 后,继续降低动作概率,也不会再让 PPO 的目标继续提高。
对于负优势,可以写成
$$ \hat A_t<0 $$时,
$$ L_t^{\mathrm{CLIP}} = \begin{cases} (1-\epsilon)\hat A_t, & r_t<1-\epsilon \\ r_t\hat A_t, & r_t\ge 1-\epsilon \end{cases} $$因此,PPO 在两种情况下形成了对称的效果:
当
$$ \hat A_t>0 $$时,希望提高动作概率,但当
$$ r_t>1+\epsilon $$之后,不再继续奖励这种增大。
当
$$ \hat A_t<0 $$时,希望降低动作概率,但当
$$ r_t<1-\epsilon $$之后,不再继续奖励这种减小。
这也解释了为什么 PPO 的公式中必须使用
$$ \min $$而不能只写成
$$ \operatorname{clip}(r_t,1-\epsilon,1+\epsilon)\hat A_t $$因为 PPO 希望限制的是“过度朝有利方向更新”的收益,同时保留那些使目标变差的变化。
例如,当
$$ \hat A_t>0 $$但策略却错误地让
$$ r_t<1-\epsilon $$时,动作概率正在明显下降,这与正优势希望提高动作概率的方向相反。
此时 PPO 不会使用裁剪后的
$$ (1-\epsilon)\hat A_t $$来掩盖这种下降,而是通过 $\min$ 保留更小的原始目标
$$ r_t\hat A_t $$从而让这种不利变化仍然体现在优化目标中。
同理,当
$$ \hat A_t<0 $$但策略却使
$$ r_t>1+\epsilon $$时,当前动作的概率反而被明显提高。由于这是与优势方向相反的变化,PPO 同样不会把它简单截断掉,而会保留更差的原始目标。
因此,$\min$ 的作用可以理解为:在原始代理目标和裁剪代理目标之间,选择一个更保守的值。
从这个角度看,PPO-Clip 构造的是一个相对保守的代理目标。它允许策略朝优势估计所指示的方向改进,但当某个状态—动作对上的变化已经比较大时,就停止继续给予额外的优化收益。
这里还需要特别澄清一个很容易误解的地方。
PPO 中的
$$ \operatorname{clip} \left( r_t(\boldsymbol{\theta}), 1-\epsilon, 1+\epsilon \right) $$裁剪的是用于计算代理目标的概率比率,而不是策略参数 $\boldsymbol{\theta}$。
因此,PPO 并没有要求
$$ \boldsymbol{\theta} \in [1-\epsilon,1+\epsilon] $$这样的参数约束。
同时,PPO-Clip 也没有严格要求所有状态—动作对都满足
$$ 1-\epsilon \le r_t(\boldsymbol{\theta}) \le 1+\epsilon $$在实际优化过程中,$r_t(\boldsymbol{\theta})$ 完全可能超出这个范围。
裁剪机制真正改变的是:当概率比率在某些方向上超出区间之后,这些进一步的变化是否还能够继续提高代理目标。
因此,更准确地说,PPO-Clip 是通过修改优化目标来抑制过大的策略更新动力,而不是对整个新策略施加一个严格的硬约束。
同样地,它也不能保证新旧策略之间的 KL 散度一定低于某个固定值。裁剪目标提供的是一种简单的一阶近似控制机制,其目的在于让策略更新通常保持在相对合理的范围内。
这样,PPO 最核心的裁剪思想就可以概括为:
$$ \text{有利的更新} \quad\longrightarrow\quad \text{允许进行} $$$$ \text{有利但已经过大的更新} \quad\longrightarrow\quad \text{不再继续给予额外收益} $$而这正是 PPO 相比普通策略梯度最关键的改动。
Critic 的价值函数学习
前面已经讨论了 PPO-Clip 的核心思想:通过裁剪代理目标,减少策略在一次训练阶段中过度偏离旧策略的动力。到目前为止,讨论的重点主要集中在 Actor 的策略更新上。但 PPO 通常仍然采用 Actor-Critic 框架,因此除了更新策略之外,还需要训练 Critic,使其能够为后续策略更新提供可靠的价值估计。
在 PPO 中,Actor 使用参数化策略
$$ \pi(a\mid s;\boldsymbol{\theta}) $$根据状态选择动作,并通过最大化裁剪代理目标
$$ L^{\mathrm{CLIP}}(\boldsymbol{\theta}) $$来更新策略参数 $\boldsymbol{\theta}$。
Critic 则使用参数化价值函数
$$ V(s;\mathbf{w}) $$估计状态 $s$ 在当前策略下的长期期望回报,其中 $\mathbf{w}$ 表示价值网络参数。
Critic 的学习目标与前面 Actor-Critic 方法中的价值学习基本一致:利用采样得到的回报信息构造价值目标,再让当前价值函数的预测尽可能接近这个目标。
对于时刻 $t$ 的状态 $s_t$,假设根据采样轨迹构造了一个价值目标
$$ \hat V_t $$那么 Critic 的价值损失(Value Loss)可以写成
$$ L^V(\mathbf{w}) = \mathbb E_t \left[ \left( V(s_t;\mathbf{w})-\hat V_t \right)^2 \right] $$其中,$V(s_t;\mathbf{w})$ 是 Critic 当前给出的状态价值估计,$\hat V_t$ 是根据采样经验计算得到的目标值。两者之差衡量了当前预测与目标之间的偏差。
通过最小化这一损失,可以不断更新 $\mathbf{w}$,使 Critic 的价值估计逐渐接近采样数据所提供的学习目标。
这里的关键是如何构造 $\hat V_t$。
一种直接的方法是使用前面介绍过的完整回报 $G_t$。对于一个已经结束的回合,可以计算
$$ G_t = r_t+\gamma r_{t+1}+\gamma^2r_{t+2}+\cdots $$然后令
$$ \hat V_t=G_t $$这样,Critic 就通过拟合实际采样得到的回报来学习状态价值。
但是,完整回报通常具有较大的方差,而且 PPO 在实际训练中经常只从并行环境收集固定长度的轨迹,并不要求所有环境都完成整个回合。因此,更常见的做法是利用已有的价值估计构造多步目标。
例如,使用前面介绍过的 $n$-step 回报,可以得到
$$ \hat V_t = r_t+\gamma r_{t+1} +\cdots +\gamma^{n-1}r_{t+n-1} +\gamma^n V(s_{t+n};\mathbf{w}_{\mathrm{old}}) $$这里假设采样区间内没有提前终止的回合。其中,前 $n$ 步使用真实采样得到的奖励,最后一项则通过 Critic 在采样阶段的价值估计进行自举(Bootstrap)。
这里使用 $\mathbf{w}_{\mathrm{old}}$ 表示构造目标时所用的价值网络参数,以强调价值目标在当前优化阶段被视为固定量。如果轨迹提前到达真正的终止状态,对应的后续自举价值应当取 $0$。
这种方法与前面讨论过的多步时序差分学习完全一致。区别在于,这里使用神经网络 $V(s;\mathbf{w})$ 表示状态价值,并通过梯度下降最小化价值损失。
在 PPO 中,Critic 的价值估计还有另一个重要作用:为 Actor 构造优势估计。
回顾优势函数的定义:
$$ A_\pi(s,a) = Q_\pi(s,a)-V_\pi(s) $$它衡量某个动作相对于当前状态平均水平的优势。
在实际训练中,真实优势函数通常无法直接计算,因此需要通过采样回报与价值估计构造近似值。例如,如果已经得到状态价值目标 $\hat V_t$,就可以构造一种简单的优势估计:
$$ \hat A_t = \hat V_t-V(s_t;\mathbf{w}_{\mathrm{old}}) $$其中,$\hat V_t$ 用来估计当前动作之后的回报,$V(s_t;\mathbf{w}_{\mathrm{old}})$ 则提供当前状态的价值基线。
因此,Critic 的价值估计既参与自身的监督学习,也参与 Actor 的策略优化。价值估计越准确,通常越有利于构造可靠的优势信号,从而改善策略梯度的估计质量。
不过,PPO 在同一批数据上进行多个 epoch 的更新时,还需要注意一个实现细节。
由于当前这批轨迹由旧策略采集,因此通常会在开始梯度优化之前,根据采样阶段的价值估计统一计算出优势估计 $\hat A_t$ 和价值目标 $\hat V_t$。随后,在这一批数据的多个 epoch 更新过程中,将这些目标作为固定的训练信号。
这样可以避免 Actor 在优化同一批数据时,因为 Critic 参数不断变化而使对应的优势目标也不断改变。当然,不同 PPO 实现对价值目标的构造和更新方式可能存在差异,但固定当前批次的优势估计是十分常见的做法。
至此,PPO 中 Actor 与 Critic 的基本学习目标就可以分别表示为:
Actor 最大化裁剪代理目标:
$$ \max_{\boldsymbol{\theta}} L^{\mathrm{CLIP}}(\boldsymbol{\theta}) $$Critic 最小化价值损失:
$$ \min_{\mathbf{w}} L^V(\mathbf{w}) $$两者仍然遵循 Actor-Critic 的基本分工:Actor 负责策略改进,Critic 负责价值估计,并通过优势估计为 Actor 提供学习信号。
但仅有策略目标和价值损失还没有完整描述实际 PPO 的训练目标。在强化学习中,如果策略过早集中到少数动作上,可能导致探索不足,使智能体难以发现更好的行为。因此,实际 PPO 通常还会引入熵正则化(Entropy Regularization),鼓励策略在训练过程中保持一定的随机性。
下一节将进一步讨论策略熵的含义,以及如何将熵奖励与 Actor、Critic 的优化目标结合起来。
熵正则化与联合优化目标
前面已经分别介绍了 PPO 中 Actor 和 Critic 的学习目标。Actor 通过最大化裁剪代理目标改进策略,Critic 则通过最小化价值损失提高状态价值估计的准确性。
不过,在实际强化学习任务中,仅仅考虑策略改进和价值估计还不够。智能体还需要在训练过程中保持一定的探索能力,避免策略过早集中到少数动作上,从而影响后续学习。
为此,PPO 通常会在优化目标中引入熵正则化(Entropy Regularization)。
首先需要理解熵(Entropy)的含义。
对于一个离散随机策略 $\pi(a\mid s)$,其在状态 $s$ 下的熵定义为
$$ \mathcal H(\pi(\cdot\mid s)) = -\sum_a \pi(a\mid s)\log\pi(a\mid s) $$其中,$\pi(a\mid s)$ 表示策略在状态 $s$ 下选择动作 $a$ 的概率。
熵用于衡量概率分布的不确定性。当策略对多个动作分配了比较均匀的概率时,熵通常较大;当策略将大部分概率集中在少数动作上时,熵通常较小。
例如,假设某个状态下只有两个可选动作 $a_1$ 和 $a_2$。
如果策略给出的概率为
$$ \pi(a_1\mid s)=0.5,\qquad \pi(a_2\mid s)=0.5 $$那么对应的熵为
$$ \mathcal H(\pi(\cdot\mid s)) = -0.5\log0.5-0.5\log0.5 = \log2 $$此时两个动作被选择的概率相同,策略具有较大的随机性。
如果策略变为
$$ \pi(a_1\mid s)=0.99,\qquad \pi(a_2\mid s)=0.01 $$那么熵会明显减小,因为策略已经高度倾向于选择动作 $a_1$。
当策略完全确定,例如
$$ \pi(a_1\mid s)=1,\qquad \pi(a_2\mid s)=0 $$时,熵为 $0$。这里采用 $0\log0=0$ 的约定。
因此,熵能够反映策略的随机性。在强化学习中,保持一定的策略随机性,有助于智能体继续尝试不同动作,从而获得更多探索经验。
这一点对于策略梯度方法尤其重要。
在训练过程中,Actor 会不断提高优势为正的动作的选择概率,同时降低优势为负的动作的选择概率。如果只根据当前优势估计优化策略,那么某些动作的概率可能很快接近 $1$,其他动作的概率则逐渐接近 $0$。
但是,训练早期的价值估计和优势估计往往还不够准确。如果策略过早变得高度确定,就可能减少对其他动作的探索,使智能体难以发现更好的行为。
因此,可以在原有策略优化目标中加入一个鼓励较高熵的附加项,通常称为熵奖励(Entropy Bonus)。
对于 PPO,带有熵奖励的 Actor 优化目标可以写成
$$ L^{\mathrm{Actor}}(\boldsymbol{\theta}) = L^{\mathrm{CLIP}}(\boldsymbol{\theta}) + c_H\mathbb E_t \left[ \mathcal H(\pi_{\boldsymbol{\theta}}(\cdot\mid s_t)) \right] $$其中,$c_H\ge 0$ 是熵奖励系数,用于控制熵正则化在整个优化目标中的权重。
由于 Actor 希望最大化这个目标,因此熵奖励会鼓励策略保持较大的熵。
如果 $c_H$ 较小,那么熵奖励对策略更新的影响较弱,策略主要受到裁剪代理目标的驱动。
如果 $c_H$ 较大,那么优化过程会更加重视保持策略的随机性,从而倾向于维持更充分的探索。
不过,熵奖励系数也不能无限增大。过强的熵正则化可能使策略长期保持较大的随机性,影响其充分利用已经学到的高价值动作。因此,$c_H$ 需要根据任务特点进行选择,在某些实现中也可以随训练过程逐渐减小。
需要注意的是,熵奖励只能鼓励策略保持一定的随机性,并不能保证智能体一定能够充分探索整个状态空间,也不能完全避免策略过早收敛。
对于连续动作空间,策略通常通过高斯分布等连续概率分布表示。此时也可以使用相应的熵作为正则化项,只是熵的计算形式与离散动作不同。例如,对于多维高斯策略,可以根据其协方差矩阵计算微分熵。虽然具体表达式有所区别,但在 PPO 中的作用仍然是鼓励策略保持适当的随机性。
在引入熵奖励之后,就可以将 PPO 中的三个主要优化目标统一起来。
首先,Actor 的裁剪代理目标为
$$ L^{\mathrm{CLIP}}(\boldsymbol{\theta}) = \mathbb E_t \left[ \min \left( r_t(\boldsymbol{\theta})\hat A_t, \operatorname{clip} \left( r_t(\boldsymbol{\theta}), 1-\epsilon, 1+\epsilon \right)\hat A_t \right) \right] $$它用于控制策略更新,减少策略在一次训练阶段中过度偏离旧策略的动力。
其次,Critic 的价值损失为
$$ L^V(\mathbf{w}) = \mathbb E_t \left[ \left( V(s_t;\mathbf{w})-\hat V_t \right)^2 \right] $$它用于训练价值函数,使 Critic 的预测逐渐接近由采样轨迹构造的价值目标。
最后,策略的平均熵可以写成
$$ L^H(\boldsymbol{\theta}) = \mathbb E_t \left[ \mathcal H(\pi_{\boldsymbol{\theta}}(\cdot\mid s_t)) \right] $$它用于鼓励策略保持一定的随机性。
将三者结合,可以得到一种常见的 PPO 联合优化目标:
$$ L^{\mathrm{PPO}}(\boldsymbol{\theta},\mathbf{w}) = L^{\mathrm{CLIP}}(\boldsymbol{\theta}) - c_VL^V(\mathbf{w}) + c_HL^H(\boldsymbol{\theta}) $$其中,$c_V\ge0$ 是价值损失系数,$c_H\ge0$ 是熵奖励系数。
对于这一目标,希望执行最大化:
$$ \max_{\boldsymbol{\theta},\mathbf{w}} L^{\mathrm{PPO}}(\boldsymbol{\theta},\mathbf{w}) $$从符号上可以看到,裁剪代理目标和熵奖励前面是正号,而价值损失前面是负号。
原因在于,Actor 希望增大裁剪代理目标和策略熵,而 Critic 希望减小价值预测误差。因此,在最大化的表达形式下,需要对价值损失取负号。
但实际深度学习框架通常使用梯度下降来最小化损失函数,因此在代码实现中,更常见的是将整个目标取负,写成
$$ \mathcal L^{\mathrm{PPO}}(\boldsymbol{\theta},\mathbf{w}) = -L^{\mathrm{CLIP}}(\boldsymbol{\theta}) + c_VL^V(\mathbf{w}) - c_HL^H(\boldsymbol{\theta}) $$然后执行
$$ \min_{\boldsymbol{\theta},\mathbf{w}} \mathcal L^{\mathrm{PPO}}(\boldsymbol{\theta},\mathbf{w}) $$这两种写法对应相同的优化方向,只是一个采用最大化目标的形式,另一个采用最小化损失函数的形式。
不同 PPO 实现对损失函数的定义、系数名称以及常数因子的处理可能有所不同。例如,有些实现会在价值损失前加入 $\frac12$,也有些实现会对价值预测误差进一步进行裁剪。因此,实际阅读 PPO 代码时,需要先确认每个损失项的定义及其优化方向。
此外,Actor 和 Critic 可以使用完全独立的神经网络,也可以共享部分特征提取网络。如果两者参数独立,上述联合目标也可以拆成两个独立的优化过程:Actor 优化裁剪目标与熵奖励,Critic 优化价值损失。如果存在共享参数,则多个损失项可能共同影响共享网络的参数更新。
至此,PPO 的主要优化目标已经建立起来。其训练过程同时考虑三个方面:通过裁剪代理目标改进策略并抑制过大更新,通过价值损失学习状态价值,通过熵奖励维持适当的策略随机性。
不过,这里还有一个重要部分尚未展开:前面一直使用的优势估计 $\hat A_t$ 究竟应该怎样计算。
虽然可以直接使用一步 TD 误差或多步回报构造优势估计,但它们在偏差和方差方面各有特点。实际 PPO 通常采用广义优势估计(Generalized Advantage Estimation, GAE),将多个时间步的 TD 误差结合起来,以获得更灵活的优势估计。这一方法与前面已经介绍过的 n-step 回报和 TD($\lambda$) 有直接联系,也是理解 PPO 实际训练过程的重要部分。
广义优势估计(GAE)
前面已经介绍了 PPO 的裁剪代理目标、价值损失和熵正则化,但其中还有一个重要问题需要解决:如何根据采样轨迹构造可靠的优势估计 $\hat A_t$。
在 Actor-Critic 方法中,优势函数定义为
$$ A_\pi(s,a)=Q_\pi(s,a)-V_\pi(s) $$它衡量的是在状态 $s$ 下采取动作 $a$,相对于当前策略平均水平的优势。然而,在实际强化学习任务中,真实的动作价值函数 $Q_\pi(s,a)$ 通常无法直接计算,因此需要利用采样轨迹和 Critic 的价值估计构造近似的优势信号。
前面已经介绍过,最简单的优势估计方式是使用一步时序差分误差(Temporal Difference Error):
$$ \delta_t = r_t+\gamma V(s_{t+1})-V(s_t) $$其中,$r_t$ 表示当前一步获得的奖励,$\gamma$ 是折扣因子,$V(s_t)$ 和 $V(s_{t+1})$ 分别表示 Critic 对当前状态和下一状态的价值估计。
这里为了简化记号,暂时省略价值函数的参数 $\mathbf{w}$。实际计算优势时,通常使用采样阶段的价值网络,并在当前批次中固定这些价值估计。
一步 TD 误差衡量的是当前动作带来的结果与 Critic 原本预期之间的差异,因此可以直接作为优势估计:
$$ \hat A_t=\delta_t $$这种方法的优点是计算简单,只需要一步转移的信息,而且可以通过下一状态的价值估计进行自举(Bootstrap),避免等待完整回报。
但是,它也存在一定限制。一步 TD 误差对 Critic 的价值估计依赖较强,如果价值函数存在明显误差,那么构造出的优势估计也可能产生偏差。尤其对于延迟奖励较多的任务,一步 TD 误差只直接包含当前奖励,更远的未来完全依赖价值函数估计。
另一方面,也可以利用完整回报 $G_t$ 构造优势估计:
$$ \hat A_t=G_t-V(s_t) $$这种方法直接使用整段实际采样得到的回报,减少了对未来价值自举估计的依赖。但由于完整回报包含后续整段轨迹中的随机性,因此通常具有较大的方差。
这就形成了一个与前面 TD($\lambda$) 非常相似的问题:一步估计依赖较强的自举,完整回报则包含更多实际采样信息,能否在两者之间进行灵活调整?
广义优势估计(Generalized Advantage Estimation, GAE) 正是用于解决这一问题的方法。
GAE 的核心思想是将不同时间步的 TD 误差按照一定权重组合起来,构造一个能够灵活控制偏差与方差的优势估计。
具体来说,从一步 TD 误差开始:
$$ \delta_t= r_t+\gamma V(s_{t+1})-V(s_t) $$如果只使用当前一步,那么优势估计为
$$ \hat A_t^{(1)}=\delta_t $$如果希望将后续两步的信息结合起来,可以考虑
$$ \hat A_t^{(2)}= \delta_t+\gamma\delta_{t+1} $$将两个 TD 误差展开:
$$ \begin{aligned} \hat A_t^{(2)}={}&r_t+\gamma V(s_{t+1})-V(s_t)\\ &+\gamma\left[ r_{t+1}+\gamma V(s_{t+2})-V(s_{t+1}) \right] \end{aligned} $$可以发现,中间的价值估计项相互抵消,最终得到
$$ \hat A_t^{(2)}= r_t+\gamma r_{t+1}+\gamma^2V(s_{t+2})-V(s_t) $$而前面已经介绍过,两步回报为
$$ G_t^{(2)}= r_t+\gamma r_{t+1}+\gamma^2V(s_{t+2}) $$因此有
$$ \hat A_t^{(2)}= G_t^{(2)}-V(s_t) $$也就是说,将连续两步 TD 误差按折扣因子累加,实际上等价于使用两步回报减去当前状态的价值基线。
类似地,继续向后展开,可以得到三步优势估计:
$$ \hat A_t^{(3)}= \delta_t+\gamma\delta_{t+1}+\gamma^2\delta_{t+2} $$它等价于
$$ \hat A_t^{(3)}= G_t^{(3)}-V(s_t) $$一般地,$n$ 步优势估计可以写成
$$ \hat A_t^{(n)}= \sum_{l=0}^{n-1}\gamma^l\delta_{t+l}= G_t^{(n)}-V(s_t) $$这说明,多步 TD 误差的折扣累加,与前面介绍过的 n-step 回报之间存在直接联系。
既然不同步长的优势估计都可以通过累积 TD 误差构造,那么就可以进一步借鉴前面 TD($\lambda$) 的思想,将不同步长的信息组合起来。
GAE 引入参数 $\lambda$,并定义
$$ \hat A_t^{\mathrm{GAE}(\gamma,\lambda)}= \sum_{l=0}^{\infty} (\gamma\lambda)^l\delta_{t+l} $$展开后就是
$$ \hat A_t^{\mathrm{GAE}(\gamma,\lambda)}= \delta_t+\gamma\lambda\delta_{t+1}+(\gamma\lambda)^2\delta_{t+2}+\cdots $$其中,$\gamma$ 是折扣因子,$\lambda$ 是用于控制不同时间步贡献的参数,通常满足
$$ 0\le\lambda\le1 $$可以看到,越远的 TD 误差,其权重通常越小。每向后增加一步,权重就会额外乘上 $\gamma\lambda$。
因此,GAE 可以看作对未来多个 TD 误差进行指数衰减加权。它使得当前时刻的优势估计既包含当前一步的信息,也能够利用后续多个时间步的奖励和价值估计。
这里需要进一步理解参数 $\lambda$ 的作用。
当
$$ \lambda=0 $$时,所有后续 TD 误差的权重都变为 $0$,因此
$$ \hat A_t^{\mathrm{GAE}(\gamma,0)}= \delta_t $$此时 GAE 退化为一步 TD 优势估计。它只利用当前一步奖励和下一状态的价值估计,因此自举程度较强,对 Critic 的估计精度也更加敏感。
当
$$ \lambda=1 $$时,有
$$ \hat A_t^{\mathrm{GAE}(\gamma,1)}= \delta_t+\gamma\delta_{t+1} +\gamma^2\delta_{t+2} +\cdots $$如果考虑一个完整回合,并且终止状态的价值为 $0$,那么将上述 TD 误差展开并相互抵消,就可以得到
$$ \hat A_t^{\mathrm{GAE}(\gamma,1)}= G_t-V(s_t) $$因此,在完整回合的情况下,$\lambda=1$ 对应使用蒙特卡洛回报构造优势估计。
当
$$ 0<\lambda<1 $$时,GAE 处于两者之间。
较小的 $\lambda$ 会使后续 TD 误差的权重更快衰减,优势估计更加依赖较短时间范围内的信息和 Critic 的自举估计。这通常有助于降低方差,但价值函数的近似误差可能带来更明显的偏差。
较大的 $\lambda$ 会让更远时间步的 TD 误差保留较高权重,使优势估计包含更多实际采样得到的未来信息。这通常可以减轻由不准确的价值自举带来的偏差,但也可能增加估计的方差。
因此,$\lambda$ 的主要作用是调节优势估计对未来采样信息和价值函数自举估计的依赖程度,从而在偏差(Bias)和方差(Variance)之间进行权衡。
需要注意,这种偏差与方差的变化描述的是常见趋势,具体效果仍然取决于环境、价值函数的估计精度以及采样轨迹的性质,并不意味着增大 $\lambda$ 在所有情况下都会严格降低偏差或提高方差。
从前面 TD($\lambda$) 的内容来看,这一思想其实已经比较熟悉。
在 TD($\lambda$) 中,我们通过 $\lambda$-return 将不同步长的回报加权组合,用于构造状态价值的学习目标。而在 GAE 中,我们使用类似的多步组合思想,将不同时间步的 TD 误差加权累积,用于估计动作优势。
对于完整回合,在 $0\le\lambda<1$ 时,$\lambda$-return 可以写成
$$ G_t^\lambda= (1-\lambda) \sum_{n=1}^{\infty} \lambda^{n-1}G_t^{(n)} $$相应的 GAE 与 $\lambda$-return 之间具有如下关系:
$$ \hat A_t^{\mathrm{GAE}(\gamma,\lambda)}= G_t^\lambda-V(s_t) $$这里假设多步回报和 TD 误差使用相同的价值函数进行构造,并采用一致的终止状态处理方式。
由此可以看到,GAE 与 TD($\lambda$) 在数学结构上具有直接联系。前面已经学习过的多步回报和 $\lambda$-return,为理解 GAE 提供了基础。
在实际 PPO 训练中,通常会从多个并行环境中采集固定长度的轨迹,因此 GAE 的计算也往往只在当前采样片段内进行。
假设当前采样片段包含从 $t$ 到 $T-1$ 的转移,则可以使用截断形式:
$$ \hat A_t= \sum_{l=0}^{T-t-1} (\gamma\lambda)^l\delta_{t+l} $$其中,$\delta_t$ 由当前奖励和价值估计构造。如果采样片段在状态 $s_T$ 处结束,但实际回合尚未终止,那么计算最后一步 TD 误差时仍然可以使用 $V(s_T)$ 进行自举。如果到达真正的终止状态,则应当将对应的后续价值设为 $0$。
还可以将上述公式写成递推形式:
$$ \hat A_t= \delta_t+\gamma\lambda\hat A_{t+1} $$在采样片段末端设置适当的边界条件之后,就可以从后向前依次计算整段轨迹的优势估计。这种递推形式计算效率较高,因此在实际 PPO 实现中十分常见。
此外,GAE 还可以用于构造 Critic 的价值学习目标。
由于
$$ \hat A_t= G_t^\lambda-V(s_t) $$因此可以得到
$$ G_t^\lambda= \hat A_t+V(s_t) $$所以,在 PPO 中,一种常见做法是利用采样阶段的价值估计和 GAE 计算出的优势,构造价值目标:
$$ \hat V_t= \hat A_t+V(s_t;\mathbf{w}_{\mathrm{old}}) $$随后将 $\hat V_t$ 作为固定目标,用于训练 Critic:
$$ L^V(\mathbf{w})= \mathbb E_t \left[ \left( V(s_t;\mathbf{w})-\hat V_t \right)^2 \right] $$这样,同一批采样轨迹就能够同时提供 Actor 所需的优势估计,以及 Critic 所需的价值学习目标。
最后需要强调,GAE 并不是 PPO 独有的方法。它是一种通用的优势估计技术,也可以用于其他基于策略梯度和 Actor-Critic 的算法。PPO 之所以经常与 GAE 一起使用,是因为两者在训练结构上非常适合结合:GAE 负责提供较稳定的优势估计,PPO-Clip 则利用这些优势估计构造裁剪代理目标,对策略更新进行控制。
至此,PPO 所需的主要数学部分已经基本完整。Actor 使用裁剪代理目标更新策略,Critic 使用价值损失学习状态价值,熵正则化鼓励策略保持一定的随机性,而 GAE 则根据采样轨迹为 Actor 提供优势估计,并可以进一步构造 Critic 的价值目标。
接下来就可以将这些部分整合起来,讨论 PPO 的完整训练流程,以及为什么它能够对同一批数据进行多个 epoch 的更新。
PPO 的完整训练流程
前面已经分别介绍了 PPO 的裁剪代理目标、Critic 的价值损失、熵正则化以及广义优势估计(GAE)。这些部分共同构成了 PPO 的主要学习机制,但要真正理解 PPO 如何运行,还需要进一步明确:采样数据如何产生、优势和价值目标如何计算,以及 Actor 和 Critic 如何利用这些数据进行更新。
PPO 通常采用批量采样与批量优化相结合的训练方式。一轮训练首先使用当前策略与环境交互,收集一批轨迹数据;随后利用这些数据计算优势估计和价值目标,并在固定的数据集上进行多次梯度更新;最后使用更新后的策略重新采样,开始下一轮训练。
这一过程可以分为以下几个步骤。
第一步,使用当前策略并行采样。
假设当前策略参数为 $\boldsymbol{\theta}_{\mathrm{old}}$,对应的策略为
$$ \pi_{\boldsymbol{\theta}_{\mathrm{old}}}(a\mid s) $$PPO 通常会同时运行多个环境副本,并在所有环境中使用同一套策略参数。每个环境根据当前状态采样动作,与环境交互并获得奖励和下一状态。
对于每一步交互,可以记录转移样本:
$$ (s_t,a_t,r_t,s_{t+1}) $$不过,仅保存这些基本信息还不够。为了后续计算 PPO 的优化目标,通常还需要保存采样时的动作对数概率(Log Probability):
$$ \log\pi_{\boldsymbol{\theta}_{\mathrm{old}}}(a_t\mid s_t) $$以及 Critic 在采样阶段给出的状态价值估计:
$$ V(s_t;\mathbf{w}_{\mathrm{old}}) $$此外,还需要记录回合是否终止等信息,用于正确处理轨迹边界和价值自举。
因此,一批 PPO 训练数据通常包括状态、动作、奖励、旧策略动作对数概率、旧价值估计以及回合终止信息。
这里保存旧策略动作对数概率十分重要,因为后续策略参数会不断变化,而 PPO 需要始终知道:当前这条样本在采集时,旧策略对相应动作给出了多大的概率。
对于连续动作策略,严格来说,这里对应的是动作的概率密度及其对数,但后续概率比率的计算形式仍然相同。
假设同时运行 $N$ 个环境,每个环境采集 $T$ 个时间步,那么一轮采样通常可以得到
$$ B=N\times T $$条转移样本。
这些样本共同构成当前训练批次,记为
$$ \mathcal D $$需要注意,固定长度的采样并不要求每个环境都恰好完成一个完整回合。如果某个环境提前终止,可以在重置之后继续采样;如果采样结束时回合尚未终止,则可以利用 Critic 的价值估计处理剩余的未来回报。
第二步,计算优势估计和价值目标。
完成采样之后,PPO 需要利用这一批轨迹计算 Actor 和 Critic 的训练目标。
对于 Actor,需要得到每个时间步对应的优势估计
$$ \hat A_t $$实际 PPO 通常使用前面介绍过的 GAE:
$$ \hat A_t= \delta_t+\gamma\lambda\delta_{t+1}+(\gamma\lambda)^2\delta_{t+2}+\cdots $$其中,一步 TD 误差为
$$ \delta_t= r_t+\gamma V(s_{t+1})-V(s_t) $$这里的价值估计来自采样阶段的 Critic。对于真正的终止状态,需要将后续自举项设为 $0$;对于采样片段结束但回合尚未终止的情况,则通常保留相应的价值自举。
通过从后向前递推,可以高效计算整个采样批次中各个时间步的优势估计。
对于 Critic,则需要构造状态价值学习目标。一种常见的方式是:
$$ \hat V_t= \hat A_t+V(s_t;\mathbf{w}_{\mathrm{old}}) $$这样,同一批采样轨迹便可以同时提供 Actor 所需的优势估计和 Critic 所需的价值目标。
在实际实现中,还经常对当前批次的优势估计进行归一化(Normalization),例如:
$$ \tilde A_t= \frac{ \hat A_t-\mu_A }{ \sigma_A+\varepsilon_{\mathrm{norm}} } $$其中,$\mu_A$ 和 $\sigma_A$ 分别表示用于归一化的优势样本均值和标准差,$\varepsilon_{\mathrm{norm}}$ 是防止分母为零的小常数。
这样可以在一定程度上控制不同批次优势估计的数值尺度,改善优化过程的数值稳定性。优势归一化是一种常见实现技巧,并非 PPO 必须采用的步骤。
完成这些计算后,当前批次的旧策略动作对数概率、优势估计和价值目标通常都会在接下来的多个 epoch 中保持固定。
第三步,将数据划分为 mini-batch。
采样得到的整批数据可能包含数千甚至数万条转移样本。如果每次梯度更新都直接使用全部数据,计算开销可能较大,也会减少每一轮采样后能够执行的参数更新次数。
因此,PPO 通常会将当前批次 $\mathcal D$ 划分为若干个小批量(Mini-batch),并利用这些小批量依次进行梯度更新。
例如,假设一轮采样获得
$$ B=4096 $$条样本,每个 mini-batch 包含
$$ M=256 $$条样本,那么完整遍历一次数据需要
$$ \frac{4096}{256}=16 $$次 mini-batch 更新。
如果对这批数据进行 $4$ 个 epoch 的训练,那么总共会进行
$$ 4\times16=64 $$次 mini-batch 更新。
这里的 epoch 表示对当前采样批次完成一次遍历。每个 epoch 通常可以重新打乱样本顺序,再划分 mini-batch,以减少固定分组带来的影响。
因此,PPO 的一个重要特点是:采样得到的一批数据,可以在当前训练阶段内被重复用于多个 epoch 的梯度更新。
第四步,更新 Actor 和 Critic。
对于当前 mini-batch 中的样本,Actor 首先使用正在优化的新策略计算动作的对数概率:
$$ \log\pi_{\boldsymbol{\theta}}(a_t\mid s_t) $$然后利用之前保存的旧策略对数概率,计算新旧策略概率比率:
$$ r_t(\boldsymbol{\theta})= \exp\left( \log\pi_{\boldsymbol{\theta}}(a_t\mid s_t)- \log\pi_{\boldsymbol{\theta}_{\mathrm{old}}}(a_t\mid s_t) \right) $$这个式子与前面介绍的概率比率定义完全等价:
$$ r_t(\boldsymbol{\theta})= \frac{ \pi_{\boldsymbol{\theta}}(a_t\mid s_t) }{ \pi_{\boldsymbol{\theta}_{\mathrm{old}}}(a_t\mid s_t) } $$使用对数概率计算比率是实际 PPO 实现中的常见方式,可以避免直接计算很小的概率值,并与策略网络通常输出的概率分布接口对应。
得到概率比率后,就可以计算裁剪代理目标:
$$ L^{\mathrm{CLIP}}(\boldsymbol{\theta})= \mathbb E_t \left[ \min\left( r_t(\boldsymbol{\theta})\hat A_t, \operatorname{clip} \left( r_t(\boldsymbol{\theta}), 1-\epsilon, 1+\epsilon \right)\hat A_t \right) \right] $$其中,$\hat A_t$ 来自前面计算好的优势估计,在当前批次的优化过程中保持固定。
Actor 通过最大化这一目标更新策略参数 $\boldsymbol{\theta}$。由于使用了裁剪机制,当某些样本对应的概率比率已经沿有利方向偏离 $1$ 较远时,继续改变这些动作的概率就不会再提高对应的裁剪目标项。
与此同时,Critic 使用当前价值网络计算
$$ V(s_t;\mathbf{w}) $$并与之前构造好的价值目标 $\hat V_t$ 比较,得到价值损失:
$$ L^V(\mathbf{w})= \mathbb E_t \left[ \left( V(s_t;\mathbf{w})-\hat V_t \right)^2 \right] $$Critic 通过最小化这一损失更新参数 $\mathbf{w}$,使价值估计逐渐接近采样轨迹提供的学习目标。
如果引入熵正则化,则还需要计算当前策略的熵:
$$ L^H(\boldsymbol{\theta})= \mathbb E_t \left[ \mathcal H( \pi_{\boldsymbol{\theta}}(\cdot\mid s_t) ) \right] $$将这些部分结合,可以采用前面介绍过的联合损失:
$$ \mathcal L^{\mathrm{PPO}}=-L^{\mathrm{CLIP}}+c_VL^V-c_HL^H $$其中,$c_V$ 和 $c_H$ 分别控制价值损失和熵正则化的权重。
通过最小化这一联合损失,或者分别优化 Actor 和 Critic 对应的目标,就能够完成一次 mini-batch 更新。
需要注意,虽然 PPO 使用旧策略的概率作为参考,但每次梯度更新时,分子中的新策略概率都要根据当前参数 $\boldsymbol{\theta}$ 重新计算。
因此,随着优化不断进行,概率比率也会发生变化。裁剪目标正是利用这种变化,在优化过程中持续调整不同样本对策略更新的贡献。
第五步,对同一批数据进行多个 epoch 的更新。
完成一个 mini-batch 的更新后,PPO 会继续处理当前批次中的其他 mini-batch,直到遍历完整批数据。
这一过程构成一个 epoch。
随后,可以重新打乱数据并开始下一个 epoch,再次利用同一批样本更新 Actor 和 Critic。
这里有一个重要细节:虽然同一批样本会被重复使用,但其对应的旧策略概率、优势估计和价值目标通常保持不变。
例如,对某个固定的状态—动作对 $(s_t,a_t)$,旧策略概率始终是采样时记录的
$$ \pi_{\boldsymbol{\theta}_{\mathrm{old}}}(a_t\mid s_t) $$而当前策略概率
$$ \pi_{\boldsymbol{\theta}}(a_t\mid s_t) $$则会随着每次梯度更新而变化。
因此,即使输入的样本相同,不同 epoch 中计算得到的概率比率也可能不同。
这意味着 PPO 在重复使用数据的过程中,仍然会持续衡量当前策略相对于采样策略已经发生了多大变化,并利用裁剪机制抑制过大的更新。
当然,这种重复使用并不是无限制的。如果对同一批数据进行过多次优化,新策略可能逐渐远离旧策略,使样本与当前策略之间的差异增大,从而影响优化效果。
因此,PPO 通常会预先设置每轮训练的 epoch 数量,在有限次数的更新后结束当前优化阶段。有些实现还会监测新旧策略之间的近似 KL 散度,当策略变化过大时提前停止更新。
这里需要强调,裁剪机制并不能严格保证策略始终处于某个固定的距离范围内,因此实际训练中仍然需要合理设置学习率、裁剪参数和更新次数。
第六步,更新采样策略并重新收集数据。
当当前批次的多个 epoch 更新完成后,PPO 就结束这一轮策略优化。
此时,Actor 的参数已经从
$$ \boldsymbol{\theta}_{\mathrm{old}} $$更新为
$$ \boldsymbol{\theta} $$下一轮采样将直接使用更新后的策略:
$$ \pi_{\boldsymbol{\theta}}(a\mid s) $$开始下一轮训练时,可以将当前参数作为新的旧策略参数:
$$ \boldsymbol{\theta}_{\mathrm{old}} \leftarrow \boldsymbol{\theta} $$然后使用这套策略重新与环境交互,采集新的一批轨迹数据。
上一轮用于策略优化的旧数据通常会被丢弃,不再进入下一轮 PPO 更新。新的训练批次将包含新策略产生的状态、动作、奖励和旧策略对数概率,并重新计算对应的优势估计与价值目标。
于是,PPO 的整个训练过程可以概括为:
- 使用当前策略在多个并行环境中采集一批轨迹;
- 保存状态、动作、奖励、旧策略对数概率和价值估计等信息;
- 根据轨迹计算 GAE 优势估计和 Critic 的价值目标;
- 将数据划分为多个 mini-batch;
- 固定旧策略概率及当前批次的学习目标,进行多个 epoch 的梯度更新;
- 完成优化后使用更新后的策略重新采样,进入下一轮训练。
从整体结构上看,PPO 保留了 A2C 中并行采样和 Actor-Critic 联合学习的基本方式,同时对策略优化阶段进行了重要扩展。
A2C 通常在采样得到一批数据后,根据优势估计进行一次批量策略更新,然后继续采样。PPO 则允许在同一批数据上进行多个 epoch 的优化,并通过新旧策略概率比率和裁剪目标,减少重复更新过程中策略变化过大的风险。
因此,PPO 的训练过程可以理解为一种交替进行的结构:
$$ \text{策略采样} \rightarrow \text{优势与价值目标计算} \rightarrow \text{多轮批量优化} \rightarrow \text{重新采样} $$这里也引出了一个值得进一步讨论的问题。
前面已经介绍过,同策略(On-policy)方法通常依赖当前策略产生的数据,而异策略(Off-policy)方法可以利用其他策略产生的经验。PPO 既使用旧策略采样的数据,又允许同一批数据经历多个 epoch 的更新,那么为什么它仍然通常被归类为同策略方法?
理解这一点,需要进一步区分同一批数据在当前训练阶段内的有限重复使用与长期保留历史策略数据进行跨轮次训练之间的差别。
PPO 的同策略性质与数据复用
前面已经介绍了 PPO 的完整训练流程。其中,一个比较特殊的地方在于:PPO 使用旧策略采集一批轨迹之后,会固定这批数据,并通过多个 epoch 的梯度更新不断优化当前策略。
这似乎与前面介绍过的同策略(On-policy)方法存在一定矛盾。因为在同策略学习中,我们通常希望用于训练的数据来自当前策略,而 PPO 在进行多次梯度更新后,当前策略已经逐渐偏离了最初负责采样的旧策略。
那么,为什么 PPO 仍然通常被归类为同策略方法?
要回答这个问题,需要进一步明确同策略与异策略(Off-policy)方法之间的区别,以及 PPO 对数据复用所施加的限制。
在典型的同策略学习中,智能体使用当前策略与环境交互,再根据这些新采集的经验更新策略。随着策略发生变化,后续训练数据也需要通过更新后的策略重新采集,以保证训练数据与当前策略之间保持较强的一致性。
例如,在基础 A2C 中,通常采用如下训练过程:
- 使用当前策略采集一批轨迹;
- 根据轨迹计算优势估计;
- 使用这批数据更新 Actor 和 Critic;
- 使用更新后的策略重新采样。
这种方式使训练数据始终与当前或最近的策略保持接近,但数据的重复利用程度相对有限。
异策略方法则允许学习目标策略与产生数据的行为策略不同。例如,在 DQN 中,智能体可以将不同训练阶段产生的经验保存到经验回放池(Replay Buffer)中,并在之后反复采样这些历史经验进行学习。
因此,即使当前策略已经与产生某条经验时的行为策略有明显差异,算法仍然可能继续使用这条经验进行更新。
相比之下,PPO 的处理方式有所不同。
在每一轮训练开始时,PPO 使用当前策略
$$ \pi_{\boldsymbol{\theta}_{\mathrm{old}}}(a\mid s) $$采集一批新的轨迹数据。
在随后的优化阶段,虽然策略参数 $\boldsymbol{\theta}$ 会不断改变,但 PPO 始终使用采样时保存的旧策略概率作为参考,并计算概率比率:
$$ r_t(\boldsymbol{\theta})= \frac{ \pi_{\boldsymbol{\theta}}(a_t\mid s_t) }{ \pi_{\boldsymbol{\theta}_{\mathrm{old}}}(a_t\mid s_t) } $$通过这一比率,PPO 可以衡量当前策略相对于产生这批数据的旧策略,在采样到的状态—动作对上发生了怎样的变化。
这里还可以从重要性采样的角度进一步理解。
对于一个固定状态 $s$,如果新策略选择的动作都在旧策略的概率分布支持范围内,那么对于某个关于动作的函数 $f(s,a)$,有
$$ \mathbb E_{a\sim\pi_{\boldsymbol{\theta}}} [f(s,a)]= \mathbb E_{a\sim\pi_{\boldsymbol{\theta}_{\mathrm{old}}}} \left[ r(\boldsymbol{\theta};s,a)f(s,a) \right] $$其中
$$ r(\boldsymbol{\theta};s,a)= \frac{ \pi_{\boldsymbol{\theta}}(a\mid s) }{ \pi_{\boldsymbol{\theta}_{\mathrm{old}}}(a\mid s) } $$这说明,对于给定状态下的动作分布,可以通过概率比率对旧策略样本重新加权,从而估计新策略下的动作期望。
不过,这个关系只直接处理了给定状态时的动作分布变化。
在完整的强化学习过程中,策略变化还会改变智能体访问不同状态的概率。也就是说,新旧策略之间除了动作分布可能不同,状态访问分布也可能发生变化。
PPO 的概率比率并没有直接修正整个轨迹中的状态访问分布差异。因此,利用旧策略数据构造的代理目标,通常更适合在新旧策略比较接近时进行局部优化。当新策略与旧策略相差较大时,这种近似的可靠性可能下降。
这也解释了为什么 PPO 需要引入裁剪目标:
$$ L^{\mathrm{CLIP}}(\boldsymbol{\theta})= \mathbb E_t \left[ \min \left( r_t(\boldsymbol{\theta})\hat A_t, \operatorname{clip} \left( r_t(\boldsymbol{\theta}), 1-\epsilon, 1+\epsilon \right)\hat A_t \right) \right] $$裁剪机制会减少某些已经发生较大有利变化的状态—动作对继续推动策略更新的动力,从而降低新策略在重复利用数据时过度偏离旧策略的风险。
因此,PPO 可以在一定程度上重复利用同一批采样数据,而不必像最基础的 A2C 那样,在每次批量更新后立即重新采样。
但是,这种复用仍然受到限制。
首先,PPO 通常只在当前训练阶段内,对同一批数据进行有限数量的 epoch 更新。随着更新次数增加,当前策略可能越来越远离产生数据的旧策略,概率比率也可能逐渐偏离 $1$。此时,继续优化可能导致代理目标的近似质量下降,甚至影响训练稳定性。
其次,PPO-Clip 并不能严格保证所有状态—动作对上的概率比率都位于裁剪区间内。因此,重复训练的次数不能无限增加,仍然需要通过合理设置学习率、裁剪参数和 epoch 数量来控制更新过程。
最后,当当前批次的优化完成之后,标准 PPO 通常会丢弃这批旧数据,使用更新后的策略重新采样。它一般不会像 DQN、SAC 等典型异策略算法那样,长期保留大量由历史策略产生的经验,并将其持续用于后续策略优化。
因此,PPO 的数据使用方式可以概括为:
每一轮使用最新策略采样,在当前批次内有限地重复利用数据,完成优化后再根据新策略重新采样。
从这个角度看,PPO 仍然属于同策略方法。它的训练过程始终围绕最近采样的策略展开,并通过概率比率和裁剪目标控制当前优化阶段中的策略变化。
这里需要强调,同策略并不意味着每条样本只能进行一次梯度更新。是否属于同策略方法,需要结合数据采集方式、优化目标及其对行为策略与目标策略关系的处理来判断,不能简单地根据样本被使用的次数进行分类。
PPO 的一个重要特点,正是在保持近似同策略训练结构的前提下,提高了当前批次数据的利用程度。
不过,这种数据复用并不意味着 PPO 具有与典型异策略方法相同的样本利用能力。由于每轮优化之后通常仍然需要重新采集数据,PPO 在需要大量真实环境交互的任务中,仍然可能面临较高的采样成本。
至此,PPO 与基础 Actor-Critic 和 A2C 之间的关系已经更加明确:它们都可以利用价值估计和优势估计进行策略学习,也都可以使用并行环境收集数据。PPO 在此基础上进一步引入新旧策略概率比率和裁剪代理目标,使同一批数据能够支持有限次数的重复优化。
PPO 与 A2C 的关系
前面已经介绍了 PPO 的完整训练流程,以及它为什么仍然通常被归类为同策略方法。现在可以进一步将 PPO 与 A2C 放在一起比较,明确两者在算法结构和策略更新方式上的联系。
首先需要强调,PPO 与 A2C 都属于基于策略梯度的强化学习方法,并且通常采用 Actor-Critic 框架。
在这一框架中,Actor 使用参数化策略
$$ \pi(a\mid s;\boldsymbol{\theta}) $$根据当前状态选择动作,并通过策略梯度更新参数;Critic 使用参数化价值函数
$$ V(s;\mathbf{w}) $$估计状态的长期价值,为 Actor 提供优势估计所需的信息。
因此,两者在基本学习结构上具有明显的共同点。
首先,A2C 和 PPO 都可以使用多个并行环境收集训练数据。通过同时运行多个环境副本,算法能够在相同时间内获得更多状态转移样本,并利用这些样本进行批量训练。
其次,两者都可以使用优势估计 $\hat A_t$ 作为 Actor 的学习信号。优势估计衡量当前动作相对于状态平均水平的好坏,并决定策略应该提高还是降低该动作的概率。
最后,两者都需要训练 Critic,使价值函数逐渐接近采样轨迹构造的价值目标。因此,Actor 的策略学习与 Critic 的价值估计在两种算法中始终保持联系。
真正的区别主要体现在Actor 的策略优化方式上。
在 A2C 中,Actor 通常直接使用优势策略梯度更新参数:
$$ \boldsymbol{\theta} \leftarrow \boldsymbol{\theta}+ \alpha\hat A_t \nabla_{\boldsymbol{\theta}} \log\pi(a_t\mid s_t;\boldsymbol{\theta}) $$对于一批采样数据,可以对各个样本的策略梯度求平均,再进行一次批量更新。
这种更新方式比较直接。优势估计决定当前动作应该增加还是减少概率,学习率 $\alpha$ 则控制参数更新的步长。
但是,正如前面讨论过的,学习率并没有直接约束新旧策略的概率分布差异。如果一次更新使策略变化过大,原有采样数据对于新策略的代表性就可能下降。
PPO 则进一步引入旧策略
$$ \pi_{\boldsymbol{\theta}_{\mathrm{old}}}(a\mid s) $$作为当前批次的参考策略,并通过概率比率
$$ r_t(\boldsymbol{\theta})= \frac{ \pi_{\boldsymbol{\theta}}(a_t\mid s_t) }{ \pi_{\boldsymbol{\theta}_{\mathrm{old}}}(a_t\mid s_t) } $$描述当前策略相对于采样策略的变化。
在此基础上,PPO 使用裁剪代理目标:
$$ L^{\mathrm{CLIP}}(\boldsymbol{\theta})= \mathbb E_t \left[ \min \left( r_t(\boldsymbol{\theta})\hat A_t, \operatorname{clip} \left( r_t(\boldsymbol{\theta}), 1-\epsilon, 1+\epsilon \right)\hat A_t \right) \right] $$与 A2C 相比,PPO 在策略优化目标中显式考虑了新旧策略之间的概率变化。当某些动作的概率已经沿优势所指示的方向发生较大变化时,裁剪目标会减少继续推动这些变化的动力。
这使得 PPO 能够在当前批次的数据上进行多个 epoch 的优化,同时降低策略过度偏离采样策略的风险。
进一步地,PPO 的代理目标与普通策略梯度之间还有一个重要联系。
回顾未裁剪的代理目标:
$$ L^{\mathrm{PG}}(\boldsymbol{\theta})= \mathbb E_t \left[ r_t(\boldsymbol{\theta})\hat A_t \right] $$对参数 $\boldsymbol{\theta}$ 求梯度,并将当前批次的优势估计视为固定量:
$$ \nabla_{\boldsymbol{\theta}} L^{\mathrm{PG}}(\boldsymbol{\theta})= \mathbb E_t \left[ \hat A_t \nabla_{\boldsymbol{\theta}} r_t(\boldsymbol{\theta}) \right] $$根据概率比率的定义,有
$$ \nabla_{\boldsymbol{\theta}} r_t(\boldsymbol{\theta})= r_t(\boldsymbol{\theta}) \nabla_{\boldsymbol{\theta}} \log\pi_{\boldsymbol{\theta}}(a_t\mid s_t) $$因此:
$$ \nabla_{\boldsymbol{\theta}} L^{\mathrm{PG}}(\boldsymbol{\theta})= \mathbb E_t \left[ r_t(\boldsymbol{\theta}) \hat A_t \nabla_{\boldsymbol{\theta}} \log\pi_{\boldsymbol{\theta}}(a_t\mid s_t) \right] $$而在一轮 PPO 优化刚开始时:
$$ \boldsymbol{\theta}= \boldsymbol{\theta}_{\mathrm{old}} $$此时新旧策略相同,因此
$$ r_t(\boldsymbol{\theta}_{\mathrm{old}})=1 $$将其代入,得到
$$ \left. \nabla_{\boldsymbol{\theta}} L^{\mathrm{PG}}(\boldsymbol{\theta}) \right|_{\boldsymbol{\theta}=\boldsymbol{\theta}_{\mathrm{old}}}= \mathbb E_t \left[ \hat A_t \nabla_{\boldsymbol{\theta}} \log\pi_{\boldsymbol{\theta}_{\mathrm{old}}}(a_t\mid s_t) \right] $$可以看到,这恰好就是普通优势策略梯度的形式。
对于 PPO-Clip,由于优化刚开始时概率比率为 $1$,位于裁剪区间内部,因此在这一位置,裁剪目标与未裁剪代理目标具有相同的梯度。
这说明,PPO 在每轮优化的初始位置仍然遵循普通优势策略梯度的更新方向。随着新旧策略逐渐产生差异,裁剪机制才开始改变部分样本对优化目标的贡献。
因此,PPO 与 A2C 之间存在直接的数学联系。PPO 延续了优势策略梯度的基本思想,并在此基础上引入对策略变化的控制。
从训练方式来看,两者的主要特点可以概括如下。
| 比较项目 | A2C | PPO-Clip |
|---|---|---|
| 基本框架 | Actor-Critic | Actor-Critic |
| 策略更新依据 | 优势估计 | 优势估计与概率比率 |
| 并行采样 | 支持 | 支持 |
| Actor 优化目标 | 普通优势策略梯度 | 裁剪代理目标 |
| 新旧策略比较 | 通常不显式使用 | 显式使用概率比率 |
| 数据使用方式 | 通常每批进行一次策略更新 | 通常每批进行多个 epoch 更新 |
| 策略变化控制 | 主要依赖学习率等优化设置 | 额外通过裁剪目标抑制过大更新 |
这里需要注意,表格中的训练方式描述的是两种算法的典型实现,并不意味着 A2C 在数学上只能执行一次梯度更新,或者 PPO 必须采用某个固定的 epoch 数量。
同样,PPO 的裁剪机制能够改善策略更新的稳定性,但并不能保证 PPO 在所有任务中都优于 A2C。两者的实际表现还受到网络结构、优势估计质量、学习率、采样规模以及其他超参数的影响。
因此,从整个算法发展过程来看,可以得到一条清晰的关系:
$$ \text{Actor-Critic} \rightarrow \text{Advantage Estimation} \rightarrow \text{A2C} \rightarrow \text{PPO} $$Actor-Critic 建立了策略学习与价值估计相结合的框架;优势估计为 Actor 提供更加合适的更新信号;A2C 利用同步并行采样提高训练效率;PPO 则进一步改进策略优化目标,使每批数据能够在相对受控的策略变化下进行多次更新。
这种改进使 PPO 在保持算法结构相对简单的同时,能够适应大规模并行采样和批量梯度优化,因此在连续控制和机器人强化学习中得到了广泛应用。
PPO 在连续控制与机器人强化学习中的应用
前面已经讨论了 PPO 与 A2C 的关系。PPO 保留了 Actor-Critic、优势估计和并行采样等基本结构,并通过裁剪代理目标控制策略更新过程。这些特点使 PPO 在连续控制(Continuous Control)任务中得到了广泛应用,尤其适合基于大规模并行仿真的机器人强化学习。
首先,PPO 可以直接处理连续动作空间。
在前面介绍 DQN 时已经看到,基于动作价值的方法通常需要比较不同动作对应的 Q 值,并通过最大化操作选择动作:
$$ a^*=\arg\max_a Q(s,a) $$对于有限离散动作空间,这种方式比较直接。但在机器人控制中,动作往往是连续变量,例如关节目标位置、目标速度或控制力矩。随着动作维度增加,直接搜索使动作价值最大的控制输入通常会变得困难。
PPO 采用参数化随机策略,可以直接根据当前状态生成连续动作分布,因此能够避免显式求解上述动作最大化问题。
例如,在连续动作任务中,Actor 可以采用高斯策略(Gaussian Policy),由神经网络根据当前状态输出动作分布的均值和标准差:
$$ \boldsymbol{\mu}_{\boldsymbol{\theta}}(s), \qquad \boldsymbol{\sigma}_{\boldsymbol{\theta}}(s) $$假设各动作维度条件独立,那么策略可以表示为多维高斯分布:
$$ \pi_{\boldsymbol{\theta}}(\boldsymbol a\mid s)= \mathcal N \left( \boldsymbol a; \boldsymbol{\mu}_{\boldsymbol{\theta}}(s), \operatorname{diag} \left( \boldsymbol{\sigma}_{\boldsymbol{\theta}}^2(s) \right) \right) $$其中,$\boldsymbol{\mu}_{\boldsymbol{\theta}}(s)$ 决定动作分布的中心位置,$\boldsymbol{\sigma}_{\boldsymbol{\theta}}(s)$ 控制动作采样的随机性。
训练时,智能体可以从这一分布中采样动作:
$$ \boldsymbol a_t \sim \pi_{\boldsymbol{\theta}}(\cdot\mid s_t) $$然后根据环境返回的奖励和后续状态计算优势估计,再通过 PPO 的裁剪目标更新策略参数。
这里需要注意,在连续动作空间中,$\pi_{\boldsymbol{\theta}}(\boldsymbol a\mid s)$ 表示概率密度,PPO 使用的概率比率实际上是新旧策略在采样动作处的概率密度之比:
$$ r_t(\boldsymbol{\theta})= \frac{ \pi_{\boldsymbol{\theta}}(\boldsymbol a_t\mid s_t) }{ \pi_{\boldsymbol{\theta}_{\mathrm{old}}}(\boldsymbol a_t\mid s_t) } $$因此,PPO-Clip 的数学形式仍然适用,不需要将连续动作离散化。
在实际机器人任务中,策略网络输出的动作还可能经过缩放、裁剪或其他控制映射,最终转换为关节控制指令。这些处理属于具体控制系统的设计,需要在实现中保证动作采样、概率密度计算和实际执行过程之间的一致性。
其次,PPO 的训练结构适合大规模并行仿真。
机器人强化学习通常需要大量环境交互。尤其对于四足机器人、机械臂等具有较高自由度的系统,智能体需要在不同初始状态、运动条件和外部扰动下反复采样,才能逐渐学到具有一定泛化能力的控制策略。
如果只使用单个环境顺序采样,获得足够训练数据可能需要很长时间。因此,现代机器人强化学习通常会通过并行仿真提高采样效率。
PPO 的训练流程与这种方式具有较好的兼容性。
假设同时运行 $N$ 个机器人仿真实例,每个实例执行 $T$ 个策略步,那么每轮可以得到
$$ B=N\times T $$条训练样本。
这些环境可以具有不同的初始姿态、地形、机器人动力学参数或外部扰动,使同一批采样数据包含更加多样的交互经验。
完成采样之后,算法统一计算各个环境的优势估计和价值目标,再将数据整理成 mini-batch,通过神经网络的批量运算更新 Actor 和 Critic。
这一结构非常适合使用 GPU 加速的并行仿真平台。在实际实现中,多个环境可以同时执行物理仿真和策略推理,而策略网络则通过批量张量运算处理大量观测和动作。
因此,PPO 能够比较自然地结合高吞吐量的仿真采样与批量神经网络训练。
需要注意,PPO 本身并没有要求必须使用 GPU 或大量并行环境。并行仿真属于训练系统层面的优化,但它能够充分发挥 PPO 批量采样和批量更新的特点。
第三,PPO 可以在一次采样之后进行多轮梯度优化。
前面已经介绍,PPO 通常会在采集一批轨迹后,将这些数据划分为多个 mini-batch,并执行若干个 epoch 的更新。
相比每批数据通常只进行一次策略更新的基础 A2C,这种方式允许算法在重新采样之前,对已有数据进行更多次参数优化。
与此同时,PPO 通过裁剪代理目标,减少策略在重复更新过程中沿有利方向发生过大变化的动力,从而使多轮优化更加可行。
这对于计算成本较高的机器人仿真具有一定意义,因为每次采集的数据都能够在当前训练阶段内得到更充分的利用。
不过,这种改进仍然存在限制。PPO 通常需要在每轮优化结束后重新采样,其样本利用率不一定优于 SAC 等典型异策略算法。对于真实机器人这种交互成本较高的场景,采样效率仍然是需要考虑的重要因素。
第四,PPO 的策略更新通常具有较好的稳定性。
机器人控制任务中的状态和动作通常具有较高维度,环境动力学也可能较为复杂。策略参数发生变化后,机器人可能产生明显不同的运动行为,从而改变后续采样数据的分布。
普通策略梯度主要根据当前优势估计确定更新方向,如果参数更新过大,可能导致策略性能明显下降。
PPO 在此基础上引入裁剪目标:
$$ L^{\mathrm{CLIP}}(\boldsymbol{\theta})= \mathbb E_t \left[ \min \left( r_t(\boldsymbol{\theta})\hat A_t, \operatorname{clip} \left( r_t(\boldsymbol{\theta}), 1-\epsilon, 1+\epsilon \right)\hat A_t \right) \right] $$通过这一目标,算法能够在保留策略梯度基本方向的同时,降低部分样本推动策略继续大幅变化的动力。
与前面提到的 TRPO 相比,PPO-Clip 不需要显式求解复杂的约束优化问题,可以直接使用常见的一阶优化器,例如 Adam,对神经网络参数进行更新。因此,其实现难度和计算复杂度通常低于 TRPO。
这些特点使 PPO 成为连续控制中一种比较常见的基础算法,也使其经常被用于机器人运动控制、灵巧操作以及其他基于仿真的策略学习任务。
不过,PPO 的这些优势并不意味着它能够自动解决机器人强化学习中的所有困难。
首先,PPO 的训练效果仍然依赖超参数设置。学习率、裁剪范围 $\epsilon$、GAE 参数 $\lambda$、采样批次大小、mini-batch 大小和训练 epoch 数量,都可能明显影响最终结果。裁剪机制虽然能够改善更新稳定性,但无法保证训练过程一定收敛,也无法保证每轮策略更新都能提高真实期望回报。
其次,PPO 仍然需要合理设计状态观测、动作空间和奖励函数。在机器人控制任务中,即使策略优化算法本身运行稳定,如果奖励函数不能准确表达任务目标,或者观测信息不足,智能体仍然可能学到不符合预期的行为。
最后,在仿真到现实迁移(Simulation-to-Real Transfer, Sim-to-Real)任务中,PPO 并不能直接消除仿真环境与真实机器人之间的动力学差异。实际部署效果还依赖仿真模型的准确程度、域随机化(Domain Randomization)、控制频率、传感器噪声以及执行器特性等因素。
因此,PPO 在机器人强化学习中的广泛应用,可以主要归结于几个算法特点:能够直接优化连续随机策略,能够结合大规模并行仿真进行批量训练,允许对当前批次进行有限的多轮更新,并通过相对简单的裁剪目标改善策略优化的稳定性。
这些特点使 PPO 成为机器人强化学习中一种实用且成熟的算法选择,但具体任务中仍然需要结合采样成本、动作空间、控制约束和训练目标,判断它是否适合当前问题。
总结
本文在前面 Actor-Critic、A2C 和 A3C 的基础上,进一步介绍了近端策略优化(Proximal Policy Optimization, PPO)的基本原理。PPO 延续了策略梯度方法的核心思想,同时通过概率比率和裁剪代理目标,对策略更新过程进行更合理的控制。
回顾前面几篇文章,策略梯度方法的发展可以概括为以下过程:
$$ \text{Actor-Critic} \rightarrow \text{Advantage Estimation} \rightarrow \text{Parallel Sampling} \rightarrow \text{A2C} \rightarrow \text{PPO} $$首先,Actor-Critic 将策略学习与价值估计结合起来。Actor 负责直接优化参数化策略,Critic 负责估计状态价值,并为 Actor 提供评价信号。在此基础上,优势估计进一步明确了策略更新的依据,使 Actor 能够根据动作相对于当前策略平均水平的表现调整动作概率。
随后,A2C 和 A3C 将 Actor-Critic 扩展到并行采样结构,通过多个环境副本同时收集训练数据,提高采样效率,并使深度强化学习能够更充分地利用并行计算资源。
但普通策略梯度仍然面临策略更新幅度难以直接控制的问题。当新策略与产生训练数据的旧策略相差较大时,原有样本对当前策略的代表性可能下降,进而影响训练稳定性。
PPO 正是在这一基础上引入了新的策略优化机制。
它首先通过概率比率
$$ r_t(\boldsymbol{\theta})= \frac{ \pi_{\boldsymbol{\theta}}(a_t\mid s_t) }{ \pi_{\boldsymbol{\theta}_{\mathrm{old}}}(a_t\mid s_t) } $$描述新策略相对于旧策略,在采样到的状态—动作对上发生的概率变化。
随后,在普通代理目标的基础上引入裁剪机制,得到 PPO-Clip 的核心目标:
$$ L^{\mathrm{CLIP}}(\boldsymbol{\theta})= \mathbb E_t \left[ \min \left( r_t(\boldsymbol{\theta})\hat A_t, \operatorname{clip} \left( r_t(\boldsymbol{\theta}), 1-\epsilon, 1+\epsilon \right)\hat A_t \right) \right] $$这一目标的关键在于:当策略已经沿优势估计指示的方向发生较大变化时,继续增大这种变化将不再提高对应样本的裁剪目标值,从而减少过度更新的动力。
需要注意,裁剪机制作用于代理目标中的概率比率,并不直接限制策略参数,也不能严格保证新旧策略之间的 KL 散度始终处于某个固定范围内。因此,PPO 仍然需要合理设置学习率、裁剪参数和训练轮数,以维持训练稳定性。
在实际训练中,PPO 通常还会结合广义优势估计(GAE)、Critic 的价值损失以及熵正则化。其中,GAE 利用多步 TD 误差构造优势估计,并通过参数 $\lambda$ 调节偏差与方差之间的权衡;Critic 通过价值损失学习状态价值;熵正则化则用于鼓励策略保持适当的随机性。
这些部分共同构成了 PPO 的基本训练结构:
$$ \text{并行采样} \rightarrow \text{优势与价值目标计算} \rightarrow \text{多轮批量优化} \rightarrow \text{重新采样} $$PPO 允许在一批数据上进行多个 epoch 的梯度更新,但通常只在当前训练阶段内有限地复用这些数据。优化完成后,算法会使用更新后的策略重新采集轨迹,因此 PPO 仍然通常被归类为同策略方法。
总体来看,PPO 的主要价值在于:保留 Actor-Critic 和优势策略梯度的基本框架,通过简单的裁剪代理目标抑制过大的策略更新,并结合并行采样与批量优化,提高深度策略学习的实用性。
这些特点使 PPO 成为连续控制和机器人强化学习中广泛采用的算法。不过,PPO 仍然受到采样效率、价值估计误差和超参数选择等因素的影响,其实际效果需要结合具体任务进行评估。
至此,从基础策略梯度到 Actor-Critic,再到 A2C、A3C 和 PPO 的主要发展过程已经比较清晰。后续可以进一步讨论其他策略优化方法,例如软演员—评论家(Soft Actor-Critic, SAC),并比较同策略与异策略方法在数据利用、探索机制和连续控制方面的不同设计。