【浅显易懂理解强化学习】(七):PPO,策略更新的安全阀
* 本节主要介绍了 PPO,它是在策略梯度和 Actor-Critic 基础上提出的一种稳定强化学习方法。通过Clip Trick限制新旧策略的变化幅度、结合优势函数降低梯度方差,并加入Entropy Bonus保持探索能力,PPO 能够在离散和连续动作空间中稳定训练。
前言
- 本系列讲究浅显易懂,所以尽量讲的简单并减少数学公式的解释加强实际运用。
- 上一期我们讲到了 DDPG 与 TD3 两种用于连续动作空间的强化学习算法。
- DDPG 可以看作是 DQN + Policy Gradient + Actor-Critic 思想的一种融合,它让强化学习能够直接处理连续动作空间的问题。
- TD3 则针对 DDPG 在训练过程中容易出现 Q值过估计和训练不稳定 的问题进行了改进,通过 双 Q 网络、延迟策略更新以及目标策略平滑 等技巧,使训练更加稳定。
- 不过,上述算法它们有一个非常致命的问题:
- 策略更新太猛,训练容易直接崩掉
- 那么是否有一种方法,既能保持策略梯度的优点,又能让更新过程更稳定?
- 那就是今天要介绍的PPO(Proximal Policy Optimization)
PPO是当前 强化学习中最常用、最稳定的算法之一,在很多实际项目中都有广泛应用。
1 PPO(Proximal Policy Optimization)

1-1 介绍
- PPO(Proximal Policy Optimization) 是由 OpenAI 在 2017 年提出的一种强化学习策略优化算法,其论文为 “Proximal Policy Optimization Algorithms”。该算法属于 策略梯度(Policy Gradient)方法,同时通常结合 Actor-Critic 框架 进行训练。
- 我们从其名字的组合来分析
Proximal(邻近、接近):每次策略更新都要保持与旧策略“接近”,而不是让策略发生大跳跃。Policy(策略):智能体决定在每个状态该采取什么动作的策略。Optimization(优化):不断改进策略参数,使智能体获得更高的长期奖励。
- PPO 的核心思想是:
- 在更新策略时 限制新策略与旧策略之间的差异,从而避免策略更新过大导致训练过程不稳定的问题。
1-2 为什么需要 PPO(Policy Gradient 的问题)
- 我们在第四期讲到 Policy Gradient 时其实已经提到过,它虽然能够 直接学习策略,但仍然存在几个比较明显的问题:
- 方差很大(训练不稳定)
由于策略梯度依赖采样数据进行更新,不同采样轨迹之间的差异可能非常大,因此梯度方差也会比较高,导致训练过程容易震荡。 - 策略崩塌(Policy Collapse)
在策略更新时,如果更新步长过大,新策略可能会和旧策略产生巨大差异。例如原本概率较高的动作突然被大幅降低,这可能会导致性能突然下降。 - 样本利用率低
Policy Gradient 属于 on-policy 方法,训练数据必须由当前策略生成,因此旧数据往往无法反复利用,训练效率较低。 - 容易陷入局部最优
由于策略是通过梯度更新得到的,如果探索不足,很容易陷入某个局部最优策略。
- 而我们在第五期中介绍的 Actor-Critic 方法,其实就是为了解决 Policy Gradient 中 方差过大 的问题。
- Actor-Critic 通过引入 价值网络(Critic) 来估计状态价值或优势函数,从而减少策略梯度估计的方差,使训练过程更加稳定。
- 但是即便如此,策略更新过大的问题仍然存在。
- 说人话就是:
- 即使我们能够更准确地估计梯度,如果一次更新改变策略太多,训练仍然可能会崩掉。
- 那么为了应对这个问题,研究人员提出了一种新的思路: 限制每一次策略更新的幅度。 限制每一次策略更新的幅度。 限制每一次策略更新的幅度。也就是说,新策略不能和旧策略差别太大。
- 而这种思想正是 PPO(Proximal Policy Optimization) 的核心。
1-3 概率比率(Probability Ratio)
- PPO 的核心思想其实非常简单: 限制策略更新的幅度。 限制策略更新的幅度。 限制策略更新的幅度。
- 也就是:
- 如果策略变化太大,就 阻止这次更新继续扩大。
- 那么如何判断策略变化的度量呢,PPO 引入了一个重要的概念:
- 概率比率(Probability Ratio) r ( θ ) = π θ ( a ∣ s ) π θ o l d ( a ∣ s ) r(\theta) = \frac{\pi_\theta(a|s)}{\pi_{\theta_{old}}(a|s)} r(θ)=πθold(a∣s)πθ(a∣s)
- 它表示:
- 新策略和旧策略在某个动作上的概率比例。
- 如果
r ≈ 1,说明新旧策略 差不多 - 如果
r >> 1 或 r << 1,说明策略 变化太大
1-4 Clip Trick(PPO 最关键公式)

