强化学习PPO策略梯度Actor-Critic

PPO 梯度推导

2025-08-2022 分钟

PPO(Proximal Policy Optimization)是基于策略梯度的强化学习算法。它的核心不是重新定义一个完全不同的优化方向,而是在策略梯度的基础上加入重要性采样和裁剪约束,使同一批轨迹可以被重复训练,同时避免新策略偏离旧策略过远。

本文围绕 PPO 的梯度更新主线,逐步得到 Actor-Critic、重要性采样目标以及 PPO-Clip 目标,并重点分析 PPO 目标函数对策略参数的梯度形式。


一、符号约定

设策略为随机策略:

at∼πθ(⋅∣st)a_t \sim \pi_\theta(\cdot|s_t)

其中 θ\theta 是策略网络参数。一次轨迹记为:

τ=(s0,a0,r0,s1,a1,r1,…,sT−1,aT−1,rT−1)\tau = (s_0,a_0,r_0,s_1,a_1,r_1,\dots,s_{T-1},a_{T-1},r_{T-1})

轨迹回报定义为:

R(τ)=∑t=0T−1γtrtR(\tau)=\sum_{t=0}^{T-1}\gamma^t r_t

单步后的折扣回报定义为:

Gt=∑l=0T−t−1γlrt+lG_t=\sum_{l=0}^{T-t-1}\gamma^l r_{t+l}

价值函数与优势函数定义为:

Vπ(st)=Eπ[Gt∣st]V^\pi(s_t)=\mathbb{E}_\pi[G_t|s_t] Qπ(st,at)=Eπ[Gt∣st,at]Q^\pi(s_t,a_t)=\mathbb{E}_\pi[G_t|s_t,a_t] Aπ(st,at)=Qπ(st,at)−Vπ(st)A^\pi(s_t,a_t)=Q^\pi(s_t,a_t)-V^\pi(s_t)

PPO 中通常用 πθold\pi_{\theta_{\text{old}}} 表示采样轨迹时的旧策略,用 πθ\pi_\theta 表示正在更新的新策略。定义概率比值:

rt(θ)=πθ(at∣st)πθold(at∣st)r_t(\theta)= \frac{\pi_\theta(a_t|s_t)} {\pi_{\theta_{\text{old}}}(a_t|s_t)}

这里的 rt(θ)r_t(\theta) 表示 ratio,和奖励符号 rtr_t 不是同一个量。为了贴近 PPO 论文习惯,后文仍沿用 rt(θ)r_t(\theta) 表示概率比值。

在实现中,常用 log probability 计算:

rt(θ)=exp⁡(log⁡πθ(at∣st)−log⁡πθold(at∣st))r_t(\theta)= \exp\left( \log \pi_\theta(a_t|s_t) - \log \pi_{\theta_{\text{old}}}(a_t|s_t) \right)

其中 log⁡πθold(at∣st)\log \pi_{\theta_{\text{old}}}(a_t|s_t) 来自采样时缓存的旧策略输出,在更新过程中视为常数。


二、策略梯度基础推导

1. 优化目标

策略优化的总体目标是最大化期望回报:

J(θ)=Eτ∼πθ[R(τ)]J(\theta)=\mathbb{E}_{\tau\sim \pi_\theta}[R(\tau)]

写成对所有轨迹的求和形式:

J(θ)=∑τP(τ∣θ)R(τ)J(\theta)=\sum_\tau P(\tau|\theta)R(\tau)

其中 P(τ∣θ)P(\tau|\theta) 表示在策略 πθ\pi_\theta 下采样到轨迹 τ\tau 的概率。

2. 对目标求梯度

对 J(θ)J(\theta) 求梯度:

∇θJ(θ)=∇θ∑τP(τ∣θ)R(τ)=∑τR(τ)∇θP(τ∣θ)\begin{aligned} \nabla_\theta J(\theta) &= \nabla_\theta \sum_\tau P(\tau|\theta)R(\tau) \\ &= \sum_\tau R(\tau)\nabla_\theta P(\tau|\theta) \end{aligned}

引入 log-derivative trick:

∇θP(τ∣θ)=P(τ∣θ)∇θlog⁡P(τ∣θ)\nabla_\theta P(\tau|\theta) = P(\tau|\theta)\nabla_\theta \log P(\tau|\theta)

代入可得:

∇θJ(θ)=∑τR(τ)P(τ∣θ)∇θlog⁡P(τ∣θ)=Eτ∼πθ[R(τ)∇θlog⁡P(τ∣θ)]\begin{aligned} \nabla_\theta J(\theta) &= \sum_\tau R(\tau)P(\tau|\theta) \nabla_\theta \log P(\tau|\theta) \\ &= \mathbb{E}_{\tau\sim\pi_\theta} \left[ R(\tau)\nabla_\theta \log P(\tau|\theta) \right] \end{aligned}

关键结论:无法直接对采样过程求导时,可以转为对轨迹概率的 log probability 求导。

3. 展开轨迹概率

轨迹概率可写为:

