Axi's Blog

Back

RL 学习笔记(13):近端策略优化 (PPO)Blur image

本博客基于西安交通大学强化学习课程 PPT 改编,历经 Gemini 以及本人总结以及整理形成。

从 TRPO 到 PPO:追求简单与稳定#

在上一讲中,我们学习了置信域策略优化 (TRPO)。TRPO 通过在每次更新时强制施加 KL 散度约束来限制新旧策略之间的差异,从而保证了策略更新的稳定性,避免了普通策略梯度方法对步长敏感、容易崩溃的问题。

然而,TRPO 的主要缺点是其实现复杂性计算开销。它涉及到计算费雪信息矩阵 (FIM) 向量积、使用共轭梯度法 (CG) 求解近似的自然梯度方向、以及进行回溯线搜索等步骤,并且与某些网络结构(如参数共享、Dropout)的兼容性不佳。

近端策略优化 (Proximal Policy Optimization, PPO) 的目标是:获得 TRPO 的数据效率和可靠性能,但使用更简单的方法(特别是仅依赖一阶优化)来实现,使其更容易实现、调试和扩展。

PPO 核心思想:限制策略更新#

PPO 的核心思想与 TRPO 类似:限制每次迭代中策略的更新幅度,以避免过大的、可能导致性能崩溃的更新。但 PPO 不使用 TRPO 那样复杂的 KL 散度硬约束和二阶优化方法,而是通过修改目标函数来间接达到限制更新幅度的目的。

定义概率比率 (Probability Ratio)

rt(θ)=πθ(atst)πθold(atst)r_t(\theta) = \frac{\pi_{\theta}(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)}

其中 πθ\pi_\theta 是当前正在优化的新策略,πθold\pi_{\theta_{old}} 是用于收集数据的旧策略。rt(θ)r_t(\theta) 衡量了新策略选择动作 ata_t 的概率相对于旧策略的变化。

PPO 主要有两种实现方式:KL 惩罚 (PPO-Penalty) 和目标函数裁剪 (PPO-Clip)。

KL 惩罚 (PPO-Penalty)#

  • 思想:将 TRPO 的 KL 硬约束改为目标函数中的软约束(惩罚项)
  • 目标函数 LKLPENL^{KLPEN}LKLPEN(θ)=E^t[rt(θ)A^tβKL[πθold(st),πθ(st)]]L^{KLPEN}(\theta) = \hat{\mathbb{E}}_t \left[ r_t(\theta) \hat{A}_t - \beta KL[\pi_{\theta_{old}}(\cdot|s_t), \pi_{\theta}(\cdot|s_t)] \right] 其中 A^t\hat{A}_t 是优势估计,β\beta 是惩罚系数。优化这个目标函数会同时试图最大化预期优势,并最小化新旧策略的 KL 散度。
  • 自适应 KL 惩罚系数 β\beta:由于固定 β\beta 难以调整,实践中通常使用自适应机制:
    • 计算每次更新后的实际平均 KL 散度 dKLd_{KL}
    • 如果 dKLd_{KL} 远大于目标值 dtargd_{targ},则增大 β\beta(加强惩罚)。
    • 如果 dKLd_{KL} 远小于目标值 dtargd_{targ},则减小 β\beta(减弱惩罚)。
  • 算法流程:在每次迭代中,收集数据、估计优势,然后使用当前的 β\beta 通过多轮 SGD (或 Adam) 优化 LKLPENL^{KLPEN} 来更新 θ\theta,最后根据实际 dKLd_{KL} 调整下一次迭代的 β\beta
// PPO with Adaptive KL Penalty (概要)
算法参数: 初始 θ₀, 初始 β₀, 目标 KL d_targ, 优化 epochs K
循环 k = 0, 1, 2, ... :
  1. 使用 π_k = π(·|·; θ_k) 收集数据 D_k
  2. 计算优势估计 Â_t for t in D_k
  3. // 策略优化
     For epoch = 1 to K:
       For mini-batch in D_k:
         计算带惩罚损失 L^KLPEN (使用当前 β_k)
         通过梯度上升更新 θ (例如 Adam step)
     θ_{k+1} ← 更新后的 θ
  4. // 计算实际 KL
     d_KL ← average KL(π_k || π_{k+1}) over D_k
  5. // 调整 β
     根据 d_KL 和 d_targ 的比较调整 β_k 得到 β_{k+1}
