对于经典的policy gradient,当我们的agent和环境交互之后要进行policy model的更新,对于一个episode只能更新一次,更新后就要重新采集数据,然后再更新。
因此我们想要off-policy,用另外一个policy,另外一个actor θ ′ \theta' θ′与环境交互,用 θ ′ \theta' θ′收集的数据训练 θ \theta θ。
On-Policy:要训练的agent和与环境交互的agent是同一个,此时的policy.
Off-Policy:要训练的agent和与环境交互的agent不是是同一个的policy.
重要性采样(Importance Sampling):从另一个分布中采样从而逼近所求分布。
从q分布中采样,求p的期望可以通过如下方法:
∫
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
)
]
\int f(x)p(x)dx=\int f(x)\frac{p(x)}{q(x)}q(x)dx=E_{x \sim q}[f(x)\underset {}{\frac{p(x)}{q(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
)
q
(
x
)
\frac{p(x)}{q(x)}
q(x)p(x)是重要性权重,相当于做了一个分布差异的修正。理论上
q
(
x
)
q(x)
q(x)可以是任意分布,但在实际上p和q不能差太多。因为两个随机变量的期望相同不代表它们的方差也相同。
V
a
r
x
∼
p
[
f
(
x
)
]
=
E
x
∼
p
[
f
(
x
)
2
]
−
(
E
x
∼
!
[
请
添
加
图
片
描
述
]
(
h
t
t
p
s
:
/
/
i
m
g
−
b
l
o
g
.
c
s
d
n
i
m
g
.
c
n
/
09997
d
816
f
1
f
49398
c
55
a
a
105
c
83
f
4
e
e
.
p
n
g
)
p
[
f
(
x
)
]
)
2
V
a
r
x
∼
q
[
f
(
x
)
p
(
x
)
q
(
x
)
]
=
E
x
∼
q
[
f
(
x
)
2
p
(
x
)
q
(
x
)
]
−
(
E
x
∼
q
[
f
(
x
)
]
)
2
Var_{x\sim p}[f(x)]=E_{x\sim p}[f(x)^2]-(E_{x\sim ![请添加图片描述](https://img-blog.csdnimg.cn/09997d816f1f49398c55aa105c83f4ee.png) p}[f(x)])^2 \\Var_{x\sim q}[f(x)\frac{p(x)}{q(x)}]=E_{x\sim q}[f(x)^2 \frac{p(x)}{q(x)}]-(E_{x\sim q}[f(x)])^2
Varx∼p[f(x)]=Ex∼p[f(x)2]−(Ex∼![请添加图片描述](https://img−blog.csdnimg.cn/09997d816f1f49398c55aa105c83f4ee.png)p[f(x)])2Varx∼q[f(x)q(x)p(x)]=Ex∼q[f(x)2q(x)p(x)]−(Ex∼q[f(x)])2
如果
p
(
x
)
,
q
(
x
)
p(x),q(x)
p(x),q(x)差异过大,方差就会差很多。
从第一个等式到第二个等式利用了重要性采样原理,第二等式到第三个等式利用了条件概率。第三个等式中
p
θ
(
s
t
)
p_\theta(s_t)
pθ(st)和
p
θ
′
(
s
t
)
p_{\theta '}(s_t)
pθ′(st)可以假设是差不多的,因为
p
θ
(
s
t
)
p_\theta(s_t)
pθ(st)很难算,用
θ
\theta
θ去跟环境做互动,算
s
t
s_t
st出现的概率,尤其是图片,同样的
s
t
s_t
st不会出现第二次,无法估算这一项因此无视这个问题。
但
p
θ
(
a
t
∣
s
t
)
p_\theta(a_t|s_t)
pθ(at∣st)很好算,
θ
\theta
θ是一个网络,把
s
t
s_t
st代进去,就会告诉某个状态的
a
t
a_t
at概率是多少。
利用右上角蓝色方框内的公式,就能够反推原函数
J
θ
′
(
θ
)
=
E
(
s
t
,
a
t
)
∼
π
θ
′
[
p
θ
(
a
t
∣
s
t
)
p
θ
′
(
a
t
∣
s
t
)
A
θ
′
(
s
t
,
a
t
)
]
J^{\theta'}(\theta)=E_{(s_t,a_t)\sim \pi _{\theta'}}[\frac{p_\theta(a_t|s_t)}{p_{\theta'}(a_t|s_t)}A^{\theta'}(s_t,a_t)]
Jθ′(θ)=E(st,at)∼πθ′[pθ′(at∣st)pθ(at∣st)Aθ′(st,at)]
我们已经通过重要性采样把on-policy转换成off-policy,但重要性采样有一个问题:若 p θ ( a t ∣ s t ) p_\theta(a_t|s_t) pθ(at∣st)和 p θ ′ ( a t ∣ s t ) p_{\theta'}(a_t|s_t) pθ′(at∣st)相差太多,重要性采样的结果就会不怎么好。这就是PPO在做的事情。
在训练的时候增加一个约束,这个约束是限制 θ \theta θ和 θ ′ \theta' θ′输出的动作KL散度。这里并不是指参数上的距离,而是衡量它们动作上的距离。
PPO的前身是TRPO信任区域策略优化,TRPO式子:
J
T
R
P
O
θ
′
=
E
(
s
t
,
a
t
)
∼
π
θ
′
[
p
θ
(
a
t
∣
s
t
)
p
θ
′
(
a
t
∣
s
t
)
A
θ
′
(
s
t
,
a
t
)
]
K
L
(
θ
,
θ
′
)
<
δ
J^{\theta'}_{TRPO}=E_{(s_t,a_t)\sim \pi _{\theta'}}[\frac{p_\theta(a_t|s_t)}{p_{\theta'}(a_t|s_t)}A^{\theta'}(s_t,a_t)] \\ KL(\theta,\theta')<\delta
JTRPOθ′=E(st,at)∼πθ′[pθ′(at∣st)pθ(at∣st)Aθ′(st,at)]KL(θ,θ′)<δ
PPO的式子是:
J
P
P
O
θ
′
=
J
θ
′
(
θ
)
−
β
K
L
(
θ
,
θ
′
)
J
θ
′
(
θ
)
=
E
(
s
t
,
a
t
)
∼
π
θ
′
[
p
θ
(
a
t
∣
s
t
)
p
θ
′
(
a
t
∣
s
t
)
A
θ
′
(
s
t
,
a
t
)
]
J^{\theta'}_{PPO}=J^{\theta'}(\theta)-\beta KL(\theta,\theta') \\ J^{\theta'}(\theta)=E_{(s_t,a_t)\sim \pi _{\theta'}}[\frac{p_\theta(a_t|s_t)}{p_{\theta'}(a_t|s_t)}A^{\theta'}(s_t,a_t)]
JPPOθ′=Jθ′(θ)−βKL(θ,θ′)Jθ′(θ)=E(st,at)∼πθ′[pθ′(at∣st)pθ(at∣st)Aθ′(st,at)]
所以两者的区别是,TRPO在求解时KL作为约束,PPO将约束放在式子里。在基于梯度的优化时,有约束很难处理,因此两者的效率差不多,但PPO更容易求解。
PPO算法有两个主要的变种:PPO-Penalty和PPO-Clip。
J
P
P
O
θ
′
=
J
θ
′
(
θ
)
−
β
K
L
(
θ
,
θ
′
)
i
f
K
L
(
θ
,
θ
′
)
>
K
L
m
a
x
,
i
n
c
r
e
a
s
e
β
i
f
K
L
(
θ
,
θ
′
)
<
K
L
m
a
x
,
d
e
c
r
e
a
s
e
β
J^{\theta'}_{PPO}=J^{\theta'}(\theta)-\beta KL(\theta,\theta')\\ if KL(\theta,\theta')>KL_{max},increase \beta\\ if KL(\theta,\theta')<KL_{max},decrease \beta
JPPOθ′=Jθ′(θ)−βKL(θ,θ′)ifKL(θ,θ′)>KLmax,increaseβifKL(θ,θ′)<KLmax,decreaseβ
β
\beta
β是一个自适应调整的权重。当KL过大,增加惩罚;当KL小于能够接受的最大值,减小惩罚项。
PPO2没有较复杂的KL散度。PPO2要最大化的目标函数如下所示:
J
P
P
O
2
θ
k
(
θ
)
=
∑
(
a
t
,
s
t
)
m
i
n
(
p
θ
(
a
t
∣
s
t
)
p
θ
k
(
a
t
∣
s
t
)
A
θ
k
(
s
t
,
a
t
)
,
c
l
i
p
(
p
θ
(
a
t
∣
s
t
)
p
θ
k
(
a
t
∣
s
t
)
,
1
−
ϵ
,
1
+
ϵ
)
)
J^{\theta^k}_{PPO2}(\theta)=\sum_{(a_t,s_t)}min(\frac{p_\theta(a_t|s_t)}{p_{\theta^k}(a_t|s_t)}A^{\theta^k}(s_t,a_t),clip(\frac{p_\theta(a_t|s_t)}{p_{\theta^k}(a_t|s_t)},1-\epsilon,1+\epsilon))
JPPO2θk(θ)=(at,st)∑min(pθk(at∣st)pθ(at∣st)Aθk(st,at),clip(pθk(at∣st)pθ(at∣st),1−ϵ,1+ϵ))
接下来看一下clip函数算出来究竟是神马形状。
那么,PPO2是如何实现减小
p
θ
(
a
t
∣
s
t
)
p_\theta(a_t|s_t)
pθ(at∣st)和
p
θ
′
(
a
t
∣
s
t
)
p_{\theta'}(a_t|s_t)
pθ′(at∣st)的差异的呢?
A>0时,取蓝线和绿线中最小的,就是红色线。A>0说明
(
s
t
,
a
t
)
(s_t,a_t)
(st,at)是相对较好的,因此我们希望尽可能提升
p
θ
(
a
t
∣
s
t
)
p_\theta(a_t|s_t)
pθ(at∣st),但为了减小
p
θ
(
a
t
∣
s
t
)
p_\theta(a_t|s_t)
pθ(at∣st)和
p
θ
′
(
a
t
∣
s
t
)
p_{\theta'}(a_t|s_t)
pθ′(at∣st)的差异,训练到
p
θ
(
a
t
∣
s
t
)
p
θ
′
(
a
t
∣
s
t
)
\frac{p_\theta(a_t|s_t)}{p_{\theta'}(a_t|s_t)}
pθ′(at∣st)pθ(at∣st)大到
1
+
ϵ
1+\epsilon
1+ϵ就停止了。
A<0时,为了min,我们需要取蓝线和绿线中最大的,即红色线。A<0说明
(
s
t
,
a
t
)
(s_t,a_t)
(st,at)是相对较差的,因此我们希望尽可能减小
p
θ
(
a
t
∣
s
t
)
p_\theta(a_t|s_t)
pθ(at∣st),但为了减小
p
θ
(
a
t
∣
s
t
)
p_\theta(a_t|s_t)
pθ(at∣st)和
p
θ
′
(
a
t
∣
s
t
)
p_{\theta'}(a_t|s_t)
pθ′(at∣st)的差异,训练到
p
θ
(
a
t
∣
s
t
)
p
θ
′
(
a
t
∣
s
t
)
\frac{p_\theta(a_t|s_t)}{p_{\theta'}(a_t|s_t)}
pθ′(at∣st)pθ(at∣st)小到
1
−
ϵ
1-\epsilon
1−ϵ就停止了。