【强化学习】PPO算法

​ 📢本文是博主记录的学习摘录和笔记📝,若有不当之处,恳请各位小伙伴及时联系博主进行改正🙏,还望大家多多谅解与包容!🤝😊

PPO算法

算法介绍

PPO算法(近端策略优化,Proximal Policy Optimization是一种在强化学习领域广泛应用的策略梯度方法,由OpenAI于2017年提出 Proximal Policy Optimization Algorithms。它通过限制策略更新的幅度,解决了传统策略梯度方法中训练不稳定的问题,在多个领域展现出卓越的性能。

背景

在强化学习中,策略梯度方法(如REINFORCE、A2C、TRPO)通过直接优化策略参数来最大化期望回报。然而,这些方法存在一些问题:

  • 更新步长难以控制:如果策略更新幅度过大,可能导致策略崩溃;更新过小则训练缓慢。
  • 样本效率低:传统策略梯度通常每个样本只能使用一次。
  • 实现复杂:例如TRPO(Trust Region Policy Optimization)虽然能保证策略更新的稳定性,但需要二阶优化和复杂的约束处理,实现复杂,计算开销大。

PPO 正是为了解决这些问题而设计的:PPO算法保留了TRPO的优点(即稳定、可靠的策略更新),同时简化实现、提高计算效率。

核心思想

​ 在强化学习中,策略梯度方法的目标函数的梯度公式如下:
∇ θ J ( θ ) = E S ∼ η ,   A ∼ π ( S , θ ) [ ∇ θ ln ⁡ π ( A ∣ S , θ )   ( q π ( S , A ) − v π ( S ) ) ] \nabla_\theta J(\theta) = \mathbb{E}_{S \sim \eta,\, A \sim \pi(S, \theta)} \left[ \nabla_\theta \ln \pi(A|S, \theta) \, (q_\pi(S, A)-v_\pi(S)) \right] θJ(θ)=ESη,Aπ(S,θ)[θlnπ(AS,θ)(qπ(S,A)vπ(S))]
​ 目标函数可以写成

L PG ( θ ) = E ( s t , a t ) ∼ π θ [ log ⁡ π θ ( a t ∣ s t )   A t ] L^{\text{PG}}(\theta) = \mathbb{E}_{(s_t, a_t) \sim \pi_\theta} \left[ \log \pi_\theta(a_t \mid s_t) \, A_t \right] LPG(θ)=E(st,at)πθ[logπθ(atst)At]
在 TRPO 中,目标函数在策略更新大小约束下被最大化,即
maximize θ E ^ t [ π θ ( a t ∣ s t ) π θ old ( a t ∣ s t ) A ^ t ] \mathop{\text{maximize}}\limits_{\theta} \quad \hat{\mathbb{E}}_t \left[ \frac{\pi_\theta(a_t \mid s_t)}{\pi_{\theta_{\text{old}}}(a_t \mid s_t)} \hat{A}_t \right] θmaximizeE^t[πθold(atst)πθ(atst)A^t]

subject to E ^ t [ K L [ π θ old ( ⋅ ∣ s t ) , π θ ( ⋅ ∣ s t ) ] ] ≤ δ . \text{subject to} \quad \hat{\mathbb{E}}_t \left[ \mathrm{KL} \left[ \pi_{\theta_{\text{old}}}(\cdot \mid s_t), \pi_\theta(\cdot \mid s_t) \right] \right] \leq \delta. subject toE^t[KL[πθold(st),πθ(st)]]δ.

其中:

r t ( θ ) = π θ ( a t ∣ s t ) π old ( a t ∣ s t ) r_t(\theta) = \frac{\pi_\theta(a_t \mid s_t)}{\pi_{\text{old}}(a_t \mid s_t)} rt(θ)=πold(atst)πθ(atst) 称为重要性采样比率

π θ \pi_\theta πθ π o l d \pi_{old} πold 差异较大时, r t ( θ ) r_t(\theta) rt(θ) 可能非常大或非常小,导致梯度估计方差极大,甚至使策略崩溃。

为了解决上述问题,PPO 提出了 裁剪替代目标函数(Clipped Surrogate Objective)
L CLIP ( θ ) = E t [ min ⁡ ( r t ( θ ) A ^ t ,   clip ( r t ( θ ) ,   1 − ϵ ,   1 + ϵ ) A ^ t ) ] L^{\text{CLIP}}(\theta) = \mathbb{E}_t \left[ \min \left( r_t(\theta) \hat{A}_t ,\, \text{clip}(r_t(\theta),\, 1-\epsilon,\, 1+\epsilon) \hat{A}_t \right) \right] LCLIP(θ)=Et[min(rt(θ)A^t,clip(rt(θ),1ϵ,1+ϵ)A^t)]
其中:
ϵ > 0 \epsilon > 0 ϵ>0 是一个小的超参数(通常取 0.2)
clip ( x , a , b ) \text{clip}(x, a, b) clip(x,a,b) x x x 限制在区间 $ [a, b] $ 内

PPO 的另一种方法是使用 KL 散度惩罚,但在实验中发现性能不如 CLIP ,实验也更复杂。

PPO 的目标函数不是简单地使用裁剪后的比率,而是取原始比率目标和裁剪后目标的较小值。这是为了保守更新)。

  • A t > 0 A_t >0 At>0(动作比平均好):

    • 我们希望增大 π θ ( a t ∣ s t ) \pi_\theta(a_t|s_t) πθ(atst),即让 r t ( θ ) > 1 r_t(\theta) > 1 rt(θ)>1
    • 但如果 r t ( θ ) > 1 + ϵ r_t(\theta) > 1 + \epsilon rt(θ)>1+ϵ,说明更新太大,此时裁剪后的值为 ( 1 + ϵ ) A t (1 + \epsilon)A_t (1+ϵ)At
    • 取 min 后,目标函数值被限制,防止过度鼓励该动作
  • A t < 0 A_t < 0 At<0(动作比平均差):

    • 我们希望减小 π θ ( a t ∣ s t ) \pi_\theta(a_t|s_t) πθ(atst),即让 r t ( θ ) < 1 r_t(\theta) < 1 rt(θ)<1
    • 但如果 r t ( θ ) < 1 − ϵ r_t(\theta) < 1 - \epsilon rt(θ)<1ϵ,说明策略变化太大,裁剪后为 ( 1 − ϵ ) A t (1 - \epsilon)A_t (1ϵ)At
    • 注意:因为 A t < 0 A_t < 0 At<0 ( 1 − ϵ ) A t < r t ( θ ) A t (1 - \epsilon)A_t < r_t(\theta)A_t (1ϵ)At<rt(θ)At, min 会选更小的,限制策略下降的幅度