plaintext
  • 缺点:虽然比 TRPO 简单,但引入了新的超参数 dtargd_{targ}β\beta 的调整机制,效果有时不如 PPO-Clip 稳定。

目标函数裁剪 (PPO-Clip)#

这是 PPO 最常用、效果最好的版本。它通过直接裁剪 (Clipping) 替代目标函数来限制策略更新。

  • PPO-Clip 目标函数 LCLIPL^{CLIP}

    LCLIP(θ)=E^t[min(rt(θ)A^t,clip(rt(θ),1ϵ,1+ϵ)A^t)]L^{CLIP}(\theta) = \hat{\mathbb{E}}_t [ \min( r_t(\theta) \hat{A}_t, \quad \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) \hat{A}_t ) ]
    • ϵ\epsilon 是裁剪超参数(例如 0.1 或 0.2),它定义了概率比率 rt(θ)r_t(\theta) 允许偏离 1 的范围 [1ϵ,1+ϵ][1-\epsilon, 1+\epsilon]

      • clip(rt,1ϵ,1+ϵ)\text{clip}(r_t, 1-\epsilon, 1+\epsilon)rtr_t 限制在该区间内。
      • min(,)\min(\dots, \dots) 操作是关键:取原始目标 rtA^tr_t \hat{A}_t裁剪后的目标 clip(rt)A^t\text{clip}(r_t) \hat{A}_t 中的较小者
  • 裁剪机制的作用

    • A^t0\hat{A}_t \> 0(该动作好于平均):目标为 min(rtA^t,(1+ϵ)A^t)\min(r_t \hat{A}_t, (1+\epsilon)\hat{A}_t)。如果 rt1+ϵr_t \> 1+\epsilon(策略更新过大,过度提高该动作概率),目标被限制为 (1+ϵ)A^t(1+\epsilon)\hat{A}_t,阻止 rtr_t 无限增大带来的目标提升。
    • A^t\<0\hat{A}_t \< 0(该动作差于平均):目标为 max(rtA^t,(1ϵ)A^t)\max(r_t \hat{A}_t, (1-\epsilon)\hat{A}_t) (因为 A^t\<0\hat{A}_t\<0min\min 相当于 max\max)。如果 rt\<1ϵr_t \< 1-\epsilon(策略更新过大,过度降低该动作概率),目标被限制为 (1ϵ)A^t(1-\epsilon)\hat{A}_t,阻止 rtr_t 无限减小带来的目标提升(恶化)。
    • 效果:通过 min\minclip\text{clip} 操作,PPO-Clip 相当于设置了一个移动的、取决于优势符号的“软约束”,阻止 rt(θ)r_t(\theta) 偏离 [1ϵ,1+ϵ][1-\epsilon, 1+\epsilon] 太远,从而保证了策略更新的稳定性。
  • 算法流程:与 PPO-Penalty 类似,主要区别在于策略优化阶段优化的目标函数是 LCLIPL^{CLIP}

    // PPO with Clipped Objective (概要)
    算法参数: 初始 θ₀, 裁剪参数 ε, 优化 epochs K
    循环 k = 0, 1, 2, ... :
      1. 使用 π_k = π(·|·; θ_k) 收集数据 D_k
      2. 计算优势估计 Â_t for t in D_k
      3. // 策略优化
        For epoch = 1 to K:
          For mini-batch in D_k:
            计算概率比率 r_t(θ) = π_θ(a_t|s_t) / π_k(a_t|s_t)
            计算裁剪损失 L^CLIP (使用 min, clip, r_t, Â_t)
            通过梯度上升更新 θ (例如 Adam step, 最大化 L^CLIP 或最小化 -L^CLIP)
        θ_{k+1} ← 更新后的 θ
    plaintext
  • PPO-Clip vs TRPO 对比:PPO-Clip 通常能达到与 TRPO 相当的性能,但实现简单得多(仅需一阶优化),计算效率更高,且更容易与其他机制(如参数共享)结合。