P(τ∣θ)=ρ0(s0)∏t=0T−1πθ(at∣st)P(st+1∣st,at)P(\tau|\theta) = \rho_0(s_0) \prod_{t=0}^{T-1} \pi_\theta(a_t|s_t) P(s_{t+1}|s_t,a_t)

取对数:

log⁡P(τ∣θ)=log⁡ρ0(s0)+∑t=0T−1log⁡πθ(at∣st)+∑t=0T−1log⁡P(st+1∣st,at)\log P(\tau|\theta) = \log \rho_0(s_0) + \sum_{t=0}^{T-1}\log \pi_\theta(a_t|s_t) + \sum_{t=0}^{T-1}\log P(s_{t+1}|s_t,a_t)

对 θ\theta 求梯度时,初始状态分布 ρ0\rho_0 和环境转移概率 P(st+1∣st,at)P(s_{t+1}|s_t,a_t) 与策略参数无关,因此梯度为 0:

∇θlog⁡P(τ∣θ)=∑t=0T−1∇θlog⁡πθ(at∣st)\nabla_\theta \log P(\tau|\theta) = \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta(a_t|s_t)

代回策略梯度:

∇θJ(θ)=Eτ∼πθ[R(τ)∑t=0T−1∇θlog⁡πθ(at∣st)]\nabla_\theta J(\theta) = \mathbb{E}_{\tau\sim\pi_\theta} \left[ R(\tau) \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta(a_t|s_t) \right]

这就是 REINFORCE 形式的策略梯度。

4. 从整条轨迹回报到单步优势

直接用整条轨迹回报 R(τ)R(\tau) 评估每个动作,方差较大。更常见的形式是用从当前时刻开始的回报 GtG_t:

∇θJ(θ)=Eτ∼πθ[∑t=0T−1Gt∇θlog⁡πθ(at∣st)]\nabla_\theta J(\theta) = \mathbb{E}_{\tau\sim\pi_\theta} \left[ \sum_{t=0}^{T-1} G_t \nabla_\theta \log \pi_\theta(a_t|s_t) \right]

进一步可以减去只依赖状态的 baseline b(st)b(s_t):

∇θJ(θ)=Eτ∼πθ[∑t=0T−1(Gt−b(st))∇θlog⁡πθ(at∣st)]\nabla_\theta J(\theta) = \mathbb{E}_{\tau\sim\pi_\theta} \left[ \sum_{t=0}^{T-1} (G_t-b(s_t)) \nabla_\theta \log \pi_\theta(a_t|s_t) \right]

baseline 不改变梯度期望,因为:

Eat∼πθ(⋅∣st)[b(st)∇θlog⁡πθ(at∣st)]=b(st)∑atπθ(at∣st)∇θlog⁡πθ(at∣st)=b(st)∑at∇θπθ(at∣st)=b(st)∇θ∑atπθ(at∣st)=b(st)∇θ1=0\begin{aligned} \mathbb{E}_{a_t\sim\pi_\theta(\cdot|s_t)} \left[ b(s_t)\nabla_\theta\log\pi_\theta(a_t|s_t) \right] &= b(s_t) \sum_{a_t}\pi_\theta(a_t|s_t) \nabla_\theta\log\pi_\theta(a_t|s_t) \\ &= b(s_t) \sum_{a_t}\nabla_\theta\pi_\theta(a_t|s_t) \\ &= b(s_t)\nabla_\theta \sum_{a_t}\pi_\theta(a_t|s_t) \\ &= b(s_t)\nabla_\theta 1 \\ &=0 \end{aligned}

通常令 baseline 为价值函数 Vπ(st)V^\pi(s_t),则得到优势函数形式:

∇θJ(θ)=Eτ∼πθ[∑t=0T−1Aπ(st,at)∇θlog⁡πθ(at∣st)]\nabla_\theta J(\theta) = \mathbb{E}_{\tau\sim\pi_\theta} \left[ \sum_{t=0}^{T-1} A^\pi(s_t,a_t) \nabla_\theta \log \pi_\theta(a_t|s_t) \right]

如果 Aπ(st,at)>0A^\pi(s_t,a_t)>0,说明动作 ata_t 比当前状态下的平均动作更好,应提高其概率;如果 Aπ(st,at)<0A^\pi(s_t,a_t)<0,说明动作 ata_t 比当前状态下的平均动作更差,应降低其概率。


三、Actor-Critic 梯度形式

1. Actor 目标

在 Actor-Critic 中,Actor 表示策略 πθ\pi_\theta,Critic 估计价值函数 VϕV_\phi。用估计优势 A^t\hat A_t 替代真实优势,可写出 Actor 的最大化目标:

Jactor(θ)=Et[A^tlog⁡πθ(at∣st)]J_{\text{actor}}(\theta) = \mathbb{E}_t \left[ \hat A_t \log \pi_\theta(a_t|s_t) \right]

其中 A^t\hat A_t 通常由 TD Error、GAE 或 MC return 得到。在更新 Actor 时,A^t\hat A_t 一般视为常数,即不让 Actor loss 的梯度回传进优势估计过程。