完整的 PPO 目标函数:
L t ( θ ) = E t [ L t CLIP ( θ ) − c 1 L t VF ( θ ) + c 2 S [ π θ ] ( s t ) ] L_t(\theta)=\mathbb{E}_t \left[ L^{\text{CLIP}}_t(\theta)-c_1L^{\text{VF}}_t(\theta)+c_2S[\pi_\theta](s_t) \right] Lt(θ)=Et[LtCLIP(θ)c1LtVF(θ)+c2S[πθ](st)]
其中:

  • L t VF ( θ ) = E t [ ( V θ ( s t ) − V t target ) 2 ] L^{\text{VF}}_t(\theta)=\mathbb{E}_t\left[(V_\theta(s_t)-V_t^{\text{target}})^2\right] LtVF(θ)=Et[(Vθ(st)Vttarget)2]:价值函数的均方误差损失;
  • S [ π θ ] ( s t ) = E t [ − ∑ a π θ ( a ∣ s t ) log ⁡ π θ ( a ∣ s t ) ] S[\pi_\theta](s_t)=\mathbb{E}_t\left[-\sum_a\pi_\theta(a|s_t)\log\pi_\theta(a|s_t)\right] S[πθ](st)=Et[aπθ(ast)logπθ(ast)]:策略熵,用于鼓励探索;
  • c 1 , c 2 c_1,c_2 c1,c2 是超参数

