三分钟看懂强化学习PPO算法

三分钟看懂强化学习PPO算法:为什么它能让机器人稳定学会走路?
在强化学习领域,PPO几乎是一个绕不开的算法。
无论是训练机器人行走、机械臂操作,还是让智能体玩游戏,我们经常都会看到PPO的身影。
PPO的全称是:
Proximal Policy Optimization
近端策略优化
它由OpenAI提出,核心目标可以概括为一句话:
每次更新策略时可以进步,但不能一下子改得太猛。
这听起来很简单,但恰好解决了策略梯度算法中最常见的问题:训练过程不稳定。
一、强化学习究竟在学什么?
在监督学习中,模型通常会获得明确的正确答案。
例如:
输入:一张猫的图片
标签:猫
模型只需要不断缩小预测结果与正确标签之间的差距。
但强化学习通常没有现成的标准答案。
智能体需要在环境中不断尝试动作,并根据环境返回的奖励判断动作好不好。
一个典型的强化学习交互过程可以表示为:
观察当前状态
↓
策略输出动作
↓
环境执行动作
↓
返回新状态和奖励
↓
继续下一轮交互
例如,一台机器人正在学习走路:
状态:机器人身体姿态、关节角度和关节速度;
动作:各个关节应该施加多大的控制量;
奖励:向前移动得到正奖励,摔倒得到负奖励;
目标:最大化长期累计奖励。
使用符号表示:
状态 s_t
↓
策略 π 输出动作 a_t
↓
环境返回奖励 r_t 和下一状态 s_(t+1)
强化学习真正要学习的,就是一个从状态到动作的策略:
a_t = π(s_t)
其中:
s_t表示当前状态;a_t表示当前动作;π表示智能体的策略。
二、什么是策略梯度?
PPO属于策略梯度算法。
所谓策略梯度,就是直接调整策略网络的参数,让能够获得高奖励的动作以后更容易被选择。
假设智能体在某个状态下执行了一个动作。
如果这个动作最终带来了较高收益,那么就提高该动作再次被选择的概率;如果这个动作带来了较低收益,就降低它再次被选择的概率。
可以通俗地表示为:
表现好的动作 → 提高出现概率
表现差的动作 → 降低出现概率
例如,机器人抬起右腿后成功站上台阶,那么策略会认为这次动作比较好。
下一次遇到相似状态时,机器人更有可能再次选择类似动作。
但这里存在一个问题:
一次训练更新,到底应该把动作概率调整多少?
如果调整得太小,模型学习速度很慢;如果调整得太大,新策略可能完全破坏旧策略已经学会的能力。
PPO的核心,就是控制这个更新幅度。
三、普通策略梯度为什么容易不稳定?
假设机器人已经学会勉强向前走路。
当前策略虽然还不完美,但至少不会立刻摔倒。
如果进行一次幅度过大的参数更新,新策略可能突然变成:
抬腿幅度过大;
两条腿同时离地;
关节动作过于激进;
身体重心快速偏移;
机器人直接摔倒。
也就是说,策略更新并不一定总是朝着好的方向稳定前进。
可能出现这样的训练过程:
第100轮:已经可以缓慢行走
第101轮:策略更新幅度过大
第102轮:机器人重新学会摔倒
这是因为神经网络的参数彼此耦合。
即使只修改一次网络参数,也可能同时影响大量状态下的动作输出。
因此,一个好的策略优化算法不仅要问:
怎样让奖励提高?
还要问:
怎样在不破坏旧策略的情况下提高奖励?
PPO正是围绕这个问题设计的。
四、PPO的核心思想是什么?
PPO会保留两个策略:
旧策略 π_old
新策略 π_new
旧策略负责采集一批训练数据,新策略则根据这些数据进行更新。
PPO会比较新旧策略对同一个动作给出的概率。
这个概率比可以写成:
r_t = π_new(a_t | s_t) / π_old(a_t | s_t)
其中:
π_old(a_t | s_t)表示旧策略在状态s_t下选择动作a_t的概率;π_new(a_t | s_t)表示新策略选择同一动作的概率;r_t表示新旧策略的概率比。
如果:
r_t = 1
说明新策略和旧策略对这个动作的态度基本一致。
如果:
r_t > 1
说明新策略更加倾向选择这个动作。
如果:
r_t < 1
说明新策略降低了选择这个动作的概率。
例如:
旧策略选择某动作的概率:0.40
新策略选择某动作的概率:0.44
概率比:0.44 / 0.40 = 1.10
这说明新策略把该动作的概率提高了10%。
五、优势函数是什么?
仅仅知道动作概率发生了变化还不够。
PPO还需要判断这个动作到底是好还是坏。
这通常通过优势函数完成:
A_t = 实际表现 - 状态下的平均预期表现
优势函数可以简单理解为:
这次执行的动作,比通常情况下的表现好多少?
如果:
A_t > 0
说明这个动作比平均水平更好,应该提高它的概率。
如果:
A_t < 0
说明这个动作比平均水平更差,应该降低它的概率。
例如,机器人在某个状态下通常只能获得5分,但这次选择某个动作后获得了8分。
那么这个动作的优势大致可以理解为:
优势 = 8 - 5 = 3
这说明该动作值得鼓励。
因此,策略优化的基本思路可以写成:
优化目标 = 概率变化 × 动作优势
即:
L = r_t × A_t
如果某个动作优势为正,PPO会提高它的概率;如果优势为负,PPO会降低它的概率。
六、PPO为什么要进行裁剪?
如果只使用:
L = r_t × A_t
新策略可能会为了提高奖励,极端地改变某个动作的概率。
例如:
旧策略概率:0.10
新策略概率:0.90
概率比:9.0
新策略相当于突然把一个动作的选择概率提高了九倍。
虽然这个动作在当前数据中表现不错,但这种更新幅度太大,可能导致策略崩溃。
因此,PPO会给概率比设置一个允许范围。
例如:
允许范围:[0.8, 1.2]
当概率比超过范围时,PPO就会对它进行裁剪:
clip(r_t, 1-ε, 1+ε)
假设:
ε = 0.2
那么概率比会被限制在:
[0.8, 1.2]
例如:
原始概率比:1.10 → 保持1.10
原始概率比:1.50 → 裁剪为1.20
原始概率比:0.60 → 裁剪为0.80
这就是“近端策略优化”中“近端”的含义:
新策略不能距离旧策略太远。
七、PPO的目标函数是什么?
PPO最经典的裁剪目标函数可以写成:
L_clip =
min(
r_t × A_t,
clip(r_t, 1-ε, 1+ε) × A_t
)
这个公式看起来比较复杂,但本质上只做了一件事:
允许策略朝正确方向更新,但不允许更新幅度过大。
当动作优势为正时,PPO希望提高这个动作的概率,但提高到一定程度后就停止奖励继续增大。
当动作优势为负时,PPO希望降低这个动作的概率,但同样不允许一次降低得太多。
可以通俗地理解为:
好动作可以多选一点,但不要一下子变成必选。
坏动作可以少选一点,但不要一下子完全禁止。
PPO不是阻止策略学习,而是给策略更新增加一个“限速器”。
八、PPO为什么还有一个价值网络?
PPO通常采用Actor-Critic结构。
其中:
Actor:负责选择动作
Critic:负责评价当前状态
Actor回答的问题是:
当前状态下,我应该做什么?
Critic回答的问题是:
当前状态大概有多好?
价值网络通常会估计状态价值:
V(s_t) = 从当前状态开始,未来可能获得的累计奖励
例如,对机器人爬楼梯来说:
机器人正对楼梯、姿态稳定:
状态价值较高
机器人身体严重倾斜、足端打滑:
状态价值较低
价值网络的预测可以作为基准,用于计算优势函数:
优势 = 实际获得的回报 - 价值网络预测
因此,Actor和Critic的关系可以理解为:
Actor负责行动
Critic负责打分
Actor根据Critic的评价改进动作
九、GAE是什么?
在PPO中,经常会看到另一个名词:
GAE
Generalized Advantage Estimation
广义优势估计
GAE用于更加稳定地计算优势函数。
如果只看一步奖励,估计结果通常比较稳定,但无法反映动作对长期任务的影响。
如果直接使用整个回合的累计奖励,能够反映长期收益,但估计方差会非常大。
GAE通过一个参数在二者之间进行折中:
短期估计:偏差较大,但方差较小
长期估计:偏差较小,但方差较大
GAE:在两者之间取得平衡
其核心会使用时序差分误差:
δ_t = r_t + γV(s_(t+1)) - V(s_t)
其中:
r_t表示当前奖励;γ表示折扣因子;V(s_t)表示当前状态价值;V(s_(t+1))表示下一状态价值。
然后将未来多个时刻的误差进行加权:
A_t =
δ_t
+ γλδ_(t+1)
+ (γλ)^2 δ_(t+2)
+ ...
其中,λ负责控制优势估计更偏向短期还是长期。
在实际使用中,常见设置为:
γ = 0.99
λ = 0.95
十、PPO的训练流程是什么?
PPO的训练过程可以概括为以下几个步骤。
第一步:使用旧策略采集数据
智能体在环境中运行,记录:
当前状态 s_t
执行动作 a_t
获得奖励 r_t
下一状态 s_(t+1)
动作概率 log_prob
例如,机器人会同时在大量并行仿真环境中行走和摔倒,并记录这些交互数据。
第二步:计算回报和优势
根据奖励以及价值网络的输出,计算:
每个状态的目标回报
每个动作的优势 A_t
优势为正的动作会被鼓励,优势为负的动作会被抑制。
第三步:更新策略网络
使用PPO裁剪目标更新Actor:
L_actor =
min(
r_t × A_t,
clip(r_t, 1-ε, 1+ε) × A_t
)
这样可以防止新策略偏离旧策略太远。
第四步:更新价值网络
价值网络需要让预测价值接近真实回报。
可以表示为:
L_value =
(V(s_t) - 目标回报)^2
预测误差越大,价值损失越大。
第五步:加入熵奖励
为了避免策略过早变得确定,PPO通常会加入熵奖励。
熵可以理解为策略的随机程度:
熵较高:愿意探索不同动作
熵较低:总是选择少数固定动作
如果策略过早失去随机性,机器人可能只学会一个效果一般的动作模式,难以继续探索更好的方案。
因此,PPO的总损失通常包含:
总损失 =
策略损失
+ 价值损失
- 熵奖励
第六步:替换旧策略
更新完成后:
新策略 → 旧策略
然后使用更新后的策略重新采集数据,开始下一轮训练。
完整流程可以表示为:
使用策略采集环境数据
↓
计算累计回报和优势
↓
多轮更新Actor与Critic
↓
限制策略更新幅度
↓
使用新策略重新采集数据
↓
不断循环
十一、为什么PPO适合训练机器人?
PPO在机器人强化学习中非常常见,主要有以下几个原因。
1. 训练相对稳定
PPO通过裁剪概率比限制策略更新幅度。
这能够减少策略突然退化的问题,使训练曲线更加稳定。
2. 实现比较简单
与一些需要复杂约束优化的算法相比,PPO只需要在损失函数中加入裁剪操作。
因此,它比较容易实现、调试和复现。
3. 适合连续动作控制
机器人的动作通常是连续值,例如:
关节目标角度
关节力矩
关节速度
轮子转速
PPO可以使用高斯分布输出连续动作,因此很适合机器人控制任务。
例如:
策略网络输出动作均值 μ
同时学习或设置标准差 σ
从高斯分布中采样动作
即:
a_t ~ Normal(μ, σ)
4. 适合大规模并行仿真
在机器人训练中,可以同时运行几千个仿真环境。
例如:
4096个机器人同时训练
每个机器人探索不同动作
统一收集数据并更新PPO策略
这种方式可以快速获得大量交互数据,提高训练效率。
十二、PPO有哪些缺点?
虽然PPO非常实用,但它并不是万能算法。
1. 样本利用率不算高
PPO属于On-Policy算法。
它通常只能使用当前策略采集的数据进行训练。
策略更新后,旧数据很快就不能继续反复使用。
这意味着PPO往往需要大量环境交互。
对于仿真环境来说,这个问题相对容易解决;但在真实机器人上直接采集大量数据,成本会非常高。
2. 对奖励函数比较敏感
PPO只会优化设计者提供的奖励。
如果奖励函数设计不合理,智能体可能找到意料之外的“投机方法”。
例如,为机器人设置向前速度奖励后,它可能学会:
疯狂摆动身体获得瞬时速度
拖着脚向前滑动
通过摔倒向前移动
这些行为可能获得较高数学奖励,但并不是设计者真正想要的动作。
3. 超参数仍然需要调整
PPO常见的重要参数包括:
学习率
裁剪范围 ε
折扣因子 γ
GAE参数 λ
每批数据更新次数
熵系数
价值损失系数
如果更新轮数过多,策略可能过度拟合当前数据;如果更新轮数太少,数据又没有得到充分利用。
4. 裁剪不等于绝对安全
PPO限制的是动作概率变化,并不能保证神经网络在所有状态下的输出都只发生很小变化。
因此,即使使用了裁剪,训练过程中仍然可能出现策略退化、奖励震荡或局部最优。
十三、PPO和SAC有什么区别?
PPO和SAC都是连续控制中常见的强化学习算法,但二者思路不同。
PPO:On-Policy算法
SAC:Off-Policy算法
PPO通常使用当前策略采集的数据,训练完成后旧数据很快被丢弃。
SAC则会把数据存入经验回放池,并反复使用历史数据。
简单对比如下:
对比项目 | PPO | SAC |
|---|---|---|
数据类型 | On-Policy | Off-Policy |
样本利用率 | 相对较低 | 相对较高 |
训练稳定性 | 较好 | 较好但实现更复杂 |
并行仿真 | 非常适合 | 也可以使用 |
机器人运动控制 | 非常常见 | 也较常见 |
经验回放池 | 通常不使用 | 使用 |
策略特点 | 限制更新幅度 | 最大化奖励与策略熵 |
如果拥有大量高速并行仿真环境,PPO通常是一个非常可靠的选择。
如果真实环境数据昂贵,希望反复利用每一条数据,SAC可能更有优势。
十四、如何用一句话理解PPO?
可以把PPO想象成一个正在学习走路的人。
普通策略梯度可能会说:
这个动作效果好,下一次把它的概率提高十倍。
而PPO会说:
这个动作确实不错,但先只提高一点。
观察效果后,再继续调整。
因此,PPO真正解决的不是“怎样更新策略”,而是:
怎样以相对稳定、谨慎的方式更新策略。
总结
PPO是一种基于Actor-Critic结构的策略梯度算法。
它的核心过程是:
策略与环境交互
↓
计算动作优势
↓
提高好动作的概率
↓
降低差动作的概率
↓
通过裁剪限制更新幅度
PPO最关键的设计是概率比裁剪:
r_t = π_new(a_t | s_t) / π_old(a_t | s_t)
并将概率比限制在一定范围内:
clip(r_t, 1-ε, 1+ε)
它的核心思想可以概括为一句话:
让策略每次都朝更好的方向前进,但不要一次走得太远。
也正因为训练稳定、实现简单,并且适合连续动作与大规模并行仿真,PPO成为了机器人运动控制和强化学习研究中最常用的算法之一。
对PPO的讲解由浅入深,循序渐进,逻辑清晰,新手友好。