对 Actor 目标求梯度:

∇θJactor(θ)=Et[A^t∇θlog⁡πθ(at∣st)]\nabla_\theta J_{\text{actor}}(\theta) = \mathbb{E}_t \left[ \hat A_t \nabla_\theta \log \pi_\theta(a_t|s_t) \right]

若使用梯度下降实现,则通常最小化负目标:

Lactor(θ)=−Et[A^tlog⁡πθ(at∣st)]L_{\text{actor}}(\theta) = - \mathbb{E}_t \left[ \hat A_t \log \pi_\theta(a_t|s_t) \right]

对应梯度为:

∇θLactor(θ)=−Et[A^t∇θlog⁡πθ(at∣st)]\nabla_\theta L_{\text{actor}}(\theta) = - \mathbb{E}_t \left[ \hat A_t \nabla_\theta \log \pi_\theta(a_t|s_t) \right]

2. Critic 目标

Critic 的目标是拟合回报目标 R^t\hat R_t。常见形式为:

Lcritic(ϕ)=12Et[(Vϕ(st)−R^t)2]L_{\text{critic}}(\phi) = \frac{1}{2} \mathbb{E}_t \left[ \left(V_\phi(s_t)-\hat R_t\right)^2 \right]

其中 R^t\hat R_t 可以由 MC return 或 GAE return 构造。例如:

R^t=A^t+Vϕold(st)\hat R_t = \hat A_t + V_{\phi_{\text{old}}}(s_t)

其中 A^t\hat A_t 的具体构造(如 GAE)见第七节。

对 Critic 参数求梯度:

∇ϕLcritic(ϕ)=Et[(Vϕ(st)−R^t)∇ϕVϕ(st)]\nabla_\phi L_{\text{critic}}(\phi) = \mathbb{E}_t \left[ \left(V_\phi(s_t)-\hat R_t\right) \nabla_\phi V_\phi(s_t) \right]

关键区别:Actor 梯度作用在动作概率上,Critic 梯度作用在状态价值预测上。

Actor 负责改变策略分布,Critic 负责提供更稳定的优势估计。


四、重要性采样与 PPO 代理目标

1. 数据来自旧策略

普通策略梯度要求数据来自当前策略 πθ\pi_\theta:

∇θJ(θ)=Et∼πθ[A^t∇θlog⁡πθ(at∣st)]\nabla_\theta J(\theta) = \mathbb{E}_{t\sim\pi_\theta} \left[ \hat A_t \nabla_\theta \log \pi_\theta(a_t|s_t) \right]

但 PPO 会用旧策略 πθold\pi_{\theta_{\text{old}}} 采样一批数据,然后在这批数据上做多轮 minibatch 更新。此时数据分布来自旧策略,因此需要用重要性采样把期望改写到旧策略分布下。

对于任意函数 f(x)f(x):

Ex∼p[f(x)]=∫p(x)f(x)dx=∫p(x)q(x)q(x)f(x)dx=Ex∼q[p(x)q(x)f(x)]\mathbb{E}_{x\sim p}[f(x)] = \int p(x)f(x)dx = \int \frac{p(x)}{q(x)}q(x)f(x)dx = \mathbb{E}_{x\sim q} \left[ \frac{p(x)}{q(x)}f(x) \right]

如果直接把这个公式套到整条轨迹上,应该得到轨迹级别的重要性采样比值。把新旧策略下的轨迹概率相除:

P(τ∣θ)P(τ∣θold)=ρ0(s0)∏t=0T−1πθ(at∣st)P(st+1∣st,at)ρ0(s0)∏t=0T−1πθold(at∣st)P(st+1∣st,at)=∏t=0T−1πθ(at∣st)πθold(at∣st)\begin{aligned} \frac{P(\tau|\theta)} {P(\tau|\theta_{\text{old}})} &= \frac{ \rho_0(s_0) \prod_{t=0}^{T-1} \pi_\theta(a_t|s_t) P(s_{t+1}|s_t,a_t) }{ \rho_0(s_0) \prod_{t=0}^{T-1} \pi_{\theta_{\text{old}}}(a_t|s_t) P(s_{t+1}|s_t,a_t) } \\ &= \prod_{t=0}^{T-1} \frac{\pi_\theta(a_t|s_t)} {\pi_{\theta_{\text{old}}}(a_t|s_t)} \end{aligned}

其中初始状态分布 ρ0\rho_0 和环境转移概率 P(st+1∣st,at)P(s_{t+1}|s_t,a_t) 都被抵消。

因此,理论上可以把新策略下的期望改写为旧策略下的期望:

Eτ∼πθ[R(τ)]=Eτ∼πθold[P(τ∣θ)P(τ∣θold)R(τ)]\mathbb{E}_{\tau\sim\pi_\theta}[R(\tau)] = \mathbb{E}_{\tau\sim\pi_{\theta_{\text{old}}}} \left[ \frac{P(\tau|\theta)} {P(\tau|\theta_{\text{old}})} R(\tau) \right]

