PPO 算法是什么?一文读懂强化学习中最常用的策略优化算法
如果刚开始接触强化学习、机器人控制或者具身智能,经常会看到一个名字:
PPO(Proximal Policy Optimization,近端策略优化)。
很多机器人运动控制、强化学习以及仿真训练任务都会使用 PPO。它并不是一个特别新的算法,但因为实现相对简单、训练稳定、效果可靠,直到今天依然是非常重要的强化学习基线算法。
这篇文章从最基础的角度理解 PPO:它到底解决了什么问题,以及为什么要加入clip。
1. PPO 属于哪类强化学习算法?
强化学习中,一个智能体通常不断与环境交互:
环境 Environment ↓ 状态 State ↓ 智能体 Agent ↓ 动作 Action ↓ 环境发生变化 ↓ 奖励 Reward智能体的目标就是学习一个策略:
π(a | s)它表示:
在状态
s下,采取动作a的概率。
例如机器人当前身体处于某种姿态时,策略网络需要决定下一时刻各关节应该如何运动。
PPO 属于Policy Gradient(策略梯度)方法。
简单来说,就是直接优化策略网络参数,让能够获得更高奖励的动作出现概率增加。
2. 为什么不能直接疯狂更新策略?
假设当前有一个策略:
Old Policy经过一批数据训练之后,我们获得:
New Policy理论上当然希望新策略比旧策略更好。
但问题在于:
如果一次更新幅度太大,新策略可能突然跑到一个非常差的区域。
例如:
旧策略 ↓ 表现不错 ↓ 一次梯度更新过大 ↓ 新策略变化巨大 ↓ 性能突然下降强化学习的数据分布本身又随着策略变化,因此这种问题尤其明显。
这也是 PPO 要解决的核心问题之一:
怎样更新策略,同时又不要让策略一次改变得太多?
3. PPO 的核心:概率比率 Ratio
假设:
πθ(a|s)表示当前的新策略。
πold(a|s)表示采集数据时使用的旧策略。
PPO 首先计算两者之间的概率比率:
r(θ) = πθ(a|s) / πold(a|s)如果:
r = 1说明新旧策略对这个动作给出的概率基本没有变化。
如果:
r > 1说明新策略更加倾向于选择这个动作。
如果:
r < 1说明新策略降低了选择这个动作的概率。
这就是 PPO 判断:
策略到底改变了多少。
4. Advantage:这个动作到底好不好?
只有 Ratio 还不够。
还需要判断:
当前动作到底是“好动作”还是“坏动作”?
因此 PPO 会使用:
Advantage即优势函数。
可以粗略理解为:
Advantage > 0这个动作比预期好。
希望未来:
提高这个动作的概率反过来:
Advantage < 0说明这个动作比预期差。
希望未来:
降低这个动作的概率因此策略优化实际上是在同时考虑:
动作有多好? + 新旧策略变化了多少?5. PPO 最关键的机制:Clipping
这也是 PPO 名字里:
Proximal
最核心的思想之一。
PPO 不希望新策略偏离旧策略太远,因此会限制 Ratio 的范围。
通常可以写成:
clip(r, 1-ε, 1+ε)例如:
ε = 0.2那么主要限制范围就是:
0.8 ~ 1.2假设一个动作特别好,模型可能疯狂增加这个动作的概率。
没有限制:
1.0 ↓ 1.2 ↓ 1.5 ↓ 2.0策略可能发生剧烈变化。
加入 clipping 后:
1.0 ↓ 1.1 ↓ 1.2 ↓ 限制继续产生过大的优化收益因此可以把 PPO 的核心思想记成一句话:
可以更新策略,但不要一次更新得太狠。
6. PPO 的 Clipped Objective
经典 PPO 中非常重要的目标函数是:
L_CLIP = E[min( r(θ)A, clip(r(θ), 1-ε, 1+ε)A )]第一次看到可能比较复杂。
实际上主要就是比较两个东西:
正常更新结果和:
限制更新幅度后的结果然后选择更加保守的优化结果。
这使 PPO 不容易因为一次策略更新过大而破坏已经学到的行为。
7. PPO 完整训练流程
理解了前面的概念以后,整个 PPO 流程其实非常清晰。
Step 1:智能体与环境交互
获得:
state action reward next_state这些数据通常暂时保存在 Rollout Buffer 中。
Step 2:计算 Return 和 Advantage
根据奖励以及价值网络估计:
Return Advantage实践中经常使用:
GAE(Generalized Advantage Estimation)
估计 Advantage。
Step 3:计算新旧策略概率
保存采样时的:
old_log_prob训练时重新计算:
new_log_prob然后得到:
ratio = torch.exp(new_log_prob - old_log_prob)Step 4:进行 Clip
一个简化的 PyTorch 形式如下:
ratio = torch.exp(new_log_prob - old_log_prob) surr1 = ratio * advantage surr2 = torch.clamp( ratio, 1.0 - clip_eps, 1.0 + clip_eps ) * advantage policy_loss = -torch.min( surr1, surr2 ).mean()这里的:
torch.clamp()就是 PPO 中非常关键的 clipping 操作。
需要注意,这只是帮助理解 PPO 更新核心的简化代码,并不是完整训练实现。
8. PPO 为什么在机器人领域很常见?
机器人控制通常具有:
状态维度高 + 动作连续 + 训练时间长 + 策略稳定性要求高例如机器人控制中的 Action 可能对应多个关节的目标位置、速度或者力矩。
如果策略更新特别剧烈,很容易出现训练不稳定。
PPO 的特点刚好比较适合这种场景:
实现简单 + 训练相对稳定 + 支持连续动作空间 + 并行采样效率较高因此在机器人强化学习、运动控制以及具身智能领域经常能够看到 PPO。
9. PPO、Policy、Actor、Critic 是什么关系?
新手非常容易把这些概念混在一起。
可以简单理解为:
PPO │ ├── Actor │ ↓ │ 学习 Policy │ ↓ │ 决定采取什么 Action │ └── Critic ↓ 学习 Value Function ↓ 判断当前状态有多好Actor 回答:
“我应该做什么?”
Critic 回答:
“现在这个状态到底好不好?”
PPO 则负责:
“应该怎样稳定地更新它们?”
这样就很好理解了。
10. 常见错误 / 踩坑
① clip 越小越好吗?
不是。
clip 太小:
策略几乎不敢更新 → 学习速度可能很慢clip 太大:
策略变化过大 → PPO 的稳定作用减弱因此需要根据任务和实现进行调整。
② PPO 就一定不会训练崩吗?
当然不是。
PPO 只是相对稳定。
学习率、奖励设计、观测归一化、Advantage 估计、网络结构、并行环境数量等因素都可能影响最终训练。
③ Reward 越大越好吗?
不能只看 Reward 数值大小。
奖励函数的设计是否正确更加重要。
如果 Reward 设计存在漏洞,智能体甚至可能找到一些设计者没有预料到的方式获得高奖励。
④ PPO 只能训练机器人吗?
不是。
PPO 是通用强化学习算法,也可以应用于游戏控制、资源调度以及其他序列决策问题。
机器人只是 PPO 非常重要的应用方向之一。
11. 总结
PPO 全称:
Proximal Policy Optimization(近端策略优化)。
理解 PPO 最关键的并不是一开始就背公式,而是记住三个概念:
Policy ↓ 决定动作 Advantage ↓ 判断动作好不好 Clipping ↓ 限制策略一次更新得太多因此 PPO 最核心的思想可以概括为:
利用 Advantage 指导策略优化,同时通过 clipping 控制新旧策略之间的变化幅度,从而提高强化学习训练的稳定性。
如果后续继续学习 PPO,可以进一步理解:
Actor-Critic → Value Function → GAE → Reward → Observation → Action → PPO Loss
把这些概念串起来以后,机器人强化学习的整体训练流程就会清晰很多。