📢本文是博主记录的学习摘录和笔记📝,若有不当之处,恳请各位小伙伴及时联系博主进行改正🙏,还望大家多多谅解与包容!🤝😊
算法介绍
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π(A∣S,θ)(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πθ(at∣st)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(at∣st)πθ(at∣st)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(at∣st)πθ(at∣st) 称为重要性采样比率
当 π θ \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) πθ(at∣st),即让 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) πθ(at∣st),即让 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πθ(a∣st)logπθ(a∣st)]:策略熵,用于鼓励探索;
- 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
T−1:
- 根据当前状态 s t s_t st,采样动作 a t ∼ π θ ( a ∣ s t ) a_t\sim\pi_\theta(a|s_t) at∼πθ(a∣st)
- 执行动作 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) 等信息
- 对于时间步
t
=
0
t=0
t=0 到
T
−
1
T-1
T−1:
- 对于多个并行智能体,执行策略
π
θ
\pi_\theta
πθ 生成轨迹:
-
计算优势函数(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+⋯+(γλ)T−t−1δT−1
-
构建 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 的核心思想——一个简单的 min 和 clip 操作——可以用几行代码轻松实现。它将复杂的约束问题转化为了一个易于优化的损失函数,使得算法既保留了 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
文章分类在👉深度学习专栏【点击跳转】,欢迎关注!

3710

被折叠的 条评论
为什么被折叠?



