PPO(Proximal Policy Optimization)是基于策略梯度的强化学习算法。它的核心不是重新定义一个完全不同的优化方向,而是在策略梯度 的基础上加入重要性采样 和裁剪约束 ,使同一批轨迹可以被重复训练,同时避免新策略偏离旧策略过远。
本文围绕 PPO 的梯度更新主线,逐步得到 Actor-Critic、重要性采样目标以及 PPO-Clip 目标,并重点分析 PPO 目标函数对策略参数的梯度形式。
一、符号约定
设策略为随机策略:
a t ∼ π θ ( ⋅ ∣ s t ) a_t \sim \pi_\theta(\cdot|s_t) a t ∼ π θ ( ⋅ ∣ s t )
其中 θ \theta θ 是策略网络参数。一次轨迹记为:
τ = ( s 0 , a 0 , r 0 , s 1 , a 1 , r 1 , … , s T − 1 , a T − 1 , r T − 1 ) \tau = (s_0,a_0,r_0,s_1,a_1,r_1,\dots,s_{T-1},a_{T-1},r_{T-1}) τ = ( s 0 , a 0 , r 0 , s 1 , a 1 , r 1 , … , s T − 1 , a T − 1 , r T − 1 )
轨迹回报定义为:
R ( τ ) = ∑ t = 0 T − 1 γ t r t R(\tau)=\sum_{t=0}^{T-1}\gamma^t r_t R ( τ ) = t = 0 ∑ T − 1 γ t r t
单步后的折扣回报定义为:
G t = ∑ l = 0 T − t − 1 γ l r t + l G_t=\sum_{l=0}^{T-t-1}\gamma^l r_{t+l} G t = l = 0 ∑ T − t − 1 γ l r t + l
价值函数与优势函数定义为:
V π ( s t ) = E π [ G t ∣ s t ] V^\pi(s_t)=\mathbb{E}_\pi[G_t|s_t] V π ( s t ) = E π [ G t ∣ s t ]
Q π ( s t , a t ) = E π [ G t ∣ s t , a t ] Q^\pi(s_t,a_t)=\mathbb{E}_\pi[G_t|s_t,a_t] Q π ( s t , a t ) = E π [ G t ∣ s t , a t ]
A π ( s t , a t ) = Q π ( s t , a t ) − V π ( s t ) A^\pi(s_t,a_t)=Q^\pi(s_t,a_t)-V^\pi(s_t) A π ( s t , a t ) = Q π ( s t , a t ) − V π ( s t )
PPO 中通常用 π θ old \pi_{\theta_{\text{old}}} π θ old 表示采样轨迹时的旧策略,用 π θ \pi_\theta π θ 表示正在更新的新策略。定义概率比值:
r t ( θ ) = π θ ( a t ∣ s t ) π θ old ( a t ∣ s t ) r_t(\theta)=
\frac{\pi_\theta(a_t|s_t)}
{\pi_{\theta_{\text{old}}}(a_t|s_t)} r t ( θ ) = π θ old ( a t ∣ s t ) π θ ( a t ∣ s t )
这里的 r t ( θ ) r_t(\theta) r t ( θ ) 表示 ratio,和奖励符号 r t r_t r t 不是同一个量。为了贴近 PPO 论文习惯,后文仍沿用 r t ( θ ) r_t(\theta) r t ( θ ) 表示概率比值。
在实现中,常用 log probability 计算:
r t ( θ ) = exp ( log π θ ( a t ∣ s t ) − log π θ old ( a t ∣ s t ) ) r_t(\theta)=
\exp\left(
\log \pi_\theta(a_t|s_t)
-
\log \pi_{\theta_{\text{old}}}(a_t|s_t)
\right) r t ( θ ) = exp ( log π θ ( a t ∣ s t ) − log π θ old ( a t ∣ s t ) )
其中 log π θ old ( a t ∣ s t ) \log \pi_{\theta_{\text{old}}}(a_t|s_t) log π θ old ( a t ∣ s t ) 来自采样时缓存的旧策略输出,在更新过程中视为常数。
二、策略梯度基础推导
1. 优化目标
策略优化的总体目标是最大化期望回报:
J ( θ ) = E τ ∼ π θ [ R ( τ ) ] J(\theta)=\mathbb{E}_{\tau\sim \pi_\theta}[R(\tau)] J ( θ ) = E τ ∼ π θ [ R ( τ )]
写成对所有轨迹的求和形式:
J ( θ ) = ∑ τ P ( τ ∣ θ ) R ( τ ) J(\theta)=\sum_\tau P(\tau|\theta)R(\tau) J ( θ ) = τ ∑ P ( τ ∣ θ ) R ( τ )
其中 P ( τ ∣ θ ) P(\tau|\theta) P ( τ ∣ θ ) 表示在策略 π θ \pi_\theta π θ 下采样到轨迹 τ \tau τ 的概率。
2. 对目标求梯度
对 J ( θ ) J(\theta) J ( θ ) 求梯度:
∇ θ 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} ∇ θ J ( θ ) = ∇ θ τ ∑ P ( τ ∣ θ ) R ( τ ) = τ ∑ R ( τ ) ∇ θ P ( τ ∣ θ )
引入 log-derivative trick:
∇ θ P ( τ ∣ θ ) = P ( τ ∣ θ ) ∇ θ log P ( τ ∣ θ ) \nabla_\theta P(\tau|\theta)
=
P(\tau|\theta)\nabla_\theta \log P(\tau|\theta) ∇ θ P ( τ ∣ θ ) = P ( τ ∣ θ ) ∇ θ log P ( τ ∣ θ )
代入可得:
∇ θ 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} ∇ θ J ( θ ) = τ ∑ R ( τ ) P ( τ ∣ θ ) ∇ θ log P ( τ ∣ θ ) = E τ ∼ π θ [ R ( τ ) ∇ θ log P ( τ ∣ θ ) ]
关键结论 :无法直接对采样过程求导时,可以转为对轨迹概率的 log probability 求导。
3. 展开轨迹概率
轨迹概率可写为:
P ( τ ∣ θ ) = ρ 0 ( s 0 ) ∏ t = 0 T − 1 π θ ( a t ∣ s t ) P ( s t + 1 ∣ s t , a t ) 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) P ( τ ∣ θ ) = ρ 0 ( s 0 ) t = 0 ∏ T − 1 π θ ( a t ∣ s t ) P ( s t + 1 ∣ s t , a t )
取对数:
log P ( τ ∣ θ ) = log ρ 0 ( s 0 ) + ∑ t = 0 T − 1 log π θ ( a t ∣ s t ) + ∑ t = 0 T − 1 log P ( s t + 1 ∣ s t , a t ) \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) log P ( τ ∣ θ ) = log ρ 0 ( s 0 ) + t = 0 ∑ T − 1 log π θ ( a t ∣ s t ) + t = 0 ∑ T − 1 log P ( s t + 1 ∣ s t , a t )
对 θ \theta θ 求梯度时,初始状态分布 ρ 0 \rho_0 ρ 0 和环境转移概率 P ( s t + 1 ∣ s t , a t ) P(s_{t+1}|s_t,a_t) P ( s t + 1 ∣ s t , a t ) 与策略参数无关,因此梯度为 0:
∇ θ log P ( τ ∣ θ ) = ∑ t = 0 T − 1 ∇ θ log π θ ( a t ∣ s t ) \nabla_\theta \log P(\tau|\theta)
=
\sum_{t=0}^{T-1}
\nabla_\theta \log \pi_\theta(a_t|s_t) ∇ θ log P ( τ ∣ θ ) = t = 0 ∑ T − 1 ∇ θ log π θ ( a t ∣ s t )
代回策略梯度:
∇ θ J ( θ ) = E τ ∼ π θ [ R ( τ ) ∑ t = 0 T − 1 ∇ θ log π θ ( a t ∣ s t ) ] \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] ∇ θ J ( θ ) = E τ ∼ π θ [ R ( τ ) t = 0 ∑ T − 1 ∇ θ log π θ ( a t ∣ s t ) ]
这就是 REINFORCE 形式的策略梯度。
4. 从整条轨迹回报到单步优势
直接用整条轨迹回报 R ( τ ) R(\tau) R ( τ ) 评估每个动作,方差较大。更常见的形式是用从当前时刻开始的回报 G t G_t G t :
∇ θ J ( θ ) = E τ ∼ π θ [ ∑ t = 0 T − 1 G t ∇ θ log π θ ( a t ∣ s t ) ] \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] ∇ θ J ( θ ) = E τ ∼ π θ [ t = 0 ∑ T − 1 G t ∇ θ log π θ ( a t ∣ s t ) ]
进一步可以减去只依赖状态的 baseline b ( s t ) b(s_t) b ( s t ) :
∇ θ J ( θ ) = E τ ∼ π θ [ ∑ t = 0 T − 1 ( G t − b ( s t ) ) ∇ θ log π θ ( a t ∣ s t ) ] \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] ∇ θ J ( θ ) = E τ ∼ π θ [ t = 0 ∑ T − 1 ( G t − b ( s t )) ∇ θ log π θ ( a t ∣ s t ) ]
baseline 不改变梯度期望,因为:
E a t ∼ π θ ( ⋅ ∣ s t ) [ b ( s t ) ∇ θ log π θ ( a t ∣ s t ) ] = b ( s t ) ∑ a t π θ ( a t ∣ s t ) ∇ θ log π θ ( a t ∣ s t ) = b ( s t ) ∑ a t ∇ θ π θ ( a t ∣ s t ) = b ( s t ) ∇ θ ∑ a t π θ ( a t ∣ s t ) = b ( s t ) ∇ θ 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} E a t ∼ π θ ( ⋅ ∣ s t ) [ b ( s t ) ∇ θ log π θ ( a t ∣ s t ) ] = b ( s t ) a t ∑ π θ ( a t ∣ s t ) ∇ θ log π θ ( a t ∣ s t ) = b ( s t ) a t ∑ ∇ θ π θ ( a t ∣ s t ) = b ( s t ) ∇ θ a t ∑ π θ ( a t ∣ s t ) = b ( s t ) ∇ θ 1 = 0
通常令 baseline 为价值函数 V π ( s t ) V^\pi(s_t) V π ( s t ) ,则得到优势函数形式:
∇ θ J ( θ ) = E τ ∼ π θ [ ∑ t = 0 T − 1 A π ( s t , a t ) ∇ θ log π θ ( a t ∣ s t ) ] \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] ∇ θ J ( θ ) = E τ ∼ π θ [ t = 0 ∑ T − 1 A π ( s t , a t ) ∇ θ log π θ ( a t ∣ s t ) ]
如果 A π ( s t , a t ) > 0 A^\pi(s_t,a_t)>0 A π ( s t , a t ) > 0 ,说明动作 a t a_t a t 比当前状态下的平均动作更好,应提高其概率;如果 A π ( s t , a t ) < 0 A^\pi(s_t,a_t)<0 A π ( s t , a t ) < 0 ,说明动作 a t a_t a t 比当前状态下的平均动作更差,应降低其概率。
三、Actor-Critic 梯度形式
1. Actor 目标
在 Actor-Critic 中,Actor 表示策略 π θ \pi_\theta π θ ,Critic 估计价值函数 V ϕ V_\phi V ϕ 。用估计优势 A ^ t \hat A_t A ^ t 替代真实优势,可写出 Actor 的最大化目标:
J actor ( θ ) = E t [ A ^ t log π θ ( a t ∣ s t ) ] J_{\text{actor}}(\theta)
=
\mathbb{E}_t
\left[
\hat A_t \log \pi_\theta(a_t|s_t)
\right] J actor ( θ ) = E t [ A ^ t log π θ ( a t ∣ s t ) ]
其中 A ^ t \hat A_t A ^ t 通常由 TD Error、GAE 或 MC return 得到。在更新 Actor 时,A ^ t \hat A_t A ^ t 一般视为常数,即不让 Actor loss 的梯度回传进优势估计过程。
对 Actor 目标求梯度:
∇ θ J actor ( θ ) = E t [ A ^ t ∇ θ log π θ ( a t ∣ s t ) ] \nabla_\theta J_{\text{actor}}(\theta)
=
\mathbb{E}_t
\left[
\hat A_t
\nabla_\theta \log \pi_\theta(a_t|s_t)
\right] ∇ θ J actor ( θ ) = E t [ A ^ t ∇ θ log π θ ( a t ∣ s t ) ]
若使用梯度下降实现,则通常最小化负目标:
L actor ( θ ) = − E t [ A ^ t log π θ ( a t ∣ s t ) ] L_{\text{actor}}(\theta)
=
-
\mathbb{E}_t
\left[
\hat A_t \log \pi_\theta(a_t|s_t)
\right] L actor ( θ ) = − E t [ A ^ t log π θ ( a t ∣ s t ) ]
对应梯度为:
∇ θ L actor ( θ ) = − E t [ A ^ t ∇ θ log π θ ( a t ∣ s t ) ] \nabla_\theta L_{\text{actor}}(\theta)
=
-
\mathbb{E}_t
\left[
\hat A_t
\nabla_\theta \log \pi_\theta(a_t|s_t)
\right] ∇ θ L actor ( θ ) = − E t [ A ^ t ∇ θ log π θ ( a t ∣ s t ) ]
2. Critic 目标
Critic 的目标是拟合回报目标 R ^ t \hat R_t R ^ t 。常见形式为:
L critic ( ϕ ) = 1 2 E t [ ( V ϕ ( s t ) − 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] L critic ( ϕ ) = 2 1 E t [ ( V ϕ ( s t ) − R ^ t ) 2 ]
其中 R ^ t \hat R_t R ^ t 可以由 MC return 或 GAE return 构造。例如:
R ^ t = A ^ t + V ϕ old ( s t ) \hat R_t = \hat A_t + V_{\phi_{\text{old}}}(s_t) R ^ t = A ^ t + V ϕ old ( s t )
其中 A ^ t \hat A_t A ^ t 的具体构造(如 GAE)见第七节。
对 Critic 参数求梯度:
∇ ϕ L critic ( ϕ ) = E t [ ( V ϕ ( s t ) − R ^ t ) ∇ ϕ V ϕ ( s t ) ] \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] ∇ ϕ L critic ( ϕ ) = E t [ ( V ϕ ( s t ) − R ^ t ) ∇ ϕ V ϕ ( s t ) ]
关键区别 :Actor 梯度作用在动作概率上,Critic 梯度作用在状态价值预测上。
Actor 负责改变策略分布,Critic 负责提供更稳定的优势估计。
四、重要性采样与 PPO 代理目标
1. 数据来自旧策略
普通策略梯度要求数据来自当前策略 π θ \pi_\theta π θ :
∇ θ J ( θ ) = E t ∼ π θ [ A ^ t ∇ θ log π θ ( a t ∣ s t ) ] \nabla_\theta J(\theta)
=
\mathbb{E}_{t\sim\pi_\theta}
\left[
\hat A_t
\nabla_\theta \log \pi_\theta(a_t|s_t)
\right] ∇ θ J ( θ ) = E t ∼ π θ [ A ^ t ∇ θ log π θ ( a t ∣ s t ) ]
但 PPO 会用旧策略 π θ old \pi_{\theta_{\text{old}}} π θ old 采样一批数据,然后在这批数据上做多轮 minibatch 更新。此时数据分布来自旧策略,因此需要用重要性采样把期望改写到旧策略分布下。
对于任意函数 f ( x ) f(x) f ( x ) :
E x ∼ p [ f ( x ) ] = ∫ p ( x ) f ( x ) d x = ∫ p ( x ) q ( x ) q ( x ) f ( x ) d x = E x ∼ 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] E x ∼ p [ f ( x )] = ∫ p ( x ) f ( x ) d x = ∫ q ( x ) p ( x ) q ( x ) f ( x ) d x = E x ∼ q [ q ( x ) p ( x ) f ( x ) ]
如果直接把这个公式套到整条轨迹上,应该得到轨迹级别的重要性采样比值。把新旧策略下的轨迹概率相除:
P ( τ ∣ θ ) P ( τ ∣ θ old ) = ρ 0 ( s 0 ) ∏ t = 0 T − 1 π θ ( a t ∣ s t ) P ( s t + 1 ∣ s t , a t ) ρ 0 ( s 0 ) ∏ t = 0 T − 1 π θ old ( a t ∣ s t ) P ( s t + 1 ∣ s t , a t ) = ∏ t = 0 T − 1 π θ ( a t ∣ s t ) π θ old ( a t ∣ s t ) \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} P ( τ ∣ θ old ) P ( τ ∣ θ ) = ρ 0 ( s 0 ) ∏ t = 0 T − 1 π θ old ( a t ∣ s t ) P ( s t + 1 ∣ s t , a t ) ρ 0 ( s 0 ) ∏ t = 0 T − 1 π θ ( a t ∣ s t ) P ( s t + 1 ∣ s t , a t ) = t = 0 ∏ T − 1 π θ old ( a t ∣ s t ) π θ ( a t ∣ s t )
其中初始状态分布 ρ 0 \rho_0 ρ 0 和环境转移概率 P ( s t + 1 ∣ s t , a t ) P(s_{t+1}|s_t,a_t) 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] E τ ∼ π θ [ R ( τ )] = E τ ∼ π θ old [ P ( τ ∣ θ old ) P ( τ ∣ θ ) R ( τ ) ]
但这个轨迹级别的比值是很多步概率比值的连乘,轨迹稍长时方差会非常大。PPO 不直接使用完整轨迹比值,而是构造一个局部代理目标:状态分布沿用旧策略采样得到的经验分布,只在动作分布上用新旧策略的单步概率比值做修正 。
2. 从梯度反推代理目标
局部代理目标的具体形式并不靠直接构造目标函数得到,而是先在梯度表达式上做采样修正,再把修正后的梯度写回成某个函数的导数(反推) ,那个函数就是要找的代理目标。
本节开头的策略梯度,固定状态 s t s_t s t ,只在动作维度上做重要性采样:
E a t ∼ π θ ( ⋅ ∣ s t ) [ A ^ t ∇ θ log π θ ( a t ∣ s t ) ] = E a t ∼ π θ old ( ⋅ ∣ s t ) [ π θ ( a t ∣ s t ) π θ old ( a t ∣ s t ) A ^ t ∇ θ log π θ ( a t ∣ s t ) ] \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] E a t ∼ π θ ( ⋅ ∣ s t ) [ A ^ t ∇ θ log π θ ( a t ∣ s t ) ] = E a t ∼ π θ old ( ⋅ ∣ s t ) [ π θ old ( a t ∣ s t ) π θ ( a t ∣ s t ) A ^ t ∇ θ log π θ ( a t ∣ s t ) ]
其中的权重就是符号约定里的单步概率比值:
r t ( θ ) = π θ ( a t ∣ s t ) π θ old ( a t ∣ s t ) r_t(\theta)=
\frac{\pi_\theta(a_t|s_t)}
{\pi_{\theta_{\text{old}}}(a_t|s_t)} r t ( θ ) = π θ old ( a t ∣ s t ) π θ ( a t ∣ s t )
这一步是精确的。接着把状态按旧策略采样到的经验分布求平均,得到修正后的梯度估计:
g ^ ( θ ) = E t ∼ π θ old [ r t ( θ ) A ^ t ∇ θ log π θ ( a t ∣ s t ) ] \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] g ^ ( θ ) = E t ∼ π θ old [ r t ( θ ) A ^ t ∇ θ log π θ ( a t ∣ s t ) ]
这一步则是近似:真正的策略梯度要求状态也来自新策略的访问分布 d θ d_\theta d θ ,这里直接用旧策略的 d θ old d_{\theta_{\text{old}}} d θ old 代替。
接下来反推 g ^ ( θ ) \hat g(\theta) g ^ ( θ ) 是谁的梯度,即把它写成 ∇ θ ( ⋯ ) \nabla_\theta(\cdots) ∇ θ ( ⋯ ) 的形式,才可以进行自动微分。关键在于 r t ( θ ) ∇ θ log π θ ( a t ∣ s t ) r_t(\theta)\nabla_\theta\log\pi_\theta(a_t|s_t) r t ( θ ) ∇ θ log π θ ( a t ∣ s t ) 本身是一个完整的导数,且旧策略概率与 θ \theta θ 无关,于是:
r t ( θ ) ∇ θ log π θ ( a t ∣ s t ) = π θ ( a t ∣ s t ) π θ old ( a t ∣ s t ) ⋅ ∇ θ π θ ( a t ∣ s t ) π θ ( a t ∣ s t ) = ∇ θ π θ ( a t ∣ s t ) π θ old ( a t ∣ s t ) = ∇ θ r t ( θ ) 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) r t ( θ ) ∇ θ log π θ ( a t ∣ s t ) = π θ old ( a t ∣ s t ) π θ ( a t ∣ s t ) ⋅ π θ ( a t ∣ s t ) ∇ θ π θ ( a t ∣ s t ) = π θ old ( a t ∣ s t ) ∇ θ π θ ( a t ∣ s t ) = ∇ θ r t ( θ )
代回原公式 g ^ ( θ ) \hat g(\theta) g ^ ( θ ) 后,由于 A ^ t \hat A_t A ^ t 与采样分布 π θ old \pi_{\theta_{\text{old}}} π θ old 都不依赖 θ \theta θ ,因此梯度算子可以提到期望外:
g ^ ( θ ) = E t ∼ π θ old [ A ^ t ∇ θ r t ( θ ) ] = ∇ θ E t ∼ π θ old [ r t ( θ ) 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} g ^ ( θ ) = E t ∼ π θ old [ A ^ t ∇ θ r t ( θ ) ] = ∇ θ E t ∼ π θ old [ r t ( θ ) A ^ t ]
此时可得到 PPO 的未裁剪代理目标 ,通常记为 J PG ( θ ) J^{\text{PG}}(\theta) J PG ( θ ) ,其中 PG 表示 policy gradient:
J PG ( θ ) = E t ∼ π θ old [ r t ( θ ) A ^ t ] J^{\text{PG}}(\theta)
=
\mathbb{E}_{t\sim\pi_{\theta_{\text{old}}}}
\left[
r_t(\theta)\hat A_t
\right] J PG ( θ ) = E t ∼ π θ old [ r t ( θ ) A ^ t ]
J PG J^{\text{PG}} J PG 由梯度反推出来,而非先写目标再求导。代理目标里出现 r t ( θ ) r_t(\theta) r t ( θ ) 而不是 log π θ ( a t ∣ s t ) \log\pi_\theta(a_t|s_t) log π θ ( a t ∣ s t ) ,原因在于重要性采样权重 r t r_t r t 和 log 梯度合并成了 ∇ θ r t \nabla_\theta r_t ∇ θ r t 。
这里的 A ^ t \hat A_t A ^ t 由旧策略采样得到,在一轮 PPO 更新中视为常数。需要强调两点:
J PG J^{\text{PG}} J PG 不是 把普通 Actor-Critic 目标里的 log π θ ( a t ∣ s t ) \log\pi_\theta(a_t|s_t) log π θ ( a t ∣ s t ) 做代数变形得到的。E t [ A ^ t log π θ ] \mathbb{E}_t[\hat A_t\log\pi_\theta] E t [ A ^ t log π θ ] 与 J PG J^{\text{PG}} J PG 都只是“求导之后能得到策略梯度”的替代目标,数值本身没有意义;两者的联系仅在于 θ = θ old \theta=\theta_{\text{old}} θ = θ old (此时 r t = 1 r_t=1 r t = 1 )处梯度相同,见下一节。
J PG J^{\text{PG}} J PG 也不是原始回报 J ( θ ) J(\theta) J ( θ ) 的完全等价改写。上面的推导里有两处只在旧策略附近成立的近似:状态分布被冻结为 d θ old d_{\theta_{\text{old}}} d θ old ,A ^ t \hat A_t A ^ t 被冻结为旧策略下的估计。因此 J PG J^{\text{PG}} J PG 是旧策略附近的局部代理目标 :当新旧策略差距较小时,它可以近似反映新策略相对旧策略的改进方向 ;r t r_t r t 一旦偏离 1 太多,近似就失效(后续引入 clip 的原因 )。
补充:更严格的推导路线。 从梯度反推的好处是直观,代价是只能保证 θ = θ old \theta=\theta_{\text{old}} θ = θ old 一点上梯度正确,说不清代理目标本身的数值意味着什么。TRPO 与 PPO 原论文走的是另一条路:从性能差分引理(performance difference lemma,Kakade & Langford, 2002)出发,新旧策略的回报之差可以用旧策略 的优势函数精确表示:
J ( θ ) − J ( θ old ) = ∑ s d θ ( s ) E a ∼ π θ ( ⋅ ∣ 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] J ( θ ) − J ( θ old ) = s ∑ d θ ( s ) E a ∼ π θ ( ⋅ ∣ s ) [ A π θ old ( s , a ) ]
其中 d θ ( s ) = ∑ t γ t P ( s t = s ∣ π θ ) d_\theta(s)=\sum_t\gamma^t P(s_t=s|\pi_\theta) d θ ( s ) = ∑ t γ t P ( s t = s ∣ π θ ) 是新策略的折扣状态访问分布。这是恒等式;把 d θ d_\theta d θ 近似为 d θ old d_{\theta_{\text{old}}} d θ old (也就是同样冻结状态分布),再对动作做重要性采样,得到的就是同一个 J PG J^{\text{PG}} J PG 。这条路线的好处是能说明代理目标的数值本身对应策略改进量,并且能给出替换 d θ d_\theta d θ 所引入的误差界,从而严格导出信任域约束。细节见 TRPO 论文第 2、3 节。
3. 未裁剪目标的梯度
反过来对 J PG ( θ ) J^{\text{PG}}(\theta) J PG ( θ ) 求梯度,等于把上一节的推导倒着走一遍。A ^ t \hat A_t A ^ t 视为常数,于是:
∇ θ J PG ( θ ) = E t ∼ π θ old [ A ^ t ∇ θ r t ( θ ) ] \nabla_\theta J^{\text{PG}}(\theta)
=
\mathbb{E}_{t\sim\pi_{\theta_{\text{old}}}}
\left[
\hat A_t
\nabla_\theta r_t(\theta)
\right] ∇ θ J PG ( θ ) = E t ∼ π θ old [ A ^ t ∇ θ r t ( θ ) ]
再用上一节的恒等式 ∇ θ r t ( θ ) = r t ( θ ) ∇ θ log π θ ( a t ∣ s t ) \nabla_\theta r_t(\theta)=r_t(\theta)\nabla_\theta\log\pi_\theta(a_t|s_t) ∇ θ r t ( θ ) = r t ( θ ) ∇ θ log π θ ( a t ∣ s t ) ,把对 ratio 的求导转回到熟悉的 log probability 梯度:
∇ θ J PG ( θ ) = E t ∼ π θ old [ r t ( θ ) A ^ t ∇ θ log π θ ( a t ∣ s t ) ] \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] ∇ θ J PG ( θ ) = E t ∼ π θ old [ r t ( θ ) A ^ t ∇ θ log π θ ( a t ∣ s t ) ]
将 r t ( θ ) r_t(\theta) r t ( θ ) 按定义展开,等价于:
∇ θ J PG ( θ ) = E t ∼ π θ old [ π θ ( a t ∣ s t ) π θ old ( a t ∣ s t ) A ^ t ∇ θ log π θ ( a t ∣ s t ) ] \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] ∇ θ J PG ( θ ) = E t ∼ π θ old [ π θ old ( a t ∣ s t ) π θ ( a t ∣ s t ) A ^ t ∇ θ log π θ ( a t ∣ s t ) ]
这说明:r t ( θ ) r_t(\theta) r t ( θ ) 是旧策略样本的梯度权重校正项 。如果新策略比旧策略更倾向于产生该动作(r t ( θ ) > 1 r_t(\theta)>1 r t ( θ ) > 1 ),该样本的梯度贡献会被放大;如果新策略相对不倾向于该动作(r t ( θ ) < 1 r_t(\theta)<1 r t ( θ ) < 1 ),该样本的梯度贡献会被缩小。
r t ( θ ) r_t(\theta) r t ( θ ) 把动作分布从 π θ old \pi_{\theta_{\text{old}}} π θ old 搬到 π θ \pi_\theta π θ ,因此上式在动作维度等价于 E s t ∼ d θ old , a t ∼ π θ [ A ^ t ∇ θ log π θ ( a t ∣ s t ) ] \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)] E s t ∼ d θ old , a t ∼ π θ [ A ^ t ∇ θ log π θ ( a t ∣ s t )] 。但它只修正单步动作概率,未修正状态访问分布 ,状态仍采自 d θ old d_{\theta_{\text{old}}} d θ old 。所以它不等于真正的新策略期望 E τ ∼ π θ [ ⋅ ] \mathbb{E}_{\tau\sim\pi_\theta}[\cdot] E τ ∼ π θ [ ⋅ ] (后者要求 s t ∼ d θ s_t\sim d_\theta s t ∼ d θ ),只是旧状态分布上的局部代理——这也是 J PG J^{\text{PG}} J PG 仅在新旧策略接近时才可靠的原因 。
当 θ = θ old \theta=\theta_{\text{old}} θ = θ old 时,r t ( θ ) = 1 r_t(\theta)=1 r t ( θ ) = 1 ,该式退化为普通 Actor-Critic 策略梯度:
∇ θ J PG ( θ old ) = E t ∼ π θ old [ A ^ t ∇ θ log π θ ( a t ∣ s t ) ] \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] ∇ θ J PG ( θ old ) = E t ∼ π θ old [ A ^ t ∇ θ log π θ ( a t ∣ s t ) ]
重要性采样让旧策略采集的数据可以用于估计新策略的目标,但 r t ( θ ) r_t(\theta) r t ( θ ) 偏离 1 太远时,估计方差会变大,训练也会变得不稳定。
后文若简写为 E t \mathbb{E}_t E t ,默认表示对旧策略采样得到的 batch 时间步求平均。
五、PPO-Clip 目标
1. 裁剪形式
上一节指出,当 r t ( θ ) r_t(\theta) r t ( θ ) 偏离 1 太远时估计方差变大、训练不稳定,因此需要约束新旧策略的偏离程度 。
TRPO 的做法是显式加上 KL 散度的硬约束,把更新限制在一个信任域内;但这需要求解带约束的优化问题,实现复杂。PPO 用更简单的方式近似达到同样目的:直接对概率比值 r t ( θ ) r_t(\theta) r t ( θ ) 做裁剪。
PPO-Clip 将未裁剪目标 r t ( θ ) A ^ t r_t(\theta)\hat A_t r t ( θ ) A ^ t 改写为:
J CLIP ( θ ) = E t [ min ( r t ( θ ) A ^ t , clip ( r t ( θ ) , 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] J CLIP ( θ ) = E t [ min ( r t ( θ ) A ^ t , clip ( r t ( θ ) , 1 − ϵ , 1 + ϵ ) A ^ t ) ]
其中:
clip ( r t , 1 − ϵ , 1 + ϵ ) = { 1 − ϵ , r t < 1 − ϵ r t , 1 − ϵ ≤ r t ≤ 1 + ϵ 1 + ϵ , r t > 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} clip ( r t , 1 − ϵ , 1 + ϵ ) = ⎩ ⎨ ⎧ 1 − ϵ , r t , 1 + ϵ , r t < 1 − ϵ 1 − ϵ ≤ r t ≤ 1 + ϵ r t > 1 + ϵ
该目标仍然是最大化目标。实际代码中常写成最小化:
L CLIP ( θ ) = − J CLIP ( θ ) L^{\text{CLIP}}(\theta)=-J^{\text{CLIP}}(\theta) L CLIP ( θ ) = − J CLIP ( θ )
这里取 min \min min 而非直接裁剪 r t r_t r t 是关键:它让裁剪只在 r t ( θ ) r_t(\theta) r t ( θ ) 朝着"使目标继续变好"的方向越界时才生效,而在反方向(纠正已经偏离过头的概率)上不做限制。下面两节按优势符号分别展开,可以看到这一非对称行为的具体来源。
2. 正优势时的分段梯度
先考虑 A ^ t > 0 \hat A_t>0 A ^ t > 0 。此时动作优于平均,策略应提高该动作概率,即希望 r t ( θ ) r_t(\theta) r t ( θ ) 增大。
由于 A ^ t > 0 \hat A_t>0 A ^ t > 0 ,有:
min ( r t A ^ t , clip ( r t ) A ^ t ) = { r t A ^ t , r t ≤ 1 + ϵ ( 1 + ϵ ) A ^ t , r t > 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} min ( r t A ^ t , clip ( r t ) A ^ t ) = { r t A ^ t , ( 1 + ϵ ) A ^ t , r t ≤ 1 + ϵ r t > 1 + ϵ
对应梯度为:
∇ θ J t CLIP = { A ^ t ∇ θ r t ( θ ) , r t < 1 + ϵ 0 , r t > 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} ∇ θ J t CLIP = { A ^ t ∇ θ r t ( θ ) , 0 , r t < 1 + ϵ r t > 1 + ϵ
代入 ∇ θ r t ( θ ) = r t ( θ ) ∇ θ log π θ ( a t ∣ s t ) \nabla_\theta r_t(\theta)=r_t(\theta)\nabla_\theta\log\pi_\theta(a_t|s_t) ∇ θ r t ( θ ) = r t ( θ ) ∇ θ log π θ ( a t ∣ s t ) :
∇ θ J t CLIP = { r t ( θ ) A ^ t ∇ θ log π θ ( a t ∣ s t ) , r t < 1 + ϵ 0 , r t > 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} ∇ θ J t CLIP = { r t ( θ ) A ^ t ∇ θ log π θ ( a t ∣ s t ) , 0 , r t < 1 + ϵ r t > 1 + ϵ
3. 负优势时的分段梯度
再考虑 A ^ t < 0 \hat A_t<0 A ^ t < 0 。此时动作差于平均,策略应降低该动作概率,即希望 r t ( θ ) r_t(\theta) r t ( θ ) 减小。
由于 A ^ t < 0 \hat A_t<0 A ^ t < 0 ,乘以负数会改变大小关系,因此:
min ( r t A ^ t , clip ( r t ) A ^ t ) = { ( 1 − ϵ ) A ^ t , r t < 1 − ϵ r t A ^ t , r t ≥ 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} min ( r t A ^ t , clip ( r t ) A ^ t ) = { ( 1 − ϵ ) A ^ t , r t A ^ t , r t < 1 − ϵ r t ≥ 1 − ϵ
对应梯度为:
∇ θ J t CLIP = { 0 , r t < 1 − ϵ A ^ t ∇ θ r t ( θ ) , r t > 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} ∇ θ J t CLIP = { 0 , A ^ t ∇ θ r t ( θ ) , r t < 1 − ϵ r t > 1 − ϵ
也就是:
∇ θ J t CLIP = { 0 , r t < 1 − ϵ r t ( θ ) A ^ t ∇ θ log π θ ( a t ∣ s t ) , r t > 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} ∇ θ J t CLIP = { 0 , r t ( θ ) A ^ t ∇ θ log π θ ( a t ∣ s t ) , r t < 1 − ϵ r t > 1 − ϵ
4. 分段梯度汇总
下图把两种符号下的单样本最大化目标画成 r t ( θ ) r_t(\theta) r t ( θ ) 的函数。绿色线段保留梯度,橙色水平线段表示该侧已被裁剪:
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 和熵正则。若写成最大化目标:
J PPO ( θ , ϕ ) = J CLIP ( θ ) − c v L critic ( ϕ ) + c e E t [ H ( π θ ( ⋅ ∣ s t ) ) ] 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))] J PPO ( θ , ϕ ) = J CLIP ( θ ) − c v L critic ( ϕ ) + c e E t [ H ( π θ ( ⋅ ∣ s t ))]
若写成最小化损失:
L PPO ( θ , ϕ ) = − J CLIP ( θ ) + c v L critic ( ϕ ) − c e E t [ H ( π θ ( ⋅ ∣ s t ) ) ] 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))] L PPO ( θ , ϕ ) = − J CLIP ( θ ) + c v L critic ( ϕ ) − c e E t [ H ( π θ ( ⋅ ∣ s t ))]
其中:
J CLIP J^{\text{CLIP}} J CLIP :Actor 的裁剪代理目标。
L critic L_{\text{critic}} L critic :Critic 的价值回归损失。
H ( π θ ) H(\pi_\theta) H ( π θ ) :策略熵,用于鼓励探索,避免策略过早塌缩。
c v , c e c_v,c_e c v , c e :价值损失和熵正则的权重。
其中策略熵定义为:
H ( π θ ( ⋅ ∣ s t ) ) = − ∑ a π θ ( a ∣ s t ) log π θ ( a ∣ s t ) H(\pi_\theta(\cdot|s_t))
=
-\sum_{a}\pi_\theta(a|s_t)\log\pi_\theta(a|s_t) H ( π θ ( ⋅ ∣ s t )) = − a ∑ π θ ( a ∣ s t ) log π θ ( a ∣ s t )
熵越大表示动作分布越分散,最大化熵项可以避免策略过快收敛到确定性分布。
Actor 和 Critic 若共享部分网络参数,则总梯度会在共享参数处相加;若二者完全独立,则 Actor loss 只更新策略网络,Critic loss 只更新价值网络。
1. Actor 梯度
最小化形式下,Actor 梯度为:
∇ θ L actor PPO = − ∇ θ J CLIP ( θ ) − c e ∇ θ E t [ H ( π θ ( ⋅ ∣ s t ) ) ] \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))] ∇ θ L actor PPO = − ∇ θ J CLIP ( θ ) − c e ∇ θ E t [ H ( π θ ( ⋅ ∣ s t ))]
其中 ∇ θ J CLIP ( θ ) \nabla_\theta J^{\text{CLIP}}(\theta) ∇ θ J CLIP ( θ ) 按上一节的分段形式计算。
2. Critic 梯度
若采用未裁剪价值损失:
L critic ( ϕ ) = 1 2 E t [ ( V ϕ ( s t ) − R ^ t ) 2 ] L_{\text{critic}}(\phi)
=
\frac{1}{2}\mathbb{E}_t[(V_\phi(s_t)-\hat R_t)^2] L critic ( ϕ ) = 2 1 E t [( V ϕ ( s t ) − R ^ t ) 2 ]
则:
∇ ϕ L critic ( ϕ ) = E t [ ( V ϕ ( s t ) − R ^ t ) ∇ ϕ V ϕ ( s t ) ] \nabla_\phi L_{\text{critic}}(\phi)
=
\mathbb{E}_t
\left[
(V_\phi(s_t)-\hat R_t)\nabla_\phi V_\phi(s_t)
\right] ∇ ϕ L critic ( ϕ ) = E t [ ( V ϕ ( s t ) − R ^ t ) ∇ ϕ V ϕ ( s t ) ]
部分实现也会使用 value clipping:
V t clip = V ϕ old ( s t ) + clip ( V ϕ ( s t ) − V ϕ old ( s t ) , − ϵ 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) V t clip = V ϕ old ( s t ) + clip ( V ϕ ( s t ) − V ϕ old ( s t ) , − ϵ v , ϵ v )
对应损失:
L critic clip ( ϕ ) = 1 2 E t [ max ( ( V ϕ ( s t ) − R ^ t ) 2 , ( V t clip − 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] L critic clip ( ϕ ) = 2 1 E t [ max ( ( V ϕ ( s t ) − R ^ t ) 2 , ( V t clip − R ^ t ) 2 ) ]
其作用与 Actor clipping 类似:限制价值函数在同一批旧数据上的更新幅度,避免 Critic 在多轮 epoch 中变化过大。
七、GAE 与 PPO 梯度的关系
PPO 的梯度核心依赖 A ^ t \hat A_t A ^ t 。在实践中,A ^ t \hat A_t A ^ t 常由 GAE 给出:
A ^ t G A E = ∑ l = 0 T − t − 1 ( γ λ ) l δ t + l \hat A_t^{GAE}
=
\sum_{l=0}^{T-t-1}
(\gamma\lambda)^l\delta_{t+l} A ^ t G A E = l = 0 ∑ T − t − 1 ( γ λ ) l δ t + l
其中:
δ t = r t + γ V ϕ old ( s t + 1 ) − V ϕ old ( s t ) \delta_t
=
r_t+\gamma V_{\phi_{\text{old}}}(s_{t+1})
-V_{\phi_{\text{old}}}(s_t) δ t = r t + γ V ϕ old ( s t + 1 ) − V ϕ old ( s t )
GAE 计算依赖旧价值函数 V ϕ old V_{\phi_{\text{old}}} V ϕ old ,因此 PPO 的 Actor 梯度不会对 A ^ t \hat A_t A ^ t 继续求导,而是把它当作每个动作的固定权重:
∇ θ J CLIP ∼ A ^ t ∇ θ r t ( θ ) \nabla_\theta J^{\text{CLIP}}
\sim
\hat A_t \nabla_\theta r_t(\theta) ∇ θ J CLIP ∼ A ^ t ∇ θ r t ( θ )
因此可以把 PPO 的 Actor 更新理解为:
GAE 决定每个动作的优势权重。
ratio 决定新旧策略在该动作上的概率变化。
clip 决定该样本是否还允许继续沿当前方向更新。
八、训练流程
PPO 的一次外层迭代通常包含以下步骤:
使用旧策略 π θ old \pi_{\theta_{\text{old}}} π θ old 与环境交互,采样轨迹。
缓存每个动作的 log π θ old ( a t ∣ s t ) \log \pi_{\theta_{\text{old}}}(a_t|s_t) log π θ old ( a t ∣ s t ) 、价值 V ϕ old ( s t ) V_{\phi_{\text{old}}}(s_t) V ϕ old ( s t ) 、奖励和终止标记。
使用奖励和旧价值函数计算 A ^ t G A E \hat A_t^{GAE} A ^ t G A E 与 R ^ t \hat R_t R ^ t 。
在同一批数据上进行多轮 minibatch 更新。
每次更新时重新计算 log π θ ( a t ∣ s t ) \log \pi_\theta(a_t|s_t) log π θ ( a t ∣ s t ) ,得到 r t ( θ ) r_t(\theta) r t ( θ ) 。
使用 PPO-Clip actor loss、critic loss 和 entropy bonus 更新参数。
当前策略更新完成后,令 θ old ← θ \theta_{\text{old}}\leftarrow\theta θ old ← θ ,进入下一轮采样。
关键约束 :旧 logprob、旧 value、advantage 和 return 在一轮 PPO 更新中通常固定;新 logprob 和新 value 每次前向都会重新计算。
九、总结
PPO 的梯度推导可以沿着以下链条理解:
∇ J ( θ ) = E [ A t ∇ log π θ ( a t ∣ s t ) ] ⟹ E [ r t ( θ ) A t ∇ log π θ ( a t ∣ s t ) ] ⟹ ∇ J CLIP ( θ ) \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) ∇ J ( θ ) = E [ A t ∇ log π θ ( a t ∣ s t ) ] ⟹ E [ r t ( θ ) A t ∇ log π θ ( a t ∣ s t ) ] ⟹ ∇ J CLIP ( θ )
其中:
策略梯度 来自 log-derivative trick,将对采样分布的求导转为对 log probability 的求导。
优势函数 作为梯度权重,决定某个动作概率应该被提高还是降低。
重要性采样 引入 r t ( θ ) r_t(\theta) r t ( θ ) ,使旧策略采样的数据可以用于新策略更新。
PPO-Clip 通过分段目标截断“过度变好”的方向,避免新策略相对旧策略变化过大。
梯度截断并非双向固定 :正优势只截断过度增大概率,负优势只截断过度降低概率。
从梯度角度看,PPO-Clip 的本质是:在保留策略梯度方向的同时,去掉那些已经超过信任范围、还会继续扩大策略偏移的样本梯度。
参考资料
John Schulman, Filip Wolski, Prafulla Dhariwal, Alec Radford, Oleg Klimov. Proximal Policy Optimization Algorithms . arXiv:1707.06347, 2017. https://arxiv.org/abs/1707.06347
John Schulman, Philipp Moritz, Sergey Levine, Michael Jordan, Pieter Abbeel. High-Dimensional Continuous Control Using Generalized Advantage Estimation . arXiv:1506.02438, 2015. https://arxiv.org/abs/1506.02438
John Schulman, Sergey Levine, Philipp Moritz, Michael I. Jordan, Pieter Abbeel. Trust Region Policy Optimization . ICML 2015. https://proceedings.mlr.press/v37/schulman15.html
Sham Kakade, John Langford. Approximately Optimal Approximate Reinforcement Learning . ICML 2002. https://people.eecs.berkeley.edu/~pabbeel/cs287-fa09/readings/KakadeLangford-icml2002.pdf
猛猿. 人人都能看懂的 RL-PPO 理论知识. 知乎专栏. https://zhuanlan.zhihu.com/p/7461863937