

RL 学习笔记(13):近端策略优化 (PPO)
近端策略优化 (PPO)
views
| comments
本内容暂时为 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):
- 最大化替代目标(预期优势):
- 服从 KL 散度约束(硬约束):
- 使用共轭梯度法求解。
- 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):
- 表示基于采样数据的经验平均。
- 是重要性采样权重(概率比率)。
- 是在时间 估计的优势函数值。
- 是在状态 处新旧策略的 KL 散度。
- 是惩罚系数,用于平衡原始目标和 KL 惩罚。 越大,对策略变化的惩罚越重。
- 自适应 KL 惩罚系数 (Adaptive KL Penalty) (Page 8):
- 问题:固定 很难设定。
- 解决方案:在每次策略更新后,根据实际的 KL 散度 与目标 KL 散度 (一个超参数)的比较,来动态调整下一次迭代使用的 。
- 调整规则:
- 如果 (策略变化太小),则 (减小惩罚)。
- 如果 (策略变化太大),则 (增大惩罚)。
- 否则 保持不变。
- PPO-Penalty 算法流程 (Page 9-11, 15):
- 数据收集:使用当前策略 收集一批轨迹数据 。
- 优势估计:计算优势函数估计 (例如使用 GAE)。
- 策略优化:使用当前的惩罚系数 ,通过小批量随机梯度上升(例如 Adam)优化带惩罚的目标函数 若干轮(epochs),得到更新后的策略参数 。
- 调整惩罚系数:计算更新后的策略与旧策略之间的平均 KL 散度 ,并根据上述规则调整 得到 ,用于下一次迭代。
- PPO-Penalty 伪代码 (Page 11 - Algorithm 4):
plaintextAlgorithm 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
- 实现细节 (Page 12-13):展示了更详细的流程,包括并行环境收集数据、使用 GAE 计算优势、策略优化循环内的损失计算(策略损失 + 价值损失)、梯度计算和 Adam 更新,以及 的调整。
2. PPO-Clip (带裁剪目标函数的 PPO) (Page 7, 14-23)#
-
核心思想 (Page 14):不计算 KL 散度,而是直接修改(裁剪)替代目标函数,以限制策略更新的幅度。这是 PPO 最常用的版本。
-
概率比率 (Probability Ratio):。当 时,新旧策略相同。 表示新策略更倾向于选择动作 , 表示新策略更不倾向于选择 。
-
PPO-Clip 目标函数 (Page 15):
- 是裁剪参数 (clipping parameter),是一个小超参数,例如 0.1 或 0.2。它定义了概率比率 允许偏离 1 的范围 。
- 将 强制限制在 区间内。
- 操作是 PPO-Clip 的关键:它取未裁剪的目标 和裁剪后的目标 中的较小者。
-
裁剪机制的作用 (Page 16-17):
- 当优势 时 (即动作 比平均预期要好):
- 目标变为 。
- 如果 在 之间,目标是 ,鼓励增大 (提高 的概率)。
- 如果 ,目标被裁剪为 。此时即使再增大 ,目标函数也不再增加,从而限制了策略更新幅度,防止 过大。
- 当优势 时 (即动作 比平均预期要差):
- 目标变为 。由于 ,这等价于 。
- 如果 在 之间,目标是 ,鼓励减小 (降低 的概率)。
- 如果 ,目标被裁剪为 。此时即使再减小 ,目标函数也不再变差(更接近零),从而限制了策略更新幅度,防止 过小。
- 总结 (Page 17 表格):裁剪操作确保了当 偏离 区间时,目标函数的梯度变为 0(因为被裁剪的部分不依赖 ),从而有效地阻止了过大的策略更新。
- 当优势 时 (即动作 比平均预期要好):
-
PPO-Clip 算法流程 (Page 18-20, 22):
- 数据收集:使用当前策略 收集一批轨迹数据 。
- 优势估计:计算优势函数估计 (例如 GAE)。
- 策略优化:使用小批量随机梯度上升(例如 Adam)优化裁剪后的目标函数 若干轮(K epochs),得到更新后的策略参数 。
-
PPO-Clip 伪代码 (Page 20 - Algorithm 5):
plaintextAlgorithm 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
-
实现细节 (Page 21-22):展示了 PPO-Clip 的详细流程,与 PPO-Penalty 类似,主要区别在于策略优化阶段计算的是 损失,并用其梯度进行更新,没有 KL 散度计算和 调整。
-
PPO-Clip 与 TRPO 对比 (Page 23 表格):
特性 PPO Clip TRPO 核心思想 裁剪目标函数限制更新幅度 KL 散度硬约束限制更新步长 更新方式 多轮 SGD 优化替代目标 共轭梯度+线搜索求解约束问题 计算复杂度 低 (一阶优化) 高 (近似二阶优化) 实现难度 中等 高 收敛速度 通常较快 可能较慢 理论保证 较弱 较强 (近似单调改进) 优点 简单高效,易实现,性能好 理论更完善,更新非常稳定 缺点 可能过于保守,理论支持稍弱 复杂,计算量大,兼容性差
三、PPO 用于 Actor-Critic (PPO for Actor-Critic) (Page 24-25)#
- 整合框架 (Page 24):PPO 通常在 Actor-Critic 框架下实现,策略网络 (Actor) 和价值网络 (Critic) 常常共享一部分参数。
- 联合目标函数:需要同时优化策略(Actor)和价值(Critic)。总的损失函数通常是三部分的加权和:
- :PPO 的裁剪策略损失(或 )。最大化这一项(或最小化其负数)。
- :价值函数损失(均方误差)。最小化这一项。 是价值目标,通常使用 GAE 计算得到的优势 加上当前价值估计 ,或者直接使用折扣回报。
- :策略的熵 (Entropy)。最大化这一项可以鼓励探索。
- 是超参数,用于平衡各项损失。
- 优势估计 (GAE) (Page 25):
- 广义优势估计 (Generalized Advantage Estimation, GAE) 是 PPO 和其他现代 AC 方法中常用的优势估计技术。
- ,其中 是 TD 误差。
- 参数 控制了偏差和方差的权衡。 时为 TD 误差(低方差高偏差), 时为蒙特卡洛优势估计(高方差低偏差)。
- PPO Actor-Critic 训练流程 (Page 25 伪代码,结合 Page 21-22 理解):
- 并行收集数据:N 个 Actor 并行与环境交互 T 步,使用当前的策略 ,收集数据。
- 计算优势和价值目标:对收集到的数据,使用当前的价值网络 计算 TD 误差 ,然后计算 GAE 优势 和价值目标 。
- 多轮优化:重复 K 个 epoch:
- 将收集到的 NT 步数据分成小批量。
- 对每个小批量,计算总损失 。
- 使用 Adam 等优化器更新共享参数 (包含 Actor 和 Critic 的参数)。
- 更新 。
四、实验与评估 (Experiments and Evaluation) (Page 26-28)#
- 仿真环境 (Page 26-27):使用 MuJoCo 物理引擎进行连续控制任务(如 Swimmer, Hopper, Walker)的评估。
- 策略网络结构 (Page 28):对于连续控制,策略网络通常输出高斯分布的均值 和标准差 (标准差可以是状态无关的可学习参数,或也由网络输出)。动作通过从 采样得到。
五、小结 (Page 29-30)#
- PPO 核心:通过修改目标函数(Clip 或 Penalty)来限制策略更新幅度,以获得类似 TRPO 的稳定性,但实现更简单。
- PPO-Clip 优势 (Page 29):实现简单(一阶优化),鲁棒性好,调参相对容易(主要是 ),性能优越,是目前最流行的策略梯度方法之一。
- 目标函数对比 (Page 30):总结了三种替代目标函数形式(无约束/裁剪/惩罚)及 PPO-Clip () 在 MuJoCo 任务上的优越表现。