近端策略优化算法 (PPO) 详解
近端策略优化(Proximal Policy Optimization, PPO)是一种强化学习算法,旨在复杂任务中既保证性能提升,又维持训练的稳定性和高效性。它由 OpenAI 在 2017 年提出,通过限制策略更新幅度,克服了传统策略梯度方法(如 TRPO)的计算复杂性,同时保持了良好的采样效率。
背景与核心思想
在强化学习中,直接优化策略往往会导致不稳定的训练,模型可能因为过大的参数更新而崩溃。PPO 的核心在于引入概率比率来衡量新旧策略的差异,并通过裁剪机制防止策略变化过大。
概率比率
PPO 使用以下比率来评估动作选择的变化:
$$r_t(\theta) = \frac{\pi_\theta(a_t | s_t)}{\pi_{\theta_{\text{old}}}(a_t | s_t)}$$
其中 $\pi_\theta$ 是新策略,$\pi_{\theta_{\text{old}}}$ 是旧策略。这个比率反映了在当前状态下,新策略选择动作 $a_t$ 的概率相对于旧策略的变化程度。
优化目标
为了限制更新幅度,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]$$
这里的 $A_t$ 是优势函数,表示某个动作相对于平均表现的优劣。clip 操作将概率比率限制在区间 $[1-\epsilon, 1+\epsilon]$ 内,避免策略更新过于激进。
为什么 PPO 很强?
- 简洁性:相比 TRPO,无需复杂的二次优化,实现更简单。
- 稳定性:剪辑机制有效防止了策略更新过度导致的性能崩塌。
- 高效性:支持对采样数据进行多次迭代训练,提高了样本利用率。
数学推导与损失函数
PPO 的训练过程涉及三个主要部分的损失函数组合:策略损失、值函数损失和熵正则化。
1. 策略损失 (Policy Loss)
即上述的裁剪目标函数,目的是最大化优势函数的期望,同时限制策略分布的变化范围。
2. 值函数优化 (Value Function)
Critic 网络负责估计状态价值 $V(s)$,通过最小化均方误差进行更新:
$$L^{VF}(\theta) = \mathbb{E}_t \left[ \left( V(s_t; \theta) - R_t \right)^2 \right]$$
其中 $R_t$ 是累计回报。准确的值函数估计有助于计算更精确的优势函数。
3. 策略熵正则化 (Entropy Regularization)
为了防止策略过早收敛到局部最优,鼓励探索,引入熵项:
$$L^{ENT}(\theta) = \mathbb{E}t \left[ H(\pi\theta(s_t)) \right]$$
4. 总损失函数
综合以上三项,总损失函数通常定义为:
$$L(\theta) = \mathbb{E}_t \left[ L^{CLIP}(\theta) - c_1 L^{VF}(\theta) + c_2 L^{ENT}(\theta) \right]$$
系数 $c_1$ 和 $c_2$ 用于平衡不同目标的权重。
PyTorch 代码实现
下面展示一个基于 PyTorch 的完整 PPO 实现框架。代码结构清晰,包含 Actor-Critic 网络、经验存储类以及训练循环。
1. Actor-Critic 神经网络
我们使用共享层提取特征,分别输出动作概率和状态值。
import torch
import torch.nn as nn
torch.distributions Categorical
(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


