前言
PPO(Proximal Policy Optimization)目前是强化学习(RL)领域的state-of-the-art算法,适用于连续空间和离散动作空间。与DQN(Deep Q-Network)相比,PPO通过限制策略更新的幅度,使得学习过程更加平滑。
PPO是对TRPO(Trust Region Policy Optimization)算法的改进,因此我们先来了解一下TRPO。
TRPO
首先明确这是Actor-critic method,存在两个神经网络:
- 第一个是policy策略网络,接受状态state输出动作action的概率分布,计作:πθ(a|s)
- 第二个是value价值网络,从状态 s 开始并按照策略 π \pi π 采取所有后续行动所期望的总回报,计作:Vπ(s)
目标
maximize
θ
E
π
θ
old
[
π
θ
(
a
∣
s
)
π
θ
old
(
a
∣
s
)
A
π
θ
old
(
s
,
a
)
]
\text{maximize}{\theta} \quad \mathbb{E}{\pi_{\theta_{\text{old}}}} \left[ \frac{\pi_{\theta}(a|s)}{\pi_{\theta_{\text{old}}}(a|s)} A^{\pi_{\theta_{\text{old}}}}(s, a) \right]
maximizeθEπθold[πθold(a∣s)πθ(a∣s)Aπθold(s,a)]
同时满足约束:
D
KL
(
π
θ
old
∥
π
θ
)
≤
δ
D_{\text{KL}}(\pi_{\theta_{\text{old}}} \| \pi_{\theta}) \leq \delta
DKL(πθold∥πθ)≤δ
其中:
•
θ
\theta
θ 是策略的参数。
•
π
θ
\pi_{\theta}
πθ是参数为
θ
\theta
θ 的策略。
•
θ
old
\theta_{\text{old}}
θold 是上次更新的策略参数。
•
A
π
θ
old
(
s
,
a
)
A^{\pi_{\theta_{\text{old}}}}(s, a)
Aπθold(s,a) 是在旧策略
π
θ
old
\pi_{\theta_{\text{old}}}
πθold 下的优势函数。
优势函数
A
π
(
s
,
a
)
=
Q
π
(
s
,
a
)
−
V
π
(
s
)
A^{\pi}(s, a) = Q^{\pi}(s, a) - V^{\pi}(s)
Aπ(s,a)=Qπ(s,a)−Vπ(s)
已知条件
s
s
s,可由policy网络得到
a
a
a
•
Q
π
(
s
,
a
Q^{\pi}(s, a
Qπ(s,a): 在策略
π
\pi
π 下,从状态 s 开始执行动作 a 并继续按照策略
π
\pi
π 采取后续行动所期望的总回报。
•
V
π
(
s
)
V^{\pi}(s)
Vπ(s): 在策略
π
\pi
π下,从状态 s 开始并按照策略
π
\pi
π 采取所有后续行动所期望的总回报。
解释:
•
Q
π
(
s
,
a
)
Q^{\pi}(s, a)
Qπ(s,a) 表示在状态 s 下选择动作 a 后,未来所有可能得到的回报的期望值。
•
V
π
(
s
)
V^{\pi}(s)
Vπ(s) 表示在状态 s 下不考虑任何特定动作的情况下,期望的回报值(即平均行为的回报值)。
所以优势函数
A
(
s
,
a
)
A(s, a)
A(s,a) 反映了选择特定动作 a 相对于平均策略所带来的增益
动作价值函数 Q π ( s , a ) Q^{\pi}(s, a) Qπ(s,a) 的计算
Q π ( s , a ) = r ( s , a ) + γ E s ′ ∼ P ( ⋅ ∣ s , a ) [ V ( s ′ ) ] Q^{\pi}(s, a) = r(s, a) + \gamma \mathbb{E}_{s{\prime} \sim P(\cdot|s, a)}[V(s{\prime})] Qπ(s,a)=r(s,a)+γEs′∼P(⋅∣s,a)[V(s′)]
- r ( s , a ) r(s,a) r(s,a)表示即时奖励,通过自己定义的reward_shaping函数得到
- 𝛾是折扣因子,0~1,用于折扣未来的回报,表示未来回报的重要性随时间衰减。
- E s ′ ∼ P ( ⋅ ∣ s , a ) [ V ( s ′ ) ] \mathbb{E}_{s{\prime} \sim P(\cdot | s, a)}[V(s{\prime})] Es′∼P(⋅∣s,a)[V(s′)], 整体表示期望,下标表示 s ′ s' s′满足一个概率分布,称为转移概率 P ( s ′ ∣ s , a ) P(s{\prime}|s, a) P(s′∣s,a) ,这个概率分布是在 s , a s,a s,a的条件下 s ′ s' s′的概率分布,该过程不通过显示的计算,而是智能体通过与环境交互采样得到的结果(说实话这里我有点模糊)
-
[
V
(
s
′
)
]
[V(s{\prime})]
[V(s′)]
- 在计算 Q(s, a) 或进行策略评估时,虽然我们知道 s ′ s{\prime} s′ 是按照某个分布生成的,但在使用 value network 时,通常是通过采样的方法来处理。例如,我们可以从 P ( s ′ ∣ s , a ) P(s{\prime}|s, a) P(s′∣s,a) 分布中采样一个具体的 s ′ s{\prime} s′ ,然后将这个采样到的状态 s ′ s{\prime} s′ 作为输入传递给 value network,计算 V ( s ′ ) V(s{\prime}) V(s′) 。
- 如果想得到更精确的期望值,可以进行多次采样,然后对这些样本的 value 进行平均。
公式就是这么多🙂↕️
PPO
目标函数:
minmize
L
P
P
O
(
θ
)
=
E
t
[
min
(
r
t
(
θ
)
A
t
,
clip
(
r
t
(
θ
)
,
1
−
ϵ
,
1
+
ϵ
)
A
t
)
]
\text{minmize}\quad L^{PPO}(\theta) = \mathbb{E}_{t} \left[ \min\left( r_t(\theta) A_t, \text{clip}(r_t(\theta), 1 - \epsilon, 1 + \epsilon) A_t \right) \right]
minmizeLPPO(θ)=Et[min(rt(θ)At,clip(rt(θ),1−ϵ,1+ϵ)At)]
r
t
(
θ
)
=
π
θ
(
a
t
∣
s
t
)
π
θ
old
(
a
t
∣
s
t
)
r_t(\theta) = \frac{\pi_\theta(a_t | s_t)}{\pi_{\theta_{\text{old}}}(a_t | s_t)}
rt(θ)=πθold(at∣st)πθ(at∣st)
就相当于原来使用了KL散度去限制了更新的幅度,现在使用了
ϵ
\epsilon
ϵ来简单的限制,如果概率比
r
t
(
θ
)
r_t(\theta)
rt(θ) 超出了
[
1
−
ϵ
,
1
+
ϵ
]
[1 - \epsilon, 1 + \epsilon]
[1−ϵ,1+ϵ] 的范围,目标函数就会被“剪切”,以防止策略更新过大。这样就解决了TRPO无法高效使用神经网络的问题,
⚠️注意:
当 ratio < 1 -
ϵ
\epsilon
ϵ 时:
• 这意味着新策略的概率比旧策略小得多(远小于 1),即在这些状态下,新策略选择的动作的概率大幅降低。
• 这里的 adv[indices] 表示的是在这些状态下采取的动作相对于平均策略的优势。如果 adv 是正值,意味着这个动作是有利的;如果是负值,意味着这个动作是不利的。
为什么选择 ratio 而不是 1 - ϵ \epsilon ϵ?
• 当 adv > 0 时:
如果 ratio 已经非常小(小于 1 - \epsilon),意味着新策略极大地降低了选择这些动作的概率。
选择 ratio 可以反映出这种概率降低的实际效果,PPO 将通过这种方式惩罚新策略,因为新策略过分偏离了旧策略的选择。
• 当 adv < 0 时:
如果 ratio 小于 1 - \epsilon,这说明新策略减少了选择不利动作的概率,这其实是有利的(因为减少了对不利动作的依赖)。
在这种情况下,选择 1 - \epsilon 作为更新值反而可能会抑制这个有利的改变。为了避免这种情况,PPO 会选择 ratio,允许新策略继续减少对这些不利动作的选择。
PPO 的设计哲学
PPO 通过 torch.min(surr1, surr2) 的设计,确保:
• 当新策略偏离旧策略过远时,裁剪操作(torch.clamp)会限制更新的幅度,避免过度更新。
• 当新策略对不利动作进行大幅调整时,允许这些调整直接反映在损失函数中,以便更快地改善策略。
最终,PPO 选择 ratio 是为了忠实地反映新策略相对于旧策略的真实变动,而裁剪操作只是作为一种保障机制,防止极端的策略更新。