但这个轨迹级别的比值是很多步概率比值的连乘,轨迹稍长时方差会非常大。PPO 不直接使用完整轨迹比值,而是构造一个局部代理目标:状态分布沿用旧策略采样得到的经验分布,只在动作分布上用新旧策略的单步概率比值做修正。

2. 从梯度反推代理目标

局部代理目标的具体形式并不靠直接构造目标函数得到,而是先在梯度表达式上做采样修正,再把修正后的梯度写回成某个函数的导数(反推),那个函数就是要找的代理目标。

本节开头的策略梯度,固定状态 sts_t,只在动作维度上做重要性采样:

Eat∼πθ(⋅∣st)[A^t∇θlog⁡πθ(at∣st)]=Eat∼πθold(⋅∣st)[πθ(at∣st)πθold(at∣st)A^t∇θlog⁡πθ(at∣st)]\mathbb{E}_{a_t\sim\pi_\theta(\cdot|s_t)} \left[ \hat A_t \nabla_\theta \log \pi_\theta(a_t|s_t) \right] = \mathbb{E}_{a_t\sim\pi_{\theta_{\text{old}}}(\cdot|s_t)} \left[ \frac{\pi_\theta(a_t|s_t)} {\pi_{\theta_{\text{old}}}(a_t|s_t)} \hat A_t \nabla_\theta \log \pi_\theta(a_t|s_t) \right]

其中的权重就是符号约定里的单步概率比值:

rt(θ)=πθ(at∣st)πθold(at∣st)r_t(\theta)= \frac{\pi_\theta(a_t|s_t)} {\pi_{\theta_{\text{old}}}(a_t|s_t)}

这一步是精确的。接着把状态按旧策略采样到的经验分布求平均,得到修正后的梯度估计:

g^(θ)=Et∼πθold[rt(θ)A^t∇θlog⁡πθ(at∣st)]\hat g(\theta) = \mathbb{E}_{t\sim\pi_{\theta_{\text{old}}}} \left[ r_t(\theta) \hat A_t \nabla_\theta \log \pi_\theta(a_t|s_t) \right]

这一步则是近似:真正的策略梯度要求状态也来自新策略的访问分布 dθd_\theta,这里直接用旧策略的 dθoldd_{\theta_{\text{old}}} 代替。

接下来反推 g^(θ)\hat g(\theta) 是谁的梯度,即把它写成 ∇θ(⋯ )\nabla_\theta(\cdots) 的形式,才可以进行自动微分。关键在于 rt(θ)∇θlog⁡πθ(at∣st)r_t(\theta)\nabla_\theta\log\pi_\theta(a_t|s_t) 本身是一个完整的导数,且旧策略概率与 θ\theta 无关,于是:

rt(θ)∇θlog⁡πθ(at∣st)=πθ(at∣st)πθold(at∣st)⋅∇θπθ(at∣st)πθ(at∣st)=∇θπθ(at∣st)πθold(at∣st)=∇θrt(θ)r_t(\theta) \nabla_\theta \log \pi_\theta(a_t|s_t) = \frac{\pi_\theta(a_t|s_t)} {\pi_{\theta_{\text{old}}}(a_t|s_t)} \cdot \frac{\nabla_\theta \pi_\theta(a_t|s_t)} {\pi_\theta(a_t|s_t)} = \frac{\nabla_\theta \pi_\theta(a_t|s_t)} {\pi_{\theta_{\text{old}}}(a_t|s_t)} = \nabla_\theta r_t(\theta)

代回原公式 g^(θ)\hat g(\theta) 后,由于 A^t\hat A_t 与采样分布 πθold\pi_{\theta_{\text{old}}} 都不依赖 θ\theta,因此梯度算子可以提到期望外:

g^(θ)=Et∼πθold[A^t∇θrt(θ)]=∇θEt∼πθold[rt(θ)A^t]\begin{aligned} \hat g(\theta) &= \mathbb{E}_{t\sim\pi_{\theta_{\text{old}}}} \left[ \hat A_t \nabla_\theta r_t(\theta) \right] \\ &= \nabla_\theta \mathbb{E}_{t\sim\pi_{\theta_{\text{old}}}} \left[ r_t(\theta)\hat A_t \right] \end{aligned}

此时可得到 PPO 的未裁剪代理目标,通常记为 JPG(θ)J^{\text{PG}}(\theta),其中 PG 表示 policy gradient:

JPG(θ)=Et∼πθold[rt(θ)A^t]J^{\text{PG}}(\theta) = \mathbb{E}_{t\sim\pi_{\theta_{\text{old}}}} \left[ r_t(\theta)\hat A_t \right]

JPGJ^{\text{PG}} 由梯度反推出来,而非先写目标再求导。代理目标里出现 rt(θ)r_t(\theta) 而不是 log⁡πθ(at∣st)\log\pi_\theta(a_t|s_t),原因在于重要性采样权重 rtr_t 和 log 梯度合并成了 ∇θrt\nabla_\theta r_t。

