Axi's Blog

Back

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

本内容暂时为 PPT 转述,后续会进行修编

第 15 讲:近端策略优化 (PPO)#

一、回顾 TRPO 与策略梯度演进 (Review TRPO & Policy Gradient Evolution)#

  • 策略梯度算法发展脉络 (Page 3)
    • PG (Policy Gradient):基本的策略梯度方法,通过梯度上升直接优化策略参数,但对步长敏感,稳定性差。
    • NPG (Natural Policy Gradient):使用自然梯度代替普通梯度进行更新。自然梯度考虑了参数空间上的黎曼度量(通常用 Fisher 信息矩阵 FIM 定义),使得在策略(分布)空间中的更新步长相对稳定,不受参数化的影响。计算复杂,需要求 FIM 的逆。
    • TRPO (Trust Region Policy Optimization):通过在策略空间(用 KL 散度度量)设定置信域,并在该域内最大化一个替代目标函数(通常是优势函数的期望),来保证策略更新的稳定性。使用共轭梯度法近似求解自然梯度方向,避免直接求 FIM 的逆,但仍较复杂。
    • PPO (Proximal Policy Optimization):旨在获得 TRPO 的稳定性和可靠性,但使用更简单的方法(一阶优化)来实现策略更新的限制,易于实现和调整。
    • GRPO (Group Relative Policy Optimization):更新的算法 (2024),可能关注多智能体或特定约束下的优化。
  • TRPO 核心思想回顾 (Page 4)
    • 最大化替代目标(预期优势):maxθEsρold,aπold[πθ(as)πθold(as)Aθold(s,a)]\max_{\theta} \quad \mathbb{E}*{s \sim \rho*{old}, a \sim \pi_{old}} \left[ \frac{\pi_{\theta}(a|s)}{\pi_{\theta_{old}}(a|s)} A_{\theta_{old}}(s, a) \right]
    • 服从 KL 散度约束(硬约束):Esρold[DKL(πθold(s)πθ(s))]δ\mathbb{E}*{s \sim \rho*{old}} [D_{KL}(\pi_{\theta_{old}}(\cdot|s) || \pi_{\theta}(\cdot|s))] \le \delta
    • 使用共轭梯度法求解。
  • PPO 的动机 (Page 5)
    • TRPO 的缺点:实现复杂(需要计算 FIM 向量积、共轭梯度、线搜索),与某些网络结构(如含 Dropout、LSTM 或参数共享的网络)不兼容,计算开销较大。
    • PPO 的目标:在保持 TRPO 的稳定性和性能的同时,简化算法,提高通用性和易用性。希望算法:
      • 扩展性好(适用于大模型和并行计算)。
      • 数据效率高。
      • 稳健(在各种问题上表现良好)。

二、近端策略优化 (PPO) 算法#

PPO 通过修改目标函数或引入惩罚项来间接限制策略更新幅度,而不是像 TRPO 那样使用硬约束。主要有两种变体:PPO-Penalty 和 PPO-Clip。