- PPO 的核心创新就是:
- Clip Trick(裁剪机制)
- 为了防止新策略和旧策略差别太大,
PPO通过 限制概率比率 r 的范围 来控制策略更新。 - PPO 的目标函数是: L c l i p ( θ ) = E [ min ( r ( θ ) A , c l i p ( r ( θ ) , 1 − ϵ , 1 + ϵ ) A ) ] L^{clip}(\theta)=\mathbb{E}[\min(r(\theta)A,\mathrm{clip}(r(\theta),1-\epsilon,1+\epsilon)A)] Lclip(θ)=E[min(r(θ)A,clip(r(θ),1−ϵ,1+ϵ)A)]
- 其中:
- r ( θ ) r(\theta) r(θ):新旧策略概率比
- A A A:Advantage(优势函数)
- ϵ \epsilon ϵ:裁剪范围,一般取 0.1~0.2
- 注:这里的Advantage(优势函数)就是 Actor-Critic 中的 Advantage。我们在第五期的
2-4提到过。 - 通过上述公式,PPO 会限制 r ( θ ) r(\theta) r(θ)的取值范围 [ 1 − ϵ , 1 + ϵ ] [1-\epsilon, 1+\epsilon] [1−ϵ,1+ϵ]
- 如果超过这个范围:
- 梯度就会被裁剪,不再继续增大。
- 简单点说就是:
- 策略更新->概率变化过大?
- 是 → 截断更新
- 否 → 正常更新
- 策略更新->概率变化过大?
1-5 训练流程
- PPO 的整体训练流程其实和 Actor-Critic 非常相似,只是在 策略更新阶段加入了 Clip 机制。
1-5-1 采样数据
- 首先使用当前策略 πθold\pi_{\theta_{old}}πθold 与环境进行交互,收集一批轨迹数据 ( s , a , r , s ′ ) (s,a,r,s') (s,a,r,s′),这些数据通常会组成一个 trajectory 或 batch。
1-5-2 计算回报
- 根据采样到的奖励序列计算累计回报: R t = r t + γ r t + 1 + γ 2 r t + 2 + . . . R_t = r_t + \gamma r_{t+1} + \gamma^2 r_{t+2} + ... Rt=rt+γrt+1+γ2rt+2+...用于后续训练价值网络。
1-5-3 计算 Advantage
- 利用 Critic 网络 估计状态价值 V ( s ) V(s) V(s),然后计算优势函数: A ( s , a ) = R t − V ( s ) A(s,a) = R_t - V(s) A(s,a)=Rt−V(s)它表示:
- 这个动作比平均水平好多少
- 通过 Advantage 可以:
- 降低策略梯度的方差
- 提供更稳定的梯度方向
- 在实际实现中,很多 PPO 会使用 GAE(Generalized Advantage Estimation) 来进一步降低方差。
1-5-4 计算概率比率
- 根据新旧策略计算概率比率: r ( θ ) = π θ ( a ∣ s ) π θ o l d ( a ∣ s ) r(\theta) = \frac{\pi_\theta(a|s)}{\pi_{\theta_{old}}(a|s)} r(θ)=πθold(a∣s)πθ(a∣s)用于判断新策略相对于旧策略,在该动作上的概率变化。
1-5-5 使用 Clip Trick 更新策略
- 将概率比率带入 PPO 的 Clip 目标函数: L c l i p ( θ ) L^{clip}(\theta) Lclip(θ)
- 如果概率变化过大,就会被 clip 限制。这样可以防止策略发生剧烈变化。
1-5-6 更新 Actor 和 Critic
- 最后分别更新两个网络:
- Actor(策略网络)
最大化 PPO 的目标函数 - Critic(价值网络)
最小化价值函数误差
- Actor(策略网络)
- 通常会对同一批数据 进行多轮 mini-batch 更新,以提高样本利用率。
采样一批 trajectory
↓
打乱数据
↓
划分 mini-batch
↓
多轮训练
1-6 Entropy Bonus(探索奖励)
- 在强化学习中,还有一个常见的问题: 策略过早收敛 策略过早收敛 策略过早收敛
- 举个例子假设一个智能体发现某个动作暂时收益较高,那么策略可能很快变成:
- 动作A:0.99
- 动作B:0.01
- 这样虽然短期收益不错,但可能会导致探索能力下降从而错过更优策略。
- 为了解决这个问题,PPO 在损失函数中加入了 Entropy Bonus(熵奖励)。
- 策略熵定义为: H ( π ) = − ∑ π ( a ∣ s ) log π ( a ∣ s ) H(\pi) = -\sum \pi(a|s)\log \pi(a|s) H(π)=−∑π(a∣s)logπ(a∣s)
- 你可以这样理解:策略越随机,熵越大
- 因此在训练时加入熵奖励,可以:
- 鼓励策略保持一定随机性
2 损失函数与伪代码实现
- 在实际实现中,PPO 的损失函数通常由 三部分组成:
- Policy Loss(策略损失)
- Value Loss(价值损失)
- Entropy Bonus(探索奖励)
- 完整损失函数为: L ( θ ) = E [ L c l i p ( θ ) − c 1 L V F ( θ ) + c 2 H ( π θ ) ] L(\theta)=\mathbb{E}[L^{clip}(\theta)-c_1L^{VF}(\theta)+c_2H(\pi_\theta)] L(θ)=E[Lclip(θ)−c1LVF(θ)+c2H(πθ)]其中:
- c 1 c1 c1:价值损失权重
- c 2 c2 c2:熵奖励权重
1-7 GAE(Generalized Advantage Estimation)
-
在前面我们计算 Advantage 时使用的是: A ( s , a ) = R t − V ( s ) A(s,a)=R_t-V(s) A(s,a)=Rt−V(s)
-
这种方法虽然简单,但在实际强化学习中会有两个问题:
- 方差较大:如果直接使用完整回报 R R R,由于奖励可能跨越很长时间,计算出来的 Advantage 波动会比较大。
- 偏差与方差的权衡问题:如果只使用短期 TD 误差,方差会降低,但可能会引入偏差。
-
为了解决这个问题,研究人员提出了 GAE(Generalized Advantage Estimation)。
-
GAE的核心思想是:- 在“低方差”和“低偏差”之间做一个平衡。
-
它通过引入一个参数 λ(lambda),将 多步 TD 误差进行加权平均,从而得到更加稳定的 Advantage 估计。
-
公式: A t G A E = ∑ l = 0 ∞ ( γ λ ) l δ t + l A_t^{GAE} = \sum_{l=0}^{\infty} (\gamma \lambda)^l \delta_{t+l} AtGAE=l=0∑∞(γλ)lδt+l其中: δ t = r t + γ V ( s t + 1 ) − V ( s t ) \delta_t = r_t + \gamma V(s_{t+1}) - V(s_t) δt=rt+γV(st+1)−V(st)
-
表示 TD 误差(Temporal Difference Error)。
-
参数 λ \lambda λ 控制了 偏差和方差之间的平衡:
- λ = 0 只使用 一步 TD 误差,方差小,偏差较大
- λ = 1 接近 Monte Carlo 回报.偏差小.方差较大
-
实际训练中一般取: λ = 0.95 λ=0.95 λ=0.95
-
这样可以在 稳定性和准确性之间取得较好的平衡。
2-1 Policy Loss(策略损失)
- 策略损失就是 PPO 的 核心 Clip 目标函数: L c l i p ( θ ) L^{clip}(\theta) Lclip(θ)其作用是:
- 更新策略网络(Actor)
- 在更新过程中:
- 如果新旧策略变化不大 → 正常更新
- 如果变化过大 → 被 clip 限制
2-2 Value Loss(价值损失)
- 在 Actor-Critic 框架中,还需要训练 Critic 网络 来估计状态价值。
- 价值损失通常采用 均方误差(MSE): L V F = ( V ( s ) − R ) 2 L^{VF} = (V(s)-R)^2 LVF=(V(s)−R)2其中:
- V ( s ) V(s) V(s) : Critic预测价值
- R R R : 实际回报
- 训练目标就是让: V ( s ) ≈ R V(s) ≈ R V(s)≈R这样 Critic 才能更准确地评估状态价值,从而为 Actor 提供更可靠的 Advantage。
2-3 Entropy Bonus(探索奖励)
- 最后一部分是 策略熵奖励: H ( π ) H(\pi) H(π)它的作用是:鼓励策略保持一定随机性
2-4 常用算法对比表格
| 算法 | 类型 | 动作空间 | 核心思想 | 样本利用率 | 优势 | 劣势 | 稳定性 |
|---|---|---|---|---|---|---|---|
| DQN | Value-based | 离散 | 用神经网络近似 Q 表,间接导出策略 | 高(Replay Buffer) | 实现简单,训练效率高 | 只能处理离散动作,容易 Q 值过估计 | 中 |
| A3C | Actor-Critic | 离散/连续 | 多线程 Actor-Critic,优势函数降低梯度方差 | 低(on-policy) | 并行采样效率高,收敛速度快 | 更新不稳定,样本利用率低,线程管理复杂 | 中 |
| DDPG | Actor-Critic | 连续 | 确定性策略梯度 + Critic Q 值评估 | 高(off-policy Replay Buffer) | 适合连续动作,高样本利用率 | 易训练不稳定,探索能力弱,容易陷入局部最优 | 较低 |
| PPO | Policy Gradient | 离散/连续 | 随机策略 + Clip Trick 限制更新 | 中(可多轮 mini-batch) | 更新稳定,训练可靠,适用范围广 | 样本利用率不如 DDPG | 高 |
2-4 PPO 伪代码
- 我们可以简单实现一个PPO的伪代码
# 初始化策略网络 Actor(θ) 和价值网络 Critic(φ)
initialize_actor(theta)
initialize_critic(phi)
# 超参数
gamma = 0.99 # 折扣因子,折扣未来奖励的系数
epsilon = 0.2 # Clip范围,裁剪范围,限制策略更新幅度,避免策略崩塌。
K_epochs = 4 # 每批数据更新轮数
batch_size = 64 # mini-batch大小
while not converged:
# 1. 使用旧策略与环境交互,收集轨迹数据
trajectories = collect_trajectories(actor=theta, env, batch_size)
states, actions, rewards = trajectories.states, trajectories.actions, trajectories.rewards
# 2. 计算累计回报
R = compute_returns(rewards, gamma)
# 3. 计算优势函数,优势函数表示这个动作比平均水平好多少
V = critic(phi).predict(states)
A = R - V
# 4. 保存旧策略概率,用于概率比率计算
old_probs = actor(theta).probability(states, actions)
# 5. 多轮 mini-batch 更新
for epoch in range(K_epochs):
for s_batch, a_batch, R_batch, A_batch, old_prob_batch in mini_batches(states, actions, R, A, old_probs, batch_size):
# 5-1 计算新策略概率
new_probs = actor(theta).probability(s_batch, a_batch)
# 5-2 计算概率比率,反映新旧策略的变化幅度,用于 Clip 限制。
r = new_probs / old_prob_batch
# 5-3 Clip Trick 目标函数,如果策略变化幅度过大(超出 [1-ε,1+ε]),梯度被裁剪,避免策略崩塌。
L_clip = mean( min(r * A_batch, clip(r, 1-epsilon, 1+epsilon) * A_batch) )
# 5-4 价值网络损失
L_value = mean((critic(phi).predict(s_batch) - R_batch)**2)
# 5-5 熵奖励,策略越随机,熵越大,避免过早收敛。
H = mean(actor(theta).entropy(s_batch))
# 5-6 总损失(Actor最大化,Critic最小化)
total_loss = -L_clip + 0.5 * L_value - 0.01 * H
# 5-7 更新参数,lr_critic和lr_actor是学习率
theta = theta - lr_actor * gradient(total_loss, theta)
phi = phi - lr_critic * gradient(L_value, phi)
小结
- 本节主要介绍了 PPO(Proximal Policy Optimization) 算法,它是在策略梯度和 Actor-Critic 基础上提出的一种稳定强化学习方法。通过 Clip Trick 限制新旧策略的变化幅度、结合优势函数降低梯度方差,并加入 Entropy Bonus 保持探索能力,PPO 能够在离散和连续动作空间中稳定训练。
- 下一期我们讲
DPPO - 希望文章对你有帮助,如有错误,欢迎指出。
总结
- 自此,我们的系列以及讲了很多算法了,我们来回顾一下:
Value-basedQ-Learning:- 最经典的强化学习算法,本质是 查表学习每个状态-动作的价值 Q(s,a)。
Sarsa:- 与 Q-Learning 类似,但属于 on-policy 学习,更新时使用 当前策略实际执行的动作
DQN:- 使用 神经网络替代 Q 表,让 Q-Learning 可以处理 高维状态空间(如图像)。
Policy-basedPolicy Gradient:- 直接学习 策略函数 π(a|s),通过梯度优化策略,而不是学习 Q 值。
Actor-Critic:- 结合 Policy Gradient 与 Value Function: Actor 负责决策,Critic 负责评价动作好坏。
A3C:- 通过 多线程并行训练加速 Actor-Critic,提高训练效率和稳定性。
DDPG:- 将 Actor-Critic + DQN 技术结合,用于 连续动作空间控制问题。
TD3:- 在 DDPG 基础上通过 双Q网络、延迟更新、策略平滑提升训练稳定性。
PPO:- Policy Gradient + Clip Trick,限制策略更新幅度,训练稳定。
更多推荐
所有评论(0)