这里的 A^t\hat A_t 由旧策略采样得到,在一轮 PPO 更新中视为常数。需要强调两点:

  • JPGJ^{\text{PG}} 不是把普通 Actor-Critic 目标里的 log⁡πθ(at∣st)\log\pi_\theta(a_t|s_t) 做代数变形得到的。Et[A^tlog⁡πθ]\mathbb{E}_t[\hat A_t\log\pi_\theta] 与 JPGJ^{\text{PG}} 都只是“求导之后能得到策略梯度”的替代目标,数值本身没有意义;两者的联系仅在于 θ=θold\theta=\theta_{\text{old}}(此时 rt=1r_t=1)处梯度相同,见下一节。
  • JPGJ^{\text{PG}} 也不是原始回报 J(θ)J(\theta) 的完全等价改写。上面的推导里有两处只在旧策略附近成立的近似:状态分布被冻结为 dθoldd_{\theta_{\text{old}}},A^t\hat A_t 被冻结为旧策略下的估计。因此 JPGJ^{\text{PG}} 是旧策略附近的局部代理目标:当新旧策略差距较小时,它可以近似反映新策略相对旧策略的改进方向;rtr_t 一旦偏离 1 太多,近似就失效(后续引入 clip 的原因)。

补充:更严格的推导路线。 从梯度反推的好处是直观,代价是只能保证 θ=θold\theta=\theta_{\text{old}} 一点上梯度正确,说不清代理目标本身的数值意味着什么。TRPO 与 PPO 原论文走的是另一条路:从性能差分引理(performance difference lemma,Kakade & Langford, 2002)出发,新旧策略的回报之差可以用旧策略的优势函数精确表示:

J(θ)−J(θold)=∑sdθ(s) Ea∼πθ(⋅∣s)[Aπθold(s,a)]J(\theta)-J(\theta_{\text{old}}) = \sum_s d_\theta(s) \, \mathbb{E}_{a\sim\pi_\theta(\cdot|s)} \left[ A^{\pi_{\theta_{\text{old}}}}(s,a) \right]

其中 dθ(s)=∑tγtP(st=s∣πθ)d_\theta(s)=\sum_t\gamma^t P(s_t=s|\pi_\theta) 是新策略的折扣状态访问分布。这是恒等式;把 dθd_\theta 近似为 dθoldd_{\theta_{\text{old}}}(也就是同样冻结状态分布),再对动作做重要性采样,得到的就是同一个 JPGJ^{\text{PG}}。这条路线的好处是能说明代理目标的数值本身对应策略改进量,并且能给出替换 dθd_\theta 所引入的误差界,从而严格导出信任域约束。细节见 TRPO 论文第 2、3 节。

3. 未裁剪目标的梯度

反过来对 JPG(θ)J^{\text{PG}}(\theta) 求梯度,等于把上一节的推导倒着走一遍。A^t\hat A_t 视为常数,于是:

∇θJPG(θ)=Et∼πθold[A^t∇θrt(θ)]\nabla_\theta J^{\text{PG}}(\theta) = \mathbb{E}_{t\sim\pi_{\theta_{\text{old}}}} \left[ \hat A_t \nabla_\theta r_t(\theta) \right]

再用上一节的恒等式 ∇θrt(θ)=rt(θ)∇θlog⁡πθ(at∣st)\nabla_\theta r_t(\theta)=r_t(\theta)\nabla_\theta\log\pi_\theta(a_t|s_t),把对 ratio 的求导转回到熟悉的 log probability 梯度:

∇θJPG(θ)=Et∼πθold[rt(θ)A^t∇θlog⁡πθ(at∣st)]\nabla_\theta J^{\text{PG}}(\theta) = \mathbb{E}_{t\sim\pi_{\theta_{\text{old}}}} \left[ r_t(\theta)\hat A_t \nabla_\theta \log \pi_\theta(a_t|s_t) \right]

将 rt(θ)r_t(\theta) 按定义展开,等价于:

∇θJPG(θ)=Et∼πθold[πθ(at∣st)πθold(at∣st)A^t∇θlog⁡πθ(at∣st)]\nabla_\theta J^{\text{PG}}(\theta) = \mathbb{E}_{t\sim\pi_{\theta_{\text{old}}}} \left[ \frac{\pi_\theta(a_t|s_t)} {\pi_{\theta_{\text{old}}}(a_t|s_t)} \hat A_t \nabla_\theta \log \pi_\theta(a_t|s_t) \right]

这说明:rt(θ)r_t(\theta) 是旧策略样本的梯度权重校正项。如果新策略比旧策略更倾向于产生该动作(rt(θ)>1r_t(\theta)>1),该样本的梯度贡献会被放大;如果新策略相对不倾向于该动作(rt(θ)<1r_t(\theta)<1),该样本的梯度贡献会被缩小。