1. PPO-Penalty (带 KL 惩罚项的 PPO) (Page 5, 7, 8-13)#

  • 核心思想:将 TRPO 的 KL 散度硬约束转化为目标函数中的软约束(惩罚项)。
  • 目标函数 (Page 8)LKLPEN(θ)=E^t[πθ(atst)πθold(atst)A^tβKL[πθold(st),πθ(st)]]L^{KLPEN}(\theta) = \hat{\mathbb{E}}_t \left[ \frac{\pi_{\theta}(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)} \hat{A}_t - \beta KL[\pi_{\theta_{old}}(\cdot|s_t), \pi_{\theta}(\cdot|s_t)] \right]
    • E^t[]\hat{\mathbb{E}}_t[\dots] 表示基于采样数据的经验平均。
    • rt(θ)=πθ(atst)πθold(atst)r_t(\theta) = \frac{\pi_{\theta}(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)} 是重要性采样权重(概率比率)。
    • A^t\hat{A}_t 是在时间 tt 估计的优势函数值。
    • KL[]KL[\dots] 是在状态 sts_t 处新旧策略的 KL 散度。
    • β\beta 是惩罚系数,用于平衡原始目标和 KL 惩罚。β\beta 越大,对策略变化的惩罚越重。
  • 自适应 KL 惩罚系数 (Adaptive KL Penalty) (Page 8)
    • 问题:固定 β\beta 很难设定。
    • 解决方案:在每次策略更新后,根据实际的 KL 散度 d=E^t[KL[πθold(st),πθnew(st)]]d = \hat{\mathbb{E}}*t[KL[\pi*{\theta_{old}}(\cdot|s_t), \pi_{\theta_{new}}(\cdot|s_t)]] 与目标 KL 散度 dtargd_{targ}(一个超参数)的比较,来动态调整下一次迭代使用的 β\beta
    • 调整规则
      • 如果 d\<dtarg/1.5d \< d_{targ} / 1.5 (策略变化太小),则 ββ/2\beta \leftarrow \beta / 2 (减小惩罚)。
      • 如果 ddtarg×1.5d \> d_{targ} \times 1.5 (策略变化太大),则 ββ×2\beta \leftarrow \beta \times 2 (增大惩罚)。
      • 否则 β\beta 保持不变。
  • PPO-Penalty 算法流程 (Page 9-11, 15)
    1. 数据收集:使用当前策略 πθk\pi_{\theta_k} 收集一批轨迹数据 DkD_k
    2. 优势估计:计算优势函数估计 A^t\hat{A}_t (例如使用 GAE)。
    3. 策略优化:使用当前的惩罚系数 βk\beta_k,通过小批量随机梯度上升(例如 Adam)优化带惩罚的目标函数 LKLPEN(θ)L^{KLPEN}(\theta) 若干轮(epochs),得到更新后的策略参数 θk+1\theta_{k+1}
    4. 调整惩罚系数:计算更新后的策略与旧策略之间的平均 KL 散度 dd,并根据上述规则调整 βk\beta_k 得到 βk+1\beta_{k+1},用于下一次迭代。
  • PPO-Penalty 伪代码 (Page 11 - Algorithm 4):
    Algorithm 4 PPO with Adaptive KL Penalty
    输入: 初始策略参数 theta_0, 初始 KL 惩罚系数 beta_0, 目标 KL 散度 delta_targ
    for k = 0, 1, 2, ... do
      使用策略 pi_k = pi(theta_k) 收集轨迹集合 D_k
      使用优势估计算法估计优势 A_hat_t^{pi_k}
      // 通过 K 轮小批量 SGD (Adam) 优化惩罚目标函数,计算策略更新
      theta_{k+1} = arg max_theta [ L_{theta_k}(theta) - beta_k * D_bar_KL(theta || theta_k) ]
      // 计算实际 KL 散度
      d_kl = D_bar_KL(theta_{k+1} || theta_k)  // 在 D_k 上的平均 KL
      // 自适应调整 beta
      if d_kl >= 1.5 * delta_targ then
        beta_{k+1} = 2 * beta_k
      else if d_kl <= delta_targ / 1.5 then
        beta_{k+1} = beta_k / 2
      else
        beta_{k+1} = beta_k
      end if
    end for
    plaintext
  • 实现细节 (Page 12-13):展示了更详细的流程,包括并行环境收集数据、使用 GAE 计算优势、策略优化循环内的损失计算(策略损失 + 价值损失)、梯度计算和 Adam 更新,以及 β\beta 的调整。

