近端策略优化算法 (PPO) 详解
近端策略优化(Proximal Policy Optimization, PPO)是强化学习领域中一种非常经典的策略梯度算法。它由 OpenAI 在 2017 年提出,核心目标是在保证训练稳定性的同时,提高样本利用效率。相比早期的 TRPO 算法,PPO 通过引入简单的裁剪机制替代了复杂的二阶约束,使得实现更加简便且效果依然出色。
背景与核心思想
在传统的策略梯度方法中,直接更新策略参数往往会导致性能剧烈波动,甚至崩溃。这是因为单次更新步长过大,偏离了当前策略的'安全区域'。
PPO 的核心思想可以概括为:限制策略更新的幅度。它假设新策略不应该离旧策略太远,通过一个概率比率的裁剪操作,确保每一步改进都在可控范围内。这种设计既避免了像 REINFORCE 那样的高方差问题,又解决了 TRPO 计算复杂的问题。
关键概念
-
概率比率 (Probability Ratio):衡量新旧策略在同一状态下选择动作的概率差异。 $$r_t(\theta) = \frac{\pi_\theta(a_t | s_t)}{\pi_{\theta_{\text{old}}}(a_t | s_t)}$$
-
优势函数 (Advantage Function):评估某个动作相对于平均水平的优劣。 $$A_t = Q(s_t, a_t) - V(s_t)$$ 通常使用广义优势估计 (GAE) 来近似计算。
-
剪辑机制 (Clipping):将概率比率限制在 $[1-\epsilon, 1+\epsilon]$ 区间内,防止策略更新过大。
数学推导与优化目标
PPO 的损失函数由三部分组成:策略损失、值函数损失和熵正则化项。
1. 策略损失 (Surrogate Loss)
这是 PPO 最核心的部分,采用最小化两个损失中的较小值来确保稳定性: $$L^{CLIP}(\theta) = \mathbb{E}_t \left[ \min \left( r_t(\theta) A_t, \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) A_t \right) \right]$$ 当 $r_t(\theta)$ 超出范围时,裁剪后的项会阻止梯度进一步增大,从而起到正则化的作用。
2. 值函数优化
Critic 网络负责估计状态价值,通过最小化均方误差进行更新: $$L^{VF}(\theta) = \mathbb{E}_t \left[ \left( V(s_t; \theta) - R_t \right)^2 \right]$$ 其中 $R_t$ 是累积回报。
3. 总损失函数
结合上述各项,并加入熵正则化以鼓励探索: $$L(\theta) = \mathbb{E}_t \left[ L^{CLIP}(\theta) - c_1 L^{VF}(\theta) + c_2 L^{ENT}(\theta) \right]$$
PyTorch 代码实现
下面是一个基于 PyTorch 的完整 PPO 实现示例。为了便于理解,我们将代码分为网络定义、经验存储、Agent 逻辑和主训练循环几个部分。
1. Actor-Critic 神经网络
我们使用共享层提取特征,然后分别输出动作概率分布和状态价值。
import torch
import torch.nn as nn
import torch.optim as optim
from torch.distributions import Categorical
import numpy as np
import gym
class (nn.Module):
():
(ActorCritic, ).__init__()
.shared_layer = nn.Sequential(
nn.Linear(state_dim, ),
nn.ReLU()
)
.actor = nn.Sequential(
nn.Linear(, action_dim),
nn.Softmax(dim=-)
)
.critic = nn.Linear(, )
():
shared = .shared_layer(state)
action_probs = .actor(shared)
state_value = .critic(shared)
action_probs, state_value


