1、前言
个人感觉这里讲的非常好:https://spinningup.openai.com/en/latest/algorithms/ppo.html
Proximal Policy Optimization(PPO)是 Policy Gradient 的一种变形,关于 Policy Gradient 有兴趣的同学可以去看我另一篇博:强化学习系列之Policy Gradient
首先我们需要了解两个概率:On-policy 和 Off-policy。我们知道在强化学习里面,我们要学习的就是一个 Agent 。如果我们要学习的 Agent 和与环境互动的 Agent 是同一个的话,那么这样叫做 On-policy,反之就是 Off-policy。更形象地来说,就是要学习的那个 Agent 一边与环境互动一边学习,这样就是 On-policy;如果他在旁边看别人玩,来学习的话,叫做 off-policy。
在 Policy Gradient 中,我们知道,每一次更新,我们都需要 sample 很多 data,更新后,这些 data 就没有用了,Proximal Policy Optimization就是解决的这个问题。
2、重要性采样
重要性采样是一个通用的方法,因为后面需要用到,所以在这写一下,这个我也有单独写一个博客,有兴趣的可以去看一下。
重要性采样是用一个新的采样分布来代替原有的采样分布,使得采样更加容易或高效。
E
x
∼
p
[
f
(
x
)
]
=
∫
f
(
x
)
p
(
x
)
d
x
=
∫
f
(
x
)
p
(
x
)
q
(
x
)
q
(
x
)
d
x
=
E
x
∼
q
[
f
(
x
)
p
(
x
)
q
(
x
)
]
\begin{aligned} E_{x \sim p}[f(x)] &= \int f(x)p(x)dx\\\\ &= \int f(x) \frac{p(x)}{q(x)}q(x)dx \\\\ &= E_{x \sim q}[f(x) \frac{p(x)}{q(x)}] \end{aligned}
Ex∼p[f(x)]=∫f(x)p(x)dx=∫f(x)q(x)p(x)q(x)dx=Ex∼q[f(x)q(x)p(x)]
从式子中我们可以看出,我们不直接从
p
(
x
)
p(x)
p(x) 里面采样,而是从
q
(
x
)
q(x)
q(x) 里面采样,但是由于两个分布之间有差异,所以我们乘以一个
p
(
x
)
q
(
x
)
\frac{p(x)}{q(x)}
q(x)p(x) 以消除这两个分布间的差异。
3、公式推导
在 Policy Gradient 中,我们对 Reward 的期望求梯度:
∇
R
θ
‾
=
E
τ
∼
p
θ
(
τ
)
[
R
(
τ
)
∇
log
p
θ
(
τ
)
]
\begin{aligned} \nabla \overline{R_\theta} &= E_{{\tau} \sim {p_{\theta}(\tau)}} [R(\tau) \nabla \log p_\theta (\tau)] \\\\ \end{aligned}
∇Rθ=Eτ∼pθ(τ)[R(τ)∇logpθ(τ)]
根据重要性采样变换后:
∇
R
θ
‾
=
E
τ
∼
p
θ
′
(
τ
)
[
p
θ
(
τ
)
p
θ
′
(
τ
)
R
(
τ
)
∇
log
p
θ
(
τ
)
]
\begin{aligned} \nabla \overline{R_\theta} &= E_{{\tau} \sim {p_{{\theta}'}(\tau)}} [\frac{p_{\theta}(\tau)}{p_{{\theta}'}(\tau)} R(\tau) \nabla \log p_\theta (\tau)] \\\\ \end{aligned}
∇Rθ=Eτ∼pθ′(τ)[pθ′(τ)pθ(τ)R(τ)∇logpθ(τ)]
这样做的好处就是,从
p
θ
′
p_{\theta \prime}
pθ′ 中采样的数据可以多次使用。
根据之前的 Policy Gradient 我们需要更新的梯度:
∇
R
‾
θ
=
E
(
s
t
,
a
t
)
∼
π
θ
[
A
θ
(
s
t
,
a
t
)
∇
log
p
θ
(
a
t
n
∣
s
t
n
)
]
≈
E
(
s
t
,
a
t
)
∼
π
θ
[
p
θ
(
s
t
,
a
t
)
p
θ
′
(
s
t
,
a
t
)
A
θ
′
(
s
t
,
a
t
)
∇
log
p
θ
(
a
t
n
∣
s
t
n
)
]
≈
E
(
s
t
,
a
t
)
∼
π
θ
[
p
θ
(
a
t
∣
s
t
)
p
θ
′
(
a
t
∣
s
t
)
A
θ
′
(
s
t
,
a
t
)
∇
log
p
θ
(
a
t
n
∣
s
t
n
)
]
\begin{aligned} \nabla \overline R_\theta &= E_{({s_t, a_t}) \sim \pi_\theta}[A^{\theta}(s_t, a_t) \nabla \log p_{ \theta }(a_t^n|s_t^n)] \\\\ &\approx E_{({s_t, a_t}) \sim \pi_\theta}[\frac{p_\theta (s_t, a_t)}{p_{\theta ^ \prime}(s_t, a_t)} A^{\theta \prime}(s_t, a_t) \nabla \log p_{\theta}(a_t ^n| s_t ^n)] \\\\ &\approx E_{({s_t, a_t}) \sim \pi_\theta}[\frac{p_\theta (a_t| s_t)}{p_{\theta ^ \prime}(a_t| s_t)}A^{\theta \prime}(s_t, a_t) \nabla \log p_{\theta}(a_t ^n| s_t ^n)] \end{aligned}
∇Rθ=E(st,at)∼πθ[Aθ(st,at)∇logpθ(atn∣stn)]≈E(st,at)∼πθ[pθ′(st,at)pθ(st,at)Aθ′(st,at)∇logpθ(atn∣stn)]≈E(st,at)∼πθ[pθ′(at∣st)pθ(at∣st)Aθ′(st,at)∇logpθ(atn∣stn)]
第一行到第二行的约等于是因为这时用的是与环境互动的 Agent 的奖励
A
θ
′
(
s
t
,
a
t
)
A^{\theta \prime} (s_t, a_t)
Aθ′(st,at),第二行与第三行的约等于是因为去掉了一项
p
θ
(
s
t
)
p
θ
′
(
s
t
)
\frac{p_\theta(s_t)}{p_{\theta \prime}(s_t)}
pθ′(st)pθ(st)。又因为
∇
f
(
x
)
=
f
(
x
)
∇
log
f
(
x
)
\nabla f(x) = f(x)\nabla \log f(x)
∇f(x)=f(x)∇logf(x),所以呢,我们的目标函数可以变成了:
J
θ
′
(
θ
)
=
E
(
s
t
,
a
t
)
∼
π
θ
′
[
p
θ
(
a
t
∣
s
t
)
p
θ
′
(
a
t
∣
s
t
)
A
θ
′
(
s
t
,
a
t
)
]
\begin{aligned} J^{\theta ^ \prime}(\theta) = E_{(s_t, a_t) \sim \pi_{\theta ^ \prime}}[\frac{p_{\theta}(a_t | s_t)}{p_{\theta ^ \prime}(a_t| s_t)} A ^ {\theta ^ \prime}(s_t, a_t)] \end{aligned}
Jθ′(θ)=E(st,at)∼πθ′[pθ′(at∣st)pθ(at∣st)Aθ′(st,at)]
4、Proximal Policy Optimization
在重要性采样中我们提到,两个分布不能相差太多,所以 PPO 提出了下面的公式,其中KL就是KL散度:
J
P
P
O
θ
′
=
J
θ
′
(
θ
)
−
β
K
L
(
θ
,
θ
′
)
\begin{aligned} J_{PPO}^{\theta ^ \prime} = J^{\theta ^ \prime}(\theta) - \beta KL(\theta, \theta ^ \prime) \end{aligned}
JPPOθ′=Jθ′(θ)−βKL(θ,θ′)
我们的目标函数相当于加了一个限制。
这里我们再提一下PPO的前身TRPO(Trust Region Policy Optimization):
J
T
R
P
O
θ
′
=
J
θ
′
(
θ
)
K
L
(
θ
,
θ
′
)
<
δ
J_{TRPO}^{\theta \prime} = J^{\theta ^ \prime}(\theta) \\ KL(\theta, \theta ^\prime) < \delta
JTRPOθ′=Jθ′(θ)KL(θ,θ′)<δ
这里我们可以看出来,TRPO与PPO相差不多,只是TRPO将限制条件单独写出来了(实际上这个限制很难算,而且PPO和TRPO的效果差不多,所以现在一般都用PPO)。
5、PPO升级版
直接写公式:
J
P
P
O
2
θ
k
≈
∑
s
t
,
a
t
min
(
p
θ
(
a
t
∣
s
t
)
p
θ
k
(
a
t
∣
s
t
)
,
c
l
i
p
(
p
θ
(
a
t
∣
s
t
)
p
θ
k
(
a
t
∣
s
t
)
,
1
−
ϵ
,
1
+
ϵ
)
A
θ
k
(
s
t
,
a
t
)
)
J_{PPO2}^{\theta ^k} \approx \sum_{s_t, a_t} \min(\frac{p_{\theta}(a_t|s_t)}{p_{\theta ^ k}(a_t|s_t)}, clip(\frac{p_{\theta}(a_t|s_t)}{p_{\theta ^ k}(a_t|s_t)}, 1-\epsilon, 1+ \epsilon)A^{\theta ^ k}(s_t, a_t))
JPPO2θk≈st,at∑min(pθk(at∣st)pθ(at∣st),clip(pθk(at∣st)pθ(at∣st),1−ϵ,1+ϵ)Aθk(st,at))
这个式子看着复杂,其实捋一捋并不会很复杂。