2. PPO-Clip (带裁剪目标函数的 PPO) (Page 7, 14-23)#

  • 核心思想 (Page 14):不计算 KL 散度,而是直接修改(裁剪)替代目标函数,以限制策略更新的幅度。这是 PPO 最常用的版本。

  • 概率比率 (Probability Ratio)rt(θ)=πθ(atst)πθold(atst)r_t(\theta) = \frac{\pi_{\theta}(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)}。当 rt(θ)=1r_t(\theta) = 1 时,新旧策略相同。rt(θ)1r_t(\theta) \> 1 表示新策略更倾向于选择动作 ata_trt(θ)\<1r_t(\theta) \< 1 表示新策略更不倾向于选择 ata_t

  • PPO-Clip 目标函数 (Page 15)

    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, \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) \hat{A}_t ) ]
    • ϵ\epsilon 是裁剪参数 (clipping parameter),是一个小超参数,例如 0.1 或 0.2。它定义了概率比率 rt(θ)r_t(\theta) 允许偏离 1 的范围 [1ϵ,1+ϵ][1-\epsilon, 1+\epsilon]
    • clip(rt(θ),1ϵ,1+ϵ)\text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon)rt(θ)r_t(\theta) 强制限制在 [1ϵ,1+ϵ][1-\epsilon, 1+\epsilon] 区间内。
    • min(,)\min(\dots, \dots) 操作是 PPO-Clip 的关键:它取未裁剪的目标 rt(θ)A^tr_t(\theta) \hat{A}_t裁剪后的目标 clip()A^t\text{clip}(\dots) \hat{A}_t 中的较小者
  • 裁剪机制的作用 (Page 16-17)

    • 当优势 A^t0\hat{A}_t \> 0 (即动作 ata_t 比平均预期要好):
      • 目标变为 min(rt(θ)A^t,(1+ϵ)A^t)\min(r_t(\theta) \hat{A}_t, (1+\epsilon) \hat{A}_t)
      • 如果 rt(θ)r_t(\theta)[1,1+ϵ][1, 1+\epsilon] 之间,目标是 rt(θ)A^tr_t(\theta) \hat{A}_t,鼓励增大 rt(θ)r_t(\theta) (提高 ata_t 的概率)。
      • 如果 rt(θ)1+ϵr_t(\theta) \> 1+\epsilon,目标被裁剪(1+ϵ)A^t(1+\epsilon) \hat{A}_t。此时即使再增大 rt(θ)r_t(\theta),目标函数也不再增加,从而限制了策略更新幅度,防止 rtr_t 过大。
    • 当优势 A^t\<0\hat{A}_t \< 0 (即动作 ata_t 比平均预期要差):
      • 目标变为 min(rt(θ)A^t,clip(rt(θ),1ϵ,1+ϵ)A^t)\min(r_t(\theta) \hat{A}_t, \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) \hat{A}_t)。由于 A^t\<0\hat{A}_t \< 0,这等价于 max(rt(θ)A^t,clip(rt(θ),1ϵ,1+ϵ)A^t)\max(r_t(\theta) \hat{A}_t, \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) \hat{A}_t)
      • 如果 rt(θ)r_t(\theta)[1ϵ,1][1-\epsilon, 1] 之间,目标是 rt(θ)A^tr_t(\theta) \hat{A}_t,鼓励减小 rt(θ)r_t(\theta) (降低 ata_t 的概率)。
      • 如果 rt(θ)\<1ϵr_t(\theta) \< 1-\epsilon,目标被裁剪(1ϵ)A^t(1-\epsilon) \hat{A}_t。此时即使再减小 rt(θ)r_t(\theta),目标函数也不再变差(更接近零),从而限制了策略更新幅度,防止 rtr_t 过小。
    • 总结 (Page 17 表格):裁剪操作确保了当 rt(θ)r_t(\theta) 偏离 [1ϵ,1+ϵ][1-\epsilon, 1+\epsilon] 区间时,目标函数的梯度变为 0(因为被裁剪的部分不依赖 θ\theta),从而有效地阻止了过大的策略更新。
  • PPO-Clip 算法流程 (Page 18-20, 22)

    1. 数据收集:使用当前策略 πθk\pi_{\theta_k} 收集一批轨迹数据 DkD_k
    2. 优势估计:计算优势函数估计 A^t\hat{A}_t (例如 GAE)。
    3. 策略优化:使用小批量随机梯度上升(例如 Adam)优化裁剪后的目标函数 LCLIP(θ)L^{CLIP}(\theta) 若干轮(K epochs),得到更新后的策略参数 θk+1\theta_{k+1}
  • PPO-Clip 伪代码 (Page 20 - Algorithm 5):

    Algorithm 5 PPO with Clipped Objective
    输入: 初始策略参数 theta_0, 裁剪阈值 epsilon
    for k = 0, 1, 2, ... do
      使用策略 pi_k = pi(theta_k) 收集轨迹集合 D_k
      使用优势估计算法估计优势 A_hat_t^{pi_k}
      // 通过 K 轮小批量 SGD (Adam) 优化裁剪目标函数,计算策略更新
      theta_{k+1} = arg max_theta L_{theta_k}^{CLIP}(theta)
      其中 L_{theta_k}^{CLIP}(theta) = E_{tau ~ pi_k} [ sum_{t=0}^T [ min( r_t(theta) * A_hat_t^{pi_k}, clip(r_t(theta), 1-epsilon, 1+epsilon) * A_hat_t^{pi_k} ) ] ]
      // r_t(theta) = pi_theta(a_t|s_t) / pi_{theta_k}(a_t|s_t)
    end for
    plaintext
  • 实现细节 (Page 21-22):展示了 PPO-Clip 的详细流程,与 PPO-Penalty 类似,主要区别在于策略优化阶段计算的是 LCLIPL^{CLIP} 损失,并用其梯度进行更新,没有 KL 散度计算和 β\beta 调整。

  • PPO-Clip 与 TRPO 对比 (Page 23 表格)

    特性PPO ClipTRPO
    核心思想裁剪目标函数限制更新幅度KL 散度硬约束限制更新步长
    更新方式多轮 SGD 优化替代目标共轭梯度+线搜索求解约束问题
    计算复杂度低 (一阶优化)高 (近似二阶优化)
    实现难度中等
    收敛速度通常较快可能较慢
    理论保证较弱较强 (近似单调改进)
    优点简单高效,易实现,性能好理论更完善,更新非常稳定
    缺点可能过于保守,理论支持稍弱复杂,计算量大,兼容性差

