

RL 学习笔记(13):近端策略优化 (PPO)
近端策略优化 (PPO)
本博客基于西安交通大学强化学习课程 PPT 改编,历经 Gemini 以及本人总结以及整理形成。
从 TRPO 到 PPO:追求简单与稳定#
在上一讲中,我们学习了置信域策略优化 (TRPO)。TRPO 通过在每次更新时强制施加 KL 散度约束来限制新旧策略之间的差异,从而保证了策略更新的稳定性,避免了普通策略梯度方法对步长敏感、容易崩溃的问题。
然而,TRPO 的主要缺点是其实现复杂性和计算开销。它涉及到计算费雪信息矩阵 (FIM) 向量积、使用共轭梯度法 (CG) 求解近似的自然梯度方向、以及进行回溯线搜索等步骤,并且与某些网络结构(如参数共享、Dropout)的兼容性不佳。
近端策略优化 (Proximal Policy Optimization, PPO) 的目标是:获得 TRPO 的数据效率和可靠性能,但使用更简单的方法(特别是仅依赖一阶优化)来实现,使其更容易实现、调试和扩展。
PPO 核心思想:限制策略更新#
PPO 的核心思想与 TRPO 类似:限制每次迭代中策略的更新幅度,以避免过大的、可能导致性能崩溃的更新。但 PPO 不使用 TRPO 那样复杂的 KL 散度硬约束和二阶优化方法,而是通过修改目标函数来间接达到限制更新幅度的目的。
定义概率比率 (Probability Ratio):
其中 是当前正在优化的新策略, 是用于收集数据的旧策略。 衡量了新策略选择动作 的概率相对于旧策略的变化。
PPO 主要有两种实现方式:KL 惩罚 (PPO-Penalty) 和目标函数裁剪 (PPO-Clip)。
KL 惩罚 (PPO-Penalty)#
- 思想:将 TRPO 的 KL 硬约束改为目标函数中的软约束(惩罚项)。
- 目标函数 : 其中 是优势估计, 是惩罚系数。优化这个目标函数会同时试图最大化预期优势,并最小化新旧策略的 KL 散度。
- 自适应 KL 惩罚系数 :由于固定 难以调整,实践中通常使用自适应机制:
- 计算每次更新后的实际平均 KL 散度 。
- 如果 远大于目标值 ,则增大 (加强惩罚)。
- 如果 远小于目标值 ,则减小 (减弱惩罚)。
- 算法流程:在每次迭代中,收集数据、估计优势,然后使用当前的 通过多轮 SGD (或 Adam) 优化 来更新 ,最后根据实际 调整下一次迭代的 。
// 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 简单,但引入了新的超参数 和 的调整机制,效果有时不如 PPO-Clip 稳定。
目标函数裁剪 (PPO-Clip)#
这是 PPO 最常用、效果最好的版本。它通过直接裁剪 (Clipping) 替代目标函数来限制策略更新。
-
PPO-Clip 目标函数 :
-
是裁剪超参数(例如 0.1 或 0.2),它定义了概率比率 允许偏离 1 的范围 。
- 将 限制在该区间内。
- 操作是关键:取原始目标 和裁剪后的目标 中的较小者。
-
-
裁剪机制的作用:
- 当 (该动作好于平均):目标为 。如果 (策略更新过大,过度提高该动作概率),目标被限制为 ,阻止 无限增大带来的目标提升。
- 当 (该动作差于平均):目标为 (因为 , 相当于 )。如果 (策略更新过大,过度降低该动作概率),目标被限制为 ,阻止 无限减小带来的目标提升(恶化)。
- 效果:通过 和 操作,PPO-Clip 相当于设置了一个移动的、取决于优势符号的“软约束”,阻止 偏离 太远,从而保证了策略更新的稳定性。
-
算法流程:与 PPO-Penalty 类似,主要区别在于策略优化阶段优化的目标函数是 。
plaintext// 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} ← 更新后的 θ
-
PPO-Clip vs TRPO 对比:PPO-Clip 通常能达到与 TRPO 相当的性能,但实现简单得多(仅需一阶优化),计算效率更高,且更容易与其他机制(如参数共享)结合。
PPO 在 Actor-Critic 框架下的实现#
PPO 通常在 Actor-Critic 框架下实现,并结合 Generalized Advantage Estimation (GAE) 来获得稳定且低偏差的优势估计。
- 架构:Actor 网络 和 Critic 网络 (通常参数 和 有部分共享)。
- 优势估计 (GAE):计算 ,其中 是 TD 误差, 是 GAE 参数。
- 联合损失函数:在优化阶段(多轮 epoch),通常最小化一个包含三项的联合损失函数:
- :PPO 的裁剪策略损失(取负是为了最小化)。
- :价值函数损失(均方误差)。其中 通常是 或 n-步回报。
- :策略的负熵。最小化负熵(即最大化熵)可以鼓励探索。
- 是权重系数。
- :PPO 的裁剪策略损失(取负是为了最小化)。
- 训练循环:
- 收集数据:N 个 Actor 并行跑 T 步,使用 。
- 计算目标:计算优势 和价值目标 ,使用 。
- 优化网络:重复 K 个 epoch,在收集到的 NT 步数据上,使用 mini-batch 和 Adam 等优化器,更新参数 和 以最小化联合损失 。
- 更新 。
总结#
- PPO 旨在简化 TRPO,通过修改目标函数(PPO-Clip 使用裁剪,PPO-Penalty 使用自适应 KL 惩罚)来限制策略更新幅度,实现稳定且高效的策略优化。
- PPO-Clip 是最常用且推荐的版本,因其实现简单、性能稳健、超参数调整相对容易(主要是 )。
- PPO 通常在 Actor-Critic 框架下实现,结合 GAE 进行优势估计,并优化一个包含策略损失、价值损失和熵奖励的联合目标函数。
- PPO 采用多轮 epoch 优化,在同一批数据上进行多次梯度更新,提高了样本效率。
- PPO 已成为现代深度强化学习中最流行和最可靠的算法之一,是许多复杂控制任务的强大基线。