引言(Introduction)#
上一章提到的 TRPO 虽然理论优美(保证单调不减),但计算太复杂了(需要共轭梯度法求解 Hessian-Vector Product)。
OpenAI 提出的 PPO (Proximal Policy Optimization) 是 TRPO 的一阶近似版本。
- 核心思想:TRPO 使用 KL 散度作为硬约束 (Constraint),而 PPO 将约束转化为惩罚项 (Penalty) 或者直接通过截断 (Clipping) 来限制策略更新幅度。
- 地位:PPO 是目前 Deep RL 的基准算法,平衡了实现复杂度、样本效率和性能。
变体 1:PPO-Clip (主流)#
这是目前最常用的 PPO 版本,它不需要计算 KL 散度,直接在目标函数里动手脚。
重要性采样比率#
定义新旧策略的比率为 rt(θ):
rt(θ)=πθold(at∣st)πθ(at∣st)
- 当 θ=θold 时,rt=1。
- 我们希望 rt 不要偏离 1 太多,这意味着新策略没有发生剧烈变化。
截断目标函数#
PPO-Clip 的核心目标函数如下:
LCLIP(θ)=E^t[min(rt(θ)A^t,clip(rt(θ),1−ϵ,1+ϵ)A^t)]
- ϵ 是一个超参数(通常为 0.2),表示允许策略变化的幅度(Trust Region)。
- clip(r,1−ϵ,1+ϵ):把比率 r 强制限制在 [0.8,1.2] 之间。
直观理解:为什么要 Min?#
我们需要分两种情况来看优势函数 A^t 的正负:
- 情况 A:动作是好的 (A^t>0)
- 我们希望增加这个动作的概率,即 rt(θ) 增大。
- 但不能无限增大。如果 rt>1+ϵ,
clip 函数会将其锁死在 1+ϵ。
- 此时 min 操作生效,目标函数不再随 rt 增加而增加。这防止了策略更新步子太大。
- 情况 B:动作是坏的 (A^t<0)
- 我们希望减小这个动作的概率,即 rt(θ) 减小。
- 但不能无限减小。如果 rt<1−ϵ,
clip 函数会将其锁死在 1−ϵ。
- 此时 min 操作生效,防止策略过度修正(以此避免策略坍塌)。
💡 总结:
只有当策略变化在“安全区域”内时,我们才进行奖励优化;一旦超出安全区域,就不再给予额外的梯度奖励。
变体 2:PPO-Penalty (自适应 KL)#
这是另一种接近 TRPO 原义的方法,将 KL 散度作为正则项加入 Loss,并动态调整系数 β。
目标函数#
LKLPEN(θ)=E^t[rt(θ)A^t−βDKL(πθold(⋅∣st)∣∣πθ(⋅∣st))]
自适应 β 更新规则#
我们在每次更新后计算平均 KL 散度 d=E^t[DKL],并与目标值 dtarg 比较:
- 如果 d<dtarg/1.5:说明策略变动太小,步子太保守。减小惩罚 β←β/2。
- 如果 d>dtarg×1.5:说明策略变动太大,步子太危险。增大惩罚 β←β×2。
广义优势估计 (GAE)#
在计算优势函数 A^t 时,简单的多步 TD 或蒙特卡洛都有局限。PPO 通常使用 GAE (Generalized Advantage Estimation) 来平衡偏差和方差。
我们定义 TD Error δt=rt+γV(st+1)−V(st)。
GAE 是 δ 的加权几何平均:
A^tGAE=k=0∑∞(γλ)kδt+k
- λ=0:即单步 TD(偏差大,方差小)。
- λ=1:即蒙特卡洛(无偏差,方差大)。
- λ∈(0,1):通常取 0.95,在两者之间取得最佳平衡。
完整的 PPO 损失函数#
在实际代码实现(如 Actor-Critic 架构)中,PPO 的总 Loss 包含三部分:
- 策略损失 (Policy Loss):即 LCLIP,让策略变好。
- 价值损失 (Value Loss):LVF=(Vθ(st)−Vtarget)2,让 Critic 估值更准。
- 熵奖励 (Entropy Bonus):S[πθ],鼓励策略保持随机性,防止过早收敛到局部最优。
LtTotal(θ)=−LtCLIP(θ)+c1LtVF(θ)−c2S[πθ](st)
(注:通常深度学习框架是最小化 Loss,所以最大化目标前加负号)
PPO 算法流程#
∙Initialize policy parameters θ and value parameters ϕ∙For iteration k=1,2,… do:∙1. Data Collection:∙Run policy πθold in environment for T steps∙Compute advantage estimates A^1,…,A^T using GAE∙2. Optimization:∙For epoch =1→K do:∙Shuffle data and divide into mini-batches∙For each mini-batch B do:∙L=LCLIP(θ)−c1LVF(ϕ)+c2S[πθ]∙Update θ,ϕ using Adam optimizer∙End For∙End For∙θold←θ∙End For
PPO 之所以能成为 OpenAI 的默认算法(Default Algorithm),是因为它:
- 简单:只需要对梯度进行简单的截断(Clip),不需要复杂的二阶优化。
- 稳定:截断机制保证了策略不会因为一次糟糕的更新而崩溃。
- 通用:既适用于离散动作(Atari),也适用于连续动作(机器人控制)。
至此,经典的 Policy Gradient 家族(REINFORCE → Actor-Critic → TRPO → PPO)已经梳理完毕。