三、PPO 用于 Actor-Critic (PPO for Actor-Critic) (Page 24-25)#

  • 整合框架 (Page 24):PPO 通常在 Actor-Critic 框架下实现,策略网络 (Actor) 和价值网络 (Critic) 常常共享一部分参数。
  • 联合目标函数:需要同时优化策略(Actor)和价值(Critic)。总的损失函数通常是三部分的加权和: LtCLIP+VF+S(θ)=E^t[LtCLIP(θ)c1LtVF(θ)+c2S[πθ](st)]L_t^{CLIP+VF+S}(\theta) = \hat{\mathbb{E}}_t [ L_t^{CLIP}(\theta) - c_1 L_t^{VF}(\theta) + c_2 S[\pi_{\theta}](s_t) ]
    • LtCLIP(θ)L_t^{CLIP}(\theta):PPO 的裁剪策略损失(或 LtKLPENL_t^{KLPEN})。最大化这一项(或最小化其负数)。
    • LtVF(θ)=(V^θ(st)Vttarg)2L_t^{VF}(\theta) = (\hat{V}_{\theta}(s_t) - V_t^{targ})^2:价值函数损失(均方误差)。最小化这一项。VttargV_t^{targ} 是价值目标,通常使用 GAE 计算得到的优势 A^t\hat{A}_t 加上当前价值估计 V(st)V(s_t),或者直接使用折扣回报。
    • S[πθ](st)S[\pi_{\theta}](s_t):策略的熵 (Entropy)。最大化这一项可以鼓励探索。
    • c1,c2c_1, c_2 是超参数,用于平衡各项损失。
  • 优势估计 (GAE) (Page 25)
    • 广义优势估计 (Generalized Advantage Estimation, GAE) 是 PPO 和其他现代 AC 方法中常用的优势估计技术。
    • A^t=l=0Tt1(γλ)lδt+l\hat{A}*t = \sum*{l=0}^{T-t-1} (\gamma \lambda)^l \delta_{t+l},其中 δt=rt+1+γV(st+1)V(st)\delta_t = r_{t+1} + \gamma V(s_{t+1}) - V(s_t) 是 TD 误差。
    • 参数 λ[0,1]\lambda \in [0, 1] 控制了偏差和方差的权衡。λ=0\lambda=0 时为 TD 误差(低方差高偏差),λ=1\lambda=1 时为蒙特卡洛优势估计(高方差低偏差)。
  • PPO Actor-Critic 训练流程 (Page 25 伪代码,结合 Page 21-22 理解)
    1. 并行收集数据:N 个 Actor 并行与环境交互 T 步,使用当前的策略 πθold\pi_{\theta_{old}},收集数据。
    2. 计算优势和价值目标:对收集到的数据,使用当前的价值网络 VθoldV_{\theta_{old}} 计算 TD 误差 δt\delta_t,然后计算 GAE 优势 A^t\hat{A}_t 和价值目标 Vttarg=A^t+V(st)V_t^{targ} = \hat{A}_t + V(s_t)
    3. 多轮优化:重复 K 个 epoch:
      • 将收集到的 NT 步数据分成小批量。
      • 对每个小批量,计算总损失 LCLIP+VF+SL^{CLIP+VF+S}
      • 使用 Adam 等优化器更新共享参数 θ\theta(包含 Actor 和 Critic 的参数)。
    4. 更新 θoldθ\theta_{old} \leftarrow \theta

四、实验与评估 (Experiments and Evaluation) (Page 26-28)#

  • 仿真环境 (Page 26-27):使用 MuJoCo 物理引擎进行连续控制任务(如 Swimmer, Hopper, Walker)的评估。
  • 策略网络结构 (Page 28):对于连续控制,策略网络通常输出高斯分布的均值 μ(s;θ)\mu(s; \theta) 和标准差 σ(s;θ)\sigma(s; \theta)(标准差可以是状态无关的可学习参数,或也由网络输出)。动作通过从 N(μ(s;θ),σ(s;θ))\mathcal{N}(\mu(s; \theta), \sigma(s; \theta)) 采样得到。

五、小结 (Page 29-30)#

  • PPO 核心:通过修改目标函数(Clip 或 Penalty)来限制策略更新幅度,以获得类似 TRPO 的稳定性,但实现更简单。
  • PPO-Clip 优势 (Page 29):实现简单(一阶优化),鲁棒性好,调参相对容易(主要是 ϵ\epsilon),性能优越,是目前最流行的策略梯度方法之一。
  • 目标函数对比 (Page 30):总结了三种替代目标函数形式(无约束/裁剪/惩罚)及 PPO-Clip (ϵ=0.2\epsilon=0.2) 在 MuJoCo 任务上的优越表现。
RL 学习笔记(13):近端策略优化 (PPO)
https://axi404.top/blog/rl-note-13
Author 阿汐
Published at April 20, 2025
Comment seems to stuck. Try to refresh?✨