PPO 在 Actor-Critic 框架下的实现#

PPO 通常在 Actor-Critic 框架下实现,并结合 Generalized Advantage Estimation (GAE) 来获得稳定且低偏差的优势估计。

  • 架构:Actor 网络 πθ\pi_\theta 和 Critic 网络 VwV_w(通常参数 θ\thetaww 有部分共享)。
  • 优势估计 (GAE):计算 A^tGAE(γ,λ)=l=0Tt1(γλ)lδt+l\hat{A}*t^{GAE(\gamma, \lambda)} = \sum*{l=0}^{T-t-1} (\gamma \lambda)^l \delta_{t+l},其中 δt=Rt+1+γVw(St+1)Vw(St)\delta_t = R_{t+1} + \gamma V_w(S_{t+1}) - V_w(S_t) 是 TD 误差,λ[0,1]\lambda \in [0, 1] 是 GAE 参数。
  • 联合损失函数:在优化阶段(多轮 epoch),通常最小化一个包含三项的联合损失函数: L(θ,w)=E^t[LtCLIP(θ)+c1LtVF(w)c2S[πθ]]L(\theta, w) = \hat{\mathbb{E}}_t [ -L_t^{CLIP}(\theta) + c_1 L_t^{VF}(w) - c_2 S[\pi_{\theta}] ]
    • LtCLIP(θ)L_t^{CLIP}(\theta):PPO 的裁剪策略损失(取负是为了最小化)。
      • LtVF(w)=(VwVttarg)2L_t^{VF}(w) = (V_w - V_t^{targ})^2:价值函数损失(均方误差)。其中 VttargV_t^{targ} 通常是 A^tGAE+Vw\hat{A}_t^{GAE} + V_w 或 n-步回报。
      • S[πθ]S[\pi_{\theta}]:策略的负熵。最小化负熵(即最大化熵)可以鼓励探索。
      • c1,c2c_1, c_2 是权重系数。
  • 训练循环
    1. 收集数据:N 个 Actor 并行跑 T 步,使用 πθold\pi_{\theta_{old}}
    2. 计算目标:计算优势 A^tGAE\hat{A}*t^{GAE} 和价值目标 VttargV_t^{targ},使用 VwoldV*{w_{old}}
    3. 优化网络:重复 K 个 epoch,在收集到的 NT 步数据上,使用 mini-batch 和 Adam 等优化器,更新参数 θ\thetaww 以最小化联合损失 L(θ,w)L(\theta, w)
    4. 更新 θoldθ,woldw\theta_{old} \leftarrow \theta, w_{old} \leftarrow w

总结#

  • PPO 旨在简化 TRPO,通过修改目标函数(PPO-Clip 使用裁剪,PPO-Penalty 使用自适应 KL 惩罚)来限制策略更新幅度,实现稳定且高效的策略优化。
  • PPO-Clip 是最常用且推荐的版本,因其实现简单、性能稳健、超参数调整相对容易(主要是 ϵ\epsilon)。
  • PPO 通常在 Actor-Critic 框架下实现,结合 GAE 进行优势估计,并优化一个包含策略损失、价值损失和熵奖励的联合目标函数
  • PPO 采用多轮 epoch 优化,在同一批数据上进行多次梯度更新,提高了样本效率。
  • PPO 已成为现代深度强化学习中最流行和最可靠的算法之一,是许多复杂控制任务的强大基线。
RL 学习笔记(13):近端策略优化 (PPO)
https://axi404.top/blog/rl-note-13
Author 阿汐
Published at April 20, 2025
Comment seems to stuck. Try to refresh?✨