4. PPO算法原理:近端策略优化核心思想
各位同学,欢迎来到第四讲。今天咱们聊聊PPO——近端策略优化。说实话,这个算法在强化学习领域,尤其是机器人控制这块,几乎成了标配。我最早接触PPO是在做四足机器人步态迁移的时候,当时试了好几个算法,最后发现PPO在稳定性和训练效率上确实有独到之处。
PPO的核心思想,说白了就是:既要让策略进步,又不能步子迈太大。你想想看,如果每次更新都猛改策略参数,很可能这次更新表现好了,下次就崩了。这在四足机器人上特别明显——我见过不少团队,训练时奖励曲线看着挺好,一上真机就摔跟头。
核心要点:PPO通过限制每次策略更新的幅度,在保证收敛速度的同时,大幅提升训练的稳定性。这是它成为主流算法的根本原因。
4.1 从策略梯度到PPO:为什么需要近端优化
传统的策略梯度方法,更新公式长这样:
∇J(θ) = E[∇log π_θ(a|s) * A(s,a)]
这里的问题在哪?每次更新后,新策略和旧策略的差异可能很大。一旦某次采样得到的优势函数估计有偏差,策略就会朝着错误方向猛冲。我在项目中遇到过这种情况:训练了2000个episode,突然一个异常样本让策略参数剧烈抖动,然后整个训练就废了。
PPO的解决方案很直接——给策略更新加个"保险丝"。它通过一个裁剪机制,确保新策略不会偏离旧策略太远。这个思路其实很符合工程直觉:宁可慢一点,也要稳一点。
4.2 Actor-Critic网络结构
PPO用的是Actor-Critic架构。我习惯把它理解成"一个做决策,一个做评价"。
- Actor(演员):负责输出动作。输入是状态,输出是动作的概率分布(连续动作)或概率值(离散动作)。
- Critic(评论家):负责评估状态的价值。输入是状态,输出是该状态的价值估计V(s)。
这两个网络通常共享底层的特征提取层,但在输出层分叉。我个人的习惯是:共享层用2-3层MLP,每层256或512个神经元,激活函数用ReLU。Actor的输出层用tanh(连续动作)或softmax(离散动作),Critic的输出层就是一个线性神经元。
经验之谈:在四足机器人任务中,我建议Critic网络比Actor稍微深一点。因为价值函数的拟合难度通常比策略函数大,多一层非线性变换能提升价值估计的准确性。
下面这张图展示了PPO中Actor-Critic的整体结构:
4.3 Clip机制详解
Clip机制是PPO的灵魂。它的目标函数长这样:
L_CLIP(θ) = E[ min( r(θ) * A, clip(r(θ), 1-ε, 1+ε) * A ) ]
其中,r(θ) = π_θ(a|s) / π_old(a|s),表示新旧策略在同一个动作上的概率比。ε是一个超参数,通常取0.1或0.2。
这个公式在干什么?我拆解一下:
- 计算概率比r(θ):如果新策略在某个动作上的概率比旧策略高很多,r(θ)就远大于1。
- 裁剪操作:把r(θ)限制在[1-ε, 1+ε]区间内。超出部分直接截断。
- 取最小值:在原始目标和裁剪后的目标之间取min,确保更新不会偏离太远。
注意:Clip机制不是简单地限制参数变化量,而是限制策略输出的变化幅度。我曾经见过有人把Clip理解成梯度裁剪,这是两个完全不同的概念。梯度裁剪防止梯度爆炸,Clip防止策略突变。
为什么这样有效?我举个例子。假设某个动作的优势函数A是正数(说明这个动作好),新策略在这个动作上的概率提高了,r(θ) > 1。如果r(θ)超过了1+ε,Clip就会把它拉回到1+ε。这样,即使优势函数很大,策略更新也不会过度偏向这个动作。
反过来,如果A是负数(动作不好),新策略应该降低这个动作的概率。但如果r(θ)变得太小(低于1-ε),Clip同样会截断。这就防止了策略因为一个坏样本就彻底放弃某个动作。
| 场景 | r(θ) 范围 | Clip 效果 | 实际影响 |
|---|---|---|---|
| A > 0, 动作被强化 | r(θ) > 1+ε | 截断到 1+ε | 防止过度强化该动作 |
| A > 0, 动作被强化 | r(θ) ≤ 1+ε | 不截断 | 正常更新 |
| A < 0, 动作被抑制 | r(θ) < 1-ε | 截断到 1-ε | 防止过度抑制该动作 |
| A < 0, 动作被抑制 | r(θ) ≥ 1-ε | 不截断 | 正常更新 |
这张表把Clip的四种情况说清楚了。你会发现,Clip只在策略变化过大时才出手干预,小幅度变化它不管。这就是"近端"的含义——允许进步,但不允许冒进。
4.4 PPO的完整训练流程
讲完核心组件,我把PPO的训练流程串一遍。我习惯用"采样-计算-更新"三步法来理解:
- 采样阶段:用当前策略在环境中跑N个时间步,收集状态、动作、奖励序列。
- 计算阶段:用Critic网络计算每个状态的价值V(s),然后计算优势函数A(s,a)。这里常用GAE(广义优势估计)来平衡偏差和方差。
- 更新阶段:用Clip目标函数更新Actor,用MSE损失更新Critic。注意,这里可以多次迭代更新(通常3-10个epoch),因为Clip机制保证了每次更新不会偏离太远。
个人建议:在四足机器人任务中,采样阶段的时间步可以设长一些,比如2048或4096。因为四足机器人的运动周期较长,采样太少会导致优势函数估计不准确。
最后,我分享一个我在实际项目中踩过的坑。有一次训练四足机器人小跑,我用了PPO,但ε设成了0.3。结果训练过程中奖励曲线剧烈震荡,机器人走两步就摔倒。后来我把ε降到0.15,训练就稳定了。所以,ε这个参数不是越大越好,0.1到0.2之间通常是比较安全的范围。