流程

  • 初始化

    • 初始化策略网络(Policy Network) π θ \pi_\theta πθ(参数为 θ \theta θ
    • 初始化价值网络(Value Network) V ϕ V_\phi Vϕ(参数为 ϕ \phi ϕ
    • 设置超参数:折扣因子 γ \gamma γ、GAE 参数 λ \lambda λ、裁剪范围 ε \varepsilon ε、学习率、训练轮数 K K K、每个批次的轨迹长度 T T T
  • 数据收集
    在当前策略 π θ \pi_\theta πθ 下,与环境交互收集经验数据:

    • 对于多个并行智能体,执行策略 π θ \pi_\theta πθ 生成轨迹:
      • 对于时间步 t = 0 t=0 t=0 T − 1 T-1 T1
        • 根据当前状态 s t s_t st,采样动作 a t ∼ π θ ( a ∣ s t ) a_t\sim\pi_\theta(a|s_t) atπθ(ast)
        • 执行动作 a t a_t at,获得奖励 r t r_t rt 和下一状态 s t + 1 s_{t+1} st+1
        • 存储 ( s t , a t , r t , s t + 1 ) (s_t,a_t,r_t,s_{t+1}) (st,at,rt,st+1) 等信息
  • 计算优势函数(Advantage Estimation)
    使用收集到的轨迹数据,估计每个时间步的优势函数 A t A_t At,常用 GAE(Generalized Advantage Estimation)

    • 首先用价值网络 V ϕ ( s ) V_\phi(s) Vϕ(s) 估计状态价值
    • 计算 TD 残差: δ t = r t + γ V ϕ ( s t + 1 ) − V ϕ ( s t ) \delta_t=r_t+\gamma V_\phi(s_{t+1})-V_\phi(s_t) δt=rt+γVϕ(st+1)Vϕ(st)
    • A t = δ t + ( γ λ ) δ t + 1 + ( γ λ ) 2 δ t + 2 + ⋯ + ( γ λ ) T − t − 1 δ T − 1 A_t=\delta_t+(\gamma\lambda)\delta_{t+1}+(\gamma\lambda)^2\delta_{t+2}+\dots+(\gamma\lambda)^{T-t-1}\delta_{T-1} At=δt+(γλ)δt+1+(γλ)2δt+2++(γλ)Tt1δT1
  • 构建 PPO 目标函数(Clipped Surrogate Objective)
    对每个样本 ( s t , a t ) (s_t,a_t) (st,at),计算重要性采样比率

  • 计算PPO-Clip 的目标函数,再加上价值函数损失和熵奖励。

  • 优化目标函数。

优势

训练稳定性高

这是 PPO 最核心的优势。在 PPO 出现之前,策略梯度算法经常面临一个两难选择:

  • 学习率太小:策略更新缓慢,训练耗时。
  • 学习率太大:策略更新步子迈得太大,可能导致策略性能突然崩溃,且难以恢复。

PPO 通过其裁剪机制或 KL 散度惩罚完美地解决了这个问题。它不直接限制学习率,而是限制新旧策略的变化幅度。

实现简单

PPO 的前身是 TRPO(Trust Region Policy Optimization)。TRPO 的思想与 PPO 类似,也是为了限制策略更新的幅度,但它使用了一个复杂的、涉及二阶导数和共轭梯度法的约束来保证更新在“信任区域”内。这使得 TRPO 的实现非常困难且计算成本高昂。

相比之下,PPO-Clip 的核心思想——一个简单的 minclip 操作——可以用几行代码轻松实现。它将复杂的约束问题转化为了一个易于优化的损失函数,使得算法既保留了 TRPO 的稳定性思想,又具有简洁性。

良好的样本效率(相对 on-policy 算法)
  • 虽然 PPO 本质上仍是 on-policy 算法(依赖当前策略生成数据),但它允许对同一批数据进行多次 epoch 更新,提高了数据利用率。

不足

on-policy
  • PPO 与 off-policy 算法相比,样本效率低下, 不能无限重用旧数据,每次策略更新后需重新与环境交互收集数据。
超参数敏感

虽然 PPO 的裁剪机制使其对学习率不那么敏感,但它引入了新的关键超参数,并且整体性能依然依赖于超参数的精心调整:

  • 裁剪范围 ϵ \epsilon ϵ:这是最重要的超参数之一。 ϵ \epsilon ϵ 太小,策略更新会非常缓慢; ϵ \epsilon ϵ 太大,则失去了裁剪的意义,可能变得不稳定。
  • 价值损失系数 c 1 c_1 c1 和熵系数 c 2 c_2 c2: 这两个系数平衡了策略改进、价值评估和探索三者的关系。如果权重设置不当,训练可能会出现各种问题(如不收敛或策略过早确定)。
  • GAE 参数 λ \lambda λ:影响优势函数的计算,控制着偏差和方差的权衡。

总结

PPO通过裁剪目标函数平衡了策略更新的探索与利用,成为强化学习领域的主流算法之一。

参考

【强化学习的数学原理】课程:从零开始到透彻理解(完结)_哔哩哔哩_bilibili

文章分类在👉深度学习专栏【点击跳转】,欢迎关注!

### PPO算法原理 PPO(Proximal Policy Optimization)是一种高效的强化学习算法,其核心目标是在更新策略时不偏离当前策略太远。通过引入信任区域的概念,PPO能够在保持稳定性的前提下最大化奖励函数[^1]。 具体来说,PPO有两种主要形式:一种是基于KL散度约束的形式;另一种则是更常用的裁剪版本(PPO-clip)。对于后者,在损失函数的设计上加入了对优势估计的裁剪操作,从而避免了因过大学习率而导致的策略不稳定问题[^2]。 #### 数学表达 假设我们有一个旧策略 \(\pi_{\text{old}}\) 和新策略 \(\pi_\theta\) ,则PPO的目标是最小化以下损失函数: \[ L^{CLIP} (\theta) = \mathbb{E}_t [\min(r_t(\theta)\hat{A}_t, \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon)\hat{A}_t)] \] 其中 \( r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\text{old}}(a_t|s_t)} \),表示概率比率;而 \(\hat{A}_t\) 是优势函数的估计值[^3]。 --- ### 实现方法与工具支持 在实际开发过程中,开发者通常会借助成熟的开源库来快速搭建实验环境并验证模型效果。以下是几种常见的实现方式及其依赖的技术栈: 1. **OpenAI Gym**: 提供了一系列标准测试场景用于评估不同类型的强化学习任务表现情况,比如经典的CartPole平衡杆游戏等。 2. **PyTorch/TensorFlow**: 这两个主流深度学习框架都具备构建复杂神经网络的能力,并且各自拥有针对特定需求定制化的扩展包(如Stable-Baselines3),可以直接调用已封装好的PPO类完成训练流程配置工作。 3. **Stable-Baselines3 & OpenAI Baselines**: 它们分别建立于上述两大DL平台之上,进一步简化了高级API接口设计思路,使得初学者也能轻松掌握如何定义参数空间范围以及监控收敛过程中的各项指标变化趋势。 下面给出一段利用Python配合PyTorch实现基本版连续控制环境下Actor-Critic结构下的伪代码作为参考: ```python import torch from torch import nn from torch.distributions import Normal class ActorCritic(nn.Module): def __init__(self, state_dim, action_dim): super().__init__() self.actor = nn.Sequential( nn.Linear(state_dim, 64), nn.Tanh(), nn.Linear(64, action_dim) ) self.critic = nn.Sequential( nn.Linear(state_dim, 64), nn.Tanh(), nn.Linear(64, 1) ) def forward(self, states): mean_actions = self.actor(states) values = self.critic(states).squeeze(-1) std_deviation = torch.ones_like(mean_actions)*0.5 # Fixed standard deviation distribution = Normal(loc=mean_actions, scale=std_deviation) return distribution, values def compute_loss(new_log_probs, old_log_probs, advantages, epsilon_clip=0.2): ratio = (new_log_probs - old_log_probs).exp() surr1 = ratio * advantages surr2 = torch.clamp(ratio, 1.0 - epsilon_clip, 1.0 + epsilon_clip) * advantages policy_loss = -torch.min(surr1, surr2).mean() value_preds = critic_values # Placeholder for actual predictions from Critic network returns = target_returns # Computed using GAE or Monte Carlo methods value_loss = F.mse_loss(value_preds, returns) total_loss = policy_loss + 0.5*value_loss return total_loss ``` 此段脚本展示了怎样创建一个简单的AC架构实例对象并通过自定义loss function来进行反向传播调整权重的过程. --- ### §相关问题§ 1. 如何调节超参以提高PPO算法性能? 2. 在多智能体协作场景下能否有效运用PPO机制解决问题?如果有,请举例说明应用场景。 3. 当前有哪些改进型变种被提出用来克服原生PPO可能存在的局限之处? 4. 使用GPU加速能够带来哪些方面的提升对比CPU运算模式而言? 5. 如果遇到样本分布不均衡的情况应该采取何种措施应对呢?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值