Proximal Policy Optimization (PPO) 是一种用于强化学习的策略梯度方法,它能够实现高效且稳定的策略更新。本文档介绍了 PPO 在 labml_nn 库中的实现,重点关注该算法的机制、架构和实际用法。有关深度 Q 网络的信息,请参阅 深度 Q 网络。
PPO 解决了策略梯度方法中的一个基本挑战:如何在执行多次梯度更新的同时,防止策略发生剧烈变化。传统的策略梯度方法在策略因采样数据而发生过度偏移之前,每次数据批次只能安全地执行一次梯度更新。
PPO 通过引入一个裁剪过的替代目标函数来解决此问题,该函数限制了策略更新,允许在同一数据批次上进行多次优化步骤,而不会破坏训练的稳定性。
在此实现中,PPO 与以下几点相结合:
来源: labml_nn/rl/ppo/__init__.py4-25
PPO 优化了一个裁剪过的替代目标函数,旨在防止策略更新过大。
L^CLIP(θ) = E[ min(r_t(θ)A_t, clip(r_t(θ), 1-ε, 1+ε)A_t) ]
其中
r_t(θ) 是当前策略下采取动作 a_t 的概率与旧策略下采取动作 a_t 的概率之比。A_t 是优势函数。ε 是裁剪范围(通常为 0.1 或 0.2)。完整的 PPO 损失结合了三个组成部分:
L^CLIP+VF+EB(θ) = L^CLIP(θ) + c1 * L^VF(θ) - c2 * L^EB(θ)
其中
L^VF 是价值函数损失。L^EB 是熵奖励。c1 和 c2 是系数。来源: labml_nn/rl/ppo/__init__.py34-179
PPO 实现包含几个相互关联的组件:
标题:PPO 系统架构
来源: labml_nn/rl/ppo/__init__.py1-208 labml_nn/rl/ppo/gae.py1-82 labml_nn/rl/ppo/experiment.py37-70 labml_nn/rl/ppo/experiment.py90-352
来源: labml_nn/rl/ppo/__init__.py34-179 labml_nn/rl/ppo/__init__.py182-207 labml_nn/rl/ppo/gae.py18-82 labml_nn/rl/ppo/experiment.py37-70 labml_nn/rl/ppo/experiment.py227-263
标题:PPO 算法流程
来源: labml_nn/rl/ppo/experiment.py158-226 labml_nn/rl/ppo/experiment.py227-263
GAE 是 PPO 的一个关键组成部分,它在优势估计中平衡了偏差和方差。
标题:广义优势估计过程
GAE 使用两个超参数:
γ (gamma):奖励的折扣因子。λ (lambda):控制优势估计中的偏差-方差权衡。来源: labml_nn/rl/ppo/gae.py18-82
此类实现了核心 PPO 算法——裁剪替代目标函数。
ratio 表示当前策略的动作概率与采样策略的动作概率的差异程度。裁剪可以防止可能破坏训练稳定的过大策略变化。
来源: labml_nn/rl/ppo/__init__.py141-179
与策略裁剪类似,价值函数也会被裁剪以限制其变化。
这可以防止价值函数在更新之间发生剧烈变化。
来源: labml_nn/rl/ppo/__init__.py204-207
GAE 通过遍历轨迹(trajectory)进行反向计算优势。
这个递归公式有效地实现了 GAE 方程。
来源: labml_nn/rl/ppo/gae.py71-74
标题:PPO 训练过程
来源: labml_nn/rl/ppo/experiment.py323-342 labml_nn/rl/ppo/experiment.py227-263
sample() 方法使用当前策略收集轨迹数据。
此实现使用多个工作进程以实现高效的并行采样。
来源: labml_nn/rl/ppo/experiment.py158-226
标题:策略和价值网络架构
模型接收游戏帧作为输入,并输出:
来源: labml_nn/rl/ppo/experiment.py37-82
PPO 实现包含几个关键超参数:
| 参数 | 描述 | 默认值 |
|---|---|---|
learning_rate | 优化器的学习率。 | 1e-3 |
epochs | 在采样数据上训练的 epoch 数量。 | 8 |
n_workers | 并行工作进程的数量。 | 8 |
worker_steps | 每个工作进程每次更新的步数。 | 128 |
batches | 迷你批次的数量。 | 4 |
value_loss_coef | 价值损失系数。 | 0.5 |
entropy_bonus_coef | 熵奖励系数。 | 0.01 |
clip_range | PPO 裁剪参数。 | 0.1 |
gamma | 折扣因子。 | 0.99 |
lambda_ | GAE 参数。 | 0.95 |
这些可以根据不同环境进行调整以优化性能。
来源: labml_nn/rl/ppo/experiment.py358-381 labml_nn/rl/ppo/gae.py19-23
可以直接运行实验来在 Atari Breakout 上训练 PPO 代理
训练循环将
来源: labml_nn/rl/ppo/experiment.py354-397
PPO 通过一个包装器与游戏环境集成,该包装器
这种设计允许跨多个游戏实例高效地收集数据。
labml_nn 中的 PPO 实现提供了一个强大而高效的强化学习算法,具有
这使其非常适合各种强化学习任务,特别是对于具有连续状态和离散动作空间的 Atari 游戏等环境。