近端策略优化算法 (PPO) 详解
背景与核心思想
近端策略优化(Proximal Policy Optimization, PPO)是 OpenAI 在 2017 年提出的一种策略优化算法。它的核心目标是在复杂任务中既保证性能提升,又让训练过程更稳定、高效。
传统的策略梯度方法(如 TRPO)虽然理论严谨,但计算复杂度高,涉及二次约束优化,工程落地难度大。而简单的策略更新往往因为步长过大导致模型崩溃。PPO 通过限制策略更新幅度,使得每一步训练都不会偏离当前策略太多,同时高效利用采样数据。
简单来说,PPO 就像一位篮球教练:如果每次训练完全改变投篮动作,球员可能会表现失常;如果变化太小,又难以进步。PPO 的剪辑机制就像一个'适度改进'的规则,告诉模型在合理范围内调整参数,同时评估每次更新是否优于平均水平。
数学推导与优化目标
概率比率与优势函数
PPO 引入了概率比率来衡量新旧策略的差异:
$$r_t(\theta) = \frac{\pi_\theta(a_t | s_t)}{\pi_{\theta_{\text{old}}}(a_t | s_t)}$$
其中 $\pi_{\theta_{\text{old}}}$ 是旧策略,$\pi_\theta$ 是新策略。这个比率表示策略变化的程度。
为了评价某个动作的相对好坏,我们使用优势函数 $A_t$:
$$A_t = Q(s_t, a_t) - V(s_t)$$
或者用广义优势估计(GAE)的方法近似。优势函数引导策略改进,确保只更新那些真正带来收益的动作。
裁剪目标函数
为了防止策略更新过度,PPO 引入了剪辑操作,将概率比率限制在区间 $[1-\epsilon, 1+\epsilon]$ 内。优化目标如下:
$$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]$$
这里的 clip 函数是关键:如果新策略相对于旧策略的变化超出了 $\epsilon$ 的范围,我们就忽略这部分增益,避免激进更新导致的性能崩塌。
总损失函数
PPO 不仅优化策略,还同时更新值函数 $V(s_t)$,并引入熵正则化鼓励探索。总损失函数由三部分组成:
- 策略损失:基于上述裁剪目标。
- 值函数损失:最小化均方误差,提高 Critic 预测精度。 $$L^{VF}(\theta) = \mathbb{E}_t \left[ \left( V(s_t; \theta) - R_t \right)^2 \right]$$
- 熵正则化:防止策略过早收敛到局部最优。 $$L^{ENT}(\theta) = \mathbb{E}t \left[ H(\pi\theta(s_t)) \right]$$
最终总损失为: $$L(\theta) = \mathbb{E}_t \left[ L^{CLIP}(\theta) - c_1 L^{VF}(\theta) + c_2 L^{ENT}(\theta) \right]$$
其中 $c_1, c_2$ 是权重系数,用于平衡各项损失。
算法流程
PPO 的训练可以简化为以下步骤:
- 采样:使用当前策略与环境交互,收集状态 $s_t$、动作 $a_t$、奖励 $r_t$。
- 计算优势:评估每个动作相对于平均表现的优劣。
- 多轮更新:利用收集到的数据多次迭代优化策略(通常 K_epochs=4),提高样本利用率。
- 更新旧策略:每轮迭代后同步参数,作为下一轮的基准。
这种设计使得 PPO 在训练过程中既高效又稳定,是目前强化学习中的主流算法之一。
PyTorch 代码实现
下面直接看核心实现,这里以 CartPole 环境为例,展示如何搭建 Actor-Critic 网络并完成训练。
1. Actor-Critic 神经网络
torch.nn nn
(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


