菜单

近端策略优化

相关源文件

Proximal Policy Optimization (PPO) 是一种用于强化学习的策略梯度方法,它能够实现高效且稳定的策略更新。本文档介绍了 PPO 在 labml_nn 库中的实现,重点关注该算法的机制、架构和实际用法。有关深度 Q 网络的信息,请参阅 深度 Q 网络

概述

PPO 解决了策略梯度方法中的一个基本挑战:如何在执行多次梯度更新的同时,防止策略发生剧烈变化。传统的策略梯度方法在策略因采样数据而发生过度偏移之前,每次数据批次只能安全地执行一次梯度更新。

PPO 通过引入一个裁剪过的替代目标函数来解决此问题,该函数限制了策略更新,允许在同一数据批次上进行多次优化步骤,而不会破坏训练的稳定性。

在此实现中,PPO 与以下几点相结合:

  • 广义优势估计 (GAE)
  • 价值函数裁剪
  • 用于探索的熵奖励

来源: 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 是熵奖励。
  • c1c2 是系数。

来源: 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

核心类

  1. ClippedPPOLoss:实现策略更新的裁剪替代目标函数。
  2. ClippedValueFunctionLoss:实现裁剪价值函数损失。
  3. GAE:使用广义优势估计计算优势估计。
  4. Model:输出策略(动作分布)和价值函数的神经网络。
  5. Trainer:协调训练过程。

来源: 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 算法流程

标题: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 实现细节

ClippedPPOLoss

此类实现了核心 PPO 算法——裁剪替代目标函数。

ratio 表示当前策略的动作概率与采样策略的动作概率的差异程度。裁剪可以防止可能破坏训练稳定的过大策略变化。

来源: labml_nn/rl/ppo/__init__.py141-179

ClippedValueFunctionLoss

与策略裁剪类似,价值函数也会被裁剪以限制其变化。

这可以防止价值函数在更新之间发生剧烈变化。

来源: labml_nn/rl/ppo/__init__.py204-207

GAE 实现

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() 方法使用当前策略收集轨迹数据。

  1. 在并行环境中执行当前策略。
  2. 存储观察、动作、奖励、价值和对数概率。
  3. 使用 GAE 计算优势。
  4. 准备训练数据(展平并转换为张量)。

此实现使用多个工作进程以实现高效的并行采样。

来源: 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_rangePPO 裁剪参数。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 代理

  1. 创建实验配置
  2. 使用超参数初始化训练器
  3. 运行训练循环
  4. 监控性能指标

训练循环将

  • 从环境中采样数据
  • 计算优势
  • 更新策略和价值函数
  • 跟踪性能指标

来源: labml_nn/rl/ppo/experiment.py354-397

与游戏环境的集成

PPO 通过一个包装器与游戏环境集成,该包装器

  1. 处理游戏帧(灰度转换、调整大小)
  2. 堆叠多帧以捕获运动
  3. 处理奖励跟踪和回合终止
  4. 支持通过多进程进行并行执行

这种设计允许跨多个游戏实例高效地收集数据。

来源: labml_nn/rl/game.py17-169

结论

labml_nn 中的 PPO 实现提供了一个强大而高效的强化学习算法,具有

  • 通过裁剪实现稳定的策略更新
  • 使用 GAE 进行平衡的优势估计
  • 并行数据收集以提高效率
  • 价值函数裁剪以实现稳定学习
  • 熵奖励以鼓励探索

这使其非常适合各种强化学习任务,特别是对于具有连续状态和离散动作空间的 Atari 游戏等环境。