rt(θ)r_t(\theta) 把动作分布从 πθold\pi_{\theta_{\text{old}}} 搬到 πθ\pi_\theta,因此上式在动作维度等价于 Est∼dθold, at∼πθ[A^t∇θlog⁡πθ(at∣st)]\mathbb{E}_{s_t\sim d_{\theta_{\text{old}}},\,a_t\sim\pi_\theta}[\hat A_t\nabla_\theta\log\pi_\theta(a_t|s_t)]。但它只修正单步动作概率,未修正状态访问分布,状态仍采自 dθoldd_{\theta_{\text{old}}}。所以它不等于真正的新策略期望 Eτ∼πθ[⋅]\mathbb{E}_{\tau\sim\pi_\theta}[\cdot](后者要求 st∼dθs_t\sim d_\theta),只是旧状态分布上的局部代理——这也是 JPGJ^{\text{PG}} 仅在新旧策略接近时才可靠的原因。

当 θ=θold\theta=\theta_{\text{old}} 时,rt(θ)=1r_t(\theta)=1,该式退化为普通 Actor-Critic 策略梯度:

∇θJPG(θold)=Et∼πθold[A^t∇θlog⁡πθ(at∣st)]\nabla_\theta J^{\text{PG}}(\theta_{\text{old}}) = \mathbb{E}_{t\sim\pi_{\theta_{\text{old}}}} \left[ \hat A_t \nabla_\theta \log \pi_\theta(a_t|s_t) \right]

重要性采样让旧策略采集的数据可以用于估计新策略的目标,但 rt(θ)r_t(\theta) 偏离 1 太远时,估计方差会变大,训练也会变得不稳定。

后文若简写为 Et\mathbb{E}_t,默认表示对旧策略采样得到的 batch 时间步求平均。


五、PPO-Clip 目标

1. 裁剪形式

上一节指出,当 rt(θ)r_t(\theta) 偏离 1 太远时估计方差变大、训练不稳定,因此需要约束新旧策略的偏离程度。

TRPO 的做法是显式加上 KL 散度的硬约束,把更新限制在一个信任域内;但这需要求解带约束的优化问题,实现复杂。PPO 用更简单的方式近似达到同样目的:直接对概率比值 rt(θ)r_t(\theta) 做裁剪。

PPO-Clip 将未裁剪目标 rt(θ)A^tr_t(\theta)\hat A_t 改写为:

JCLIP(θ)=Et[min⁡(rt(θ)A^t,clip(rt(θ),1−ϵ,1+ϵ)A^t)]J^{\text{CLIP}}(\theta) = \mathbb{E}_t \left[ \min \left( r_t(\theta)\hat A_t, \text{clip}(r_t(\theta),1-\epsilon,1+\epsilon)\hat A_t \right) \right]

其中:

clip(rt,1−ϵ,1+ϵ)={1−ϵ,rt<1−ϵrt,1−ϵ≤rt≤1+ϵ1+ϵ,rt>1+ϵ\text{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}

该目标仍然是最大化目标。实际代码中常写成最小化:

LCLIP(θ)=−JCLIP(θ)L^{\text{CLIP}}(\theta)=-J^{\text{CLIP}}(\theta)

这里取 min⁡\min 而非直接裁剪 rtr_t 是关键:它让裁剪只在 rt(θ)r_t(\theta) 朝着"使目标继续变好"的方向越界时才生效,而在反方向(纠正已经偏离过头的概率)上不做限制。下面两节按优势符号分别展开,可以看到这一非对称行为的具体来源。

2. 正优势时的分段梯度

先考虑 A^t>0\hat A_t>0。此时动作优于平均,策略应提高该动作概率,即希望 rt(θ)r_t(\theta) 增大。

由于 A^t>0\hat A_t>0,有:

min⁡(rtA^t,clip(rt)A^t)={rtA^t,rt≤1+ϵ(1+ϵ)A^t,rt>1+ϵ\min(r_t\hat A_t,\text{clip}(r_t)\hat A_t) = \begin{cases} r_t\hat A_t, & r_t \le 1+\epsilon \\ (1+\epsilon)\hat A_t, & r_t > 1+\epsilon \end{cases}

对应梯度为:

∇θJtCLIP={A^t∇θrt(θ),rt<1+ϵ0,rt>1+ϵ\nabla_\theta J_t^{\text{CLIP}} = \begin{cases} \hat A_t \nabla_\theta r_t(\theta), & r_t < 1+\epsilon \\ 0, & r_t > 1+\epsilon \end{cases}

代入 ∇θrt(θ)=rt(θ)∇θlog⁡πθ(at∣st)\nabla_\theta r_t(\theta)=r_t(\theta)\nabla_\theta\log\pi_\theta(a_t|s_t):

∇θJtCLIP={rt(θ)A^t∇θlog⁡πθ(at∣st),rt<1+ϵ0,rt>1+ϵ\nabla_\theta J_t^{\text{CLIP}} = \begin{cases} r_t(\theta)\hat A_t \nabla_\theta\log\pi_\theta(a_t|s_t), & r_t < 1+\epsilon \\ 0, & r_t > 1+\epsilon \end{cases}

3. 负优势时的分段梯度

再考虑 A^t<0\hat A_t<0。此时动作差于平均,策略应降低该动作概率,即希望 rt(θ)r_t(\theta) 减小。

由于 A^t<0\hat A_t<0,乘以负数会改变大小关系,因此:

min⁡(rtA^t,clip(rt)A^t)={(1−ϵ)A^t,rt<1−ϵrtA^t,rt≥1−ϵ\min(r_t\hat A_t,\text{clip}(r_t)\hat A_t) = \begin{cases} (1-\epsilon)\hat A_t, & r_t < 1-\epsilon \\ r_t\hat A_t, & r_t \ge 1-\epsilon \end{cases}

对应梯度为:

∇θJtCLIP={0,rt<1−ϵA^t∇θrt(θ),rt>1−ϵ\nabla_\theta J_t^{\text{CLIP}} = \begin{cases} 0, & r_t < 1-\epsilon \\ \hat A_t \nabla_\theta r_t(\theta), & r_t > 1-\epsilon \end{cases}

也就是:

∇θJtCLIP={0,rt<1−ϵrt(θ)A^t∇θlog⁡πθ(at∣st),rt>1−ϵ\nabla_\theta J_t^{\text{CLIP}} = \begin{cases} 0, & r_t < 1-\epsilon \\ r_t(\theta)\hat A_t \nabla_\theta\log\pi_\theta(a_t|s_t), & r_t > 1-\epsilon \end{cases}

4. 分段梯度汇总

下图把两种符号下的单样本最大化目标画成 rt(θ)r_t(\theta) 的函数。绿色线段保留梯度,橙色水平线段表示该侧已被裁剪:

PPO Clip 在正负优势下的分段目标与梯度 左右两个坐标图展示单样本裁剪目标随概率比变化的形状。正优势时,目标在一加 epsilon 之前线性上升,之后水平且梯度为零;负优势时,目标在一减 epsilon 之前水平且梯度为零,之后随概率比线性下降。 正优势 · Âₜ > 0 先线性增大,越过上界后不再奖励增大概率 负优势 · Âₜ < 0 下界左侧取更小的常数,越过下界后线性下降 目标 Jₜ rₜ(θ) 斜率 Âₜ > 0 梯度 0 1 − ε 1 1 + ε 可更新区间 裁剪区间 目标 Jₜ rₜ(θ) 梯度 0 斜率 Âₜ < 0 1 − ε 1 1 + ε 裁剪区间 可更新区间 min 只截断让目标继续变好的越界侧;朝旧策略纠偏时仍保留梯度

六、PPO 中的完整损失

实际训练中,PPO 通常同时优化 Actor、Critic 和熵正则。若写成最大化目标:

JPPO(θ,ϕ)=JCLIP(θ)−cvLcritic(ϕ)+ceEt[H(πθ(⋅∣st))]J_{\text{PPO}}(\theta,\phi) = J^{\text{CLIP}}(\theta) - c_v L_{\text{critic}}(\phi) + c_e \mathbb{E}_t[H(\pi_\theta(\cdot|s_t))]

若写成最小化损失:

LPPO(θ,ϕ)=−JCLIP(θ)+cvLcritic(ϕ)−ceEt[H(πθ(⋅∣st))]L_{\text{PPO}}(\theta,\phi) = - J^{\text{CLIP}}(\theta) + c_v L_{\text{critic}}(\phi) - c_e \mathbb{E}_t[H(\pi_\theta(\cdot|s_t))]

其中:

  • JCLIPJ^{\text{CLIP}}:Actor 的裁剪代理目标。
  • LcriticL_{\text{critic}}:Critic 的价值回归损失。
  • H(πθ)H(\pi_\theta):策略熵,用于鼓励探索,避免策略过早塌缩。
  • cv,cec_v,c_e:价值损失和熵正则的权重。

其中策略熵定义为:

H(πθ(⋅∣st))=−∑aπθ(a∣st)log⁡πθ(a∣st)H(\pi_\theta(\cdot|s_t)) = -\sum_{a}\pi_\theta(a|s_t)\log\pi_\theta(a|s_t)

熵越大表示动作分布越分散,最大化熵项可以避免策略过快收敛到确定性分布。

Actor 和 Critic 若共享部分网络参数,则总梯度会在共享参数处相加;若二者完全独立,则 Actor loss 只更新策略网络,Critic loss 只更新价值网络。

1. Actor 梯度

最小化形式下,Actor 梯度为:

∇θLactorPPO=−∇θJCLIP(θ)−ce∇θEt[H(πθ(⋅∣st))]\nabla_\theta L_{\text{actor}}^{\text{PPO}} = - \nabla_\theta J^{\text{CLIP}}(\theta) - c_e \nabla_\theta \mathbb{E}_t[H(\pi_\theta(\cdot|s_t))]

其中 ∇θJCLIP(θ)\nabla_\theta J^{\text{CLIP}}(\theta) 按上一节的分段形式计算。

2. Critic 梯度

若采用未裁剪价值损失:

Lcritic(ϕ)=12Et[(Vϕ(st)−R^t)2]L_{\text{critic}}(\phi) = \frac{1}{2}\mathbb{E}_t[(V_\phi(s_t)-\hat R_t)^2]

则:

∇ϕLcritic(ϕ)=Et[(Vϕ(st)−R^t)∇ϕVϕ(st)]\nabla_\phi L_{\text{critic}}(\phi) = \mathbb{E}_t \left[ (V_\phi(s_t)-\hat R_t)\nabla_\phi V_\phi(s_t) \right]

部分实现也会使用 value clipping:

Vtclip=Vϕold(st)+clip(Vϕ(st)−Vϕold(st),−ϵv,ϵv)V_t^{\text{clip}} = V_{\phi_{\text{old}}}(s_t) + \text{clip} \left( V_\phi(s_t)-V_{\phi_{\text{old}}}(s_t), -\epsilon_v, \epsilon_v \right)

对应损失:

Lcriticclip(ϕ)=12Et[max⁡((Vϕ(st)−R^t)2,(Vtclip−R^t)2)]L_{\text{critic}}^{\text{clip}}(\phi) = \frac{1}{2} \mathbb{E}_t \left[ \max \left( (V_\phi(s_t)-\hat R_t)^2, (V_t^{\text{clip}}-\hat R_t)^2 \right) \right]

其作用与 Actor clipping 类似:限制价值函数在同一批旧数据上的更新幅度,避免 Critic 在多轮 epoch 中变化过大。


七、GAE 与 PPO 梯度的关系

PPO 的梯度核心依赖 A^t\hat A_t。在实践中,A^t\hat A_t 常由 GAE 给出:

A^tGAE=∑l=0T−t−1(γλ)lδt+l\hat A_t^{GAE} = \sum_{l=0}^{T-t-1} (\gamma\lambda)^l\delta_{t+l}

其中:

δt=rt+γVϕold(st+1)−Vϕold(st)\delta_t = r_t+\gamma V_{\phi_{\text{old}}}(s_{t+1}) -V_{\phi_{\text{old}}}(s_t)

GAE 计算依赖旧价值函数 VϕoldV_{\phi_{\text{old}}},因此 PPO 的 Actor 梯度不会对 A^t\hat A_t 继续求导,而是把它当作每个动作的固定权重:

∇θJCLIP∼A^t∇θrt(θ)\nabla_\theta J^{\text{CLIP}} \sim \hat A_t \nabla_\theta r_t(\theta)

因此可以把 PPO 的 Actor 更新理解为:

  • GAE 决定每个动作的优势权重。
  • ratio 决定新旧策略在该动作上的概率变化。
  • clip 决定该样本是否还允许继续沿当前方向更新。

八、训练流程

PPO 的一次外层迭代通常包含以下步骤:

  1. 使用旧策略 πθold\pi_{\theta_{\text{old}}} 与环境交互,采样轨迹。
  2. 缓存每个动作的 log⁡πθold(at∣st)\log \pi_{\theta_{\text{old}}}(a_t|s_t)、价值 Vϕold(st)V_{\phi_{\text{old}}}(s_t)、奖励和终止标记。
  3. 使用奖励和旧价值函数计算 A^tGAE\hat A_t^{GAE} 与 R^t\hat R_t。
  4. 在同一批数据上进行多轮 minibatch 更新。
  5. 每次更新时重新计算 log⁡πθ(at∣st)\log \pi_\theta(a_t|s_t),得到 rt(θ)r_t(\theta)。
  6. 使用 PPO-Clip actor loss、critic loss 和 entropy bonus 更新参数。
  7. 当前策略更新完成后,令 θold←θ\theta_{\text{old}}\leftarrow\theta,进入下一轮采样。

关键约束:旧 logprob、旧 value、advantage 和 return 在一轮 PPO 更新中通常固定;新 logprob 和新 value 每次前向都会重新计算。


九、总结

PPO 的梯度推导可以沿着以下链条理解:

∇J(θ)=E[At∇log⁡πθ(at∣st)]⟹E[rt(θ)At∇log⁡πθ(at∣st)]⟹∇JCLIP(θ)\nabla J(\theta) = \mathbb{E} \left[ A_t\nabla\log\pi_\theta(a_t|s_t) \right] \quad \Longrightarrow \quad \mathbb{E} \left[ r_t(\theta)A_t\nabla\log\pi_\theta(a_t|s_t) \right] \quad \Longrightarrow \quad \nabla J^{\text{CLIP}}(\theta)

其中:

  • 策略梯度来自 log-derivative trick,将对采样分布的求导转为对 log probability 的求导。
  • 优势函数作为梯度权重,决定某个动作概率应该被提高还是降低。
  • 重要性采样引入 rt(θ)r_t(\theta),使旧策略采样的数据可以用于新策略更新。
  • PPO-Clip通过分段目标截断“过度变好”的方向,避免新策略相对旧策略变化过大。
  • 梯度截断并非双向固定:正优势只截断过度增大概率,负优势只截断过度降低概率。

从梯度角度看,PPO-Clip 的本质是:在保留策略梯度方向的同时,去掉那些已经超过信任范围、还会继续扩大策略偏移的样本梯度。


参考资料

PPO策略梯度Actor-Critic