基于策略的强化学习就是最大化平均收益 R ˉ \bar{R} Rˉ,公式如下:
R
ˉ
=
∑
τ
P
θ
(
τ
)
R
(
τ
)
\bar{R}=\sum_\tau P_{\theta}(\tau)R(\tau)
Rˉ=τ∑Pθ(τ)R(τ)
其中,
τ
\tau
τ为一个episode,可以写成{
s
1
,
a
1
,
r
1
,
…
,
s
H
,
a
H
,
r
H
s_1,a_1,r_1,\dots,s_H,a_H,r_H
s1,a1,r1,…,sH,aH,rH}。
P
θ
(
τ
)
P_{\theta}(\tau)
Pθ(τ)为
τ
\tau
τ出现的概率,与参数
θ
\theta
θ有关,
R
(
τ
)
R(\tau)
R(τ)为episode
τ
\tau
τ收益。
我们使用梯度上升求解,即:
θ
←
θ
+
η
▽
θ
R
ˉ
\theta\leftarrow\theta+\eta\bigtriangledown_{\theta}\bar{R}
θ←θ+η▽θRˉ
首先对
R
ˉ
\bar{R}
Rˉ关于
θ
\theta
θ求导:
▽
θ
R
ˉ
=
∑
τ
▽
θ
P
θ
(
τ
)
R
(
τ
)
=
∑
τ
R
(
τ
)
P
θ
(
τ
)
▽
θ
log
P
θ
(
τ
)
=
E
τ
∼
P
θ
(
τ
)
[
R
(
τ
)
▽
θ
log
P
θ
(
τ
)
]
≈
1
N
∑
τ
R
(
τ
)
▽
θ
log
P
θ
(
τ
)
\begin{aligned} \bigtriangledown_{\theta}\bar{R}&=\sum_\tau \bigtriangledown_{\theta}P_{\theta}(\tau)R(\tau)\\ &=\sum_\tau R(\tau)P_{\theta}(\tau)\bigtriangledown_{\theta}\log P_{\theta}(\tau)\\ &=E_{\tau\sim P_{\theta}(\tau)}\left[R(\tau)\bigtriangledown_{\theta}\log P_{\theta}(\tau)\right]\\ &\approx \frac{1}{N}\sum_{\tau} R(\tau)\bigtriangledown_{\theta}\log P_{\theta}(\tau) \end{aligned}
▽θRˉ=τ∑▽θPθ(τ)R(τ)=τ∑R(τ)Pθ(τ)▽θlogPθ(τ)=Eτ∼Pθ(τ)[R(τ)▽θlogPθ(τ)]≈N1τ∑R(τ)▽θlogPθ(τ)
其中,
P
θ
(
τ
)
P_{\theta}(\tau)
Pθ(τ)公式如下:
P
θ
=
P
(
s
1
)
∏
t
=
1
H
π
θ
(
a
t
∣
s
t
)
P
(
s
t
+
1
∣
s
t
,
a
t
)
\begin{aligned} P_{\theta}=P(s_1)\prod_{t=1}^{H}\pi_{\theta}(a_t|s_t)P(s_{t+1}|s_t,a_t) \end{aligned}
Pθ=P(s1)t=1∏Hπθ(at∣st)P(st+1∣st,at)
所以,
▽
θ
log
P
θ
(
τ
)
=
∑
t
=
1
H
▽
θ
log
π
θ
(
a
t
∣
s
t
)
\bigtriangledown_{\theta}\log P_{\theta}(\tau)=\sum_{t=1}^{H}\bigtriangledown_{\theta}\log \pi_{\theta}(a_t|s_t)
▽θlogPθ(τ)=t=1∑H▽θlogπθ(at∣st)
代入上式得:
▽
θ
R
ˉ
≈
1
N
∑
τ
R
(
τ
)
∑
t
=
1
H
▽
θ
log
π
θ
(
a
t
∣
s
t
)
\bigtriangledown_{\theta}\bar{R}\approx \frac{1}{N}\sum_{\tau} R(\tau)\sum_{t=1}^{H}\bigtriangledown_{\theta}\log \pi_{\theta}(a_t|s_t)
▽θRˉ≈N1τ∑R(τ)t=1∑H▽θlogπθ(at∣st)
将我们的数据代入上式就可以得到
▽
θ
R
ˉ
\bigtriangledown_{\theta}\bar{R}
▽θRˉ,然后更新参数
θ
\theta
θ。
但是,这个流程是采样一批数据更新一下参数,再采样一批更新一下,每批数据利用一次,效率很低下,所以在PPO中用到了off-policy,即采样时的策略和更新的策略不是同一策略,其中用到重要性采样,这个不会的可以百度一下吧,我这边直接给出推导。
假设当前策略为 θ \theta θ,我们的数据是由 θ o l d \theta_{old} θold产生的。
刚刚我们得到:
▽
θ
R
ˉ
=
∑
τ
R
(
τ
)
P
θ
(
τ
)
▽
θ
log
P
θ
(
τ
)
=
∑
τ
R
(
τ
)
P
θ
o
l
d
(
τ
)
P
θ
(
τ
)
▽
θ
log
P
θ
(
τ
)
P
θ
o
l
d
(
τ
)
=
∑
τ
R
(
τ
)
P
θ
o
l
d
(
τ
)
▽
θ
P
θ
(
τ
)
P
θ
o
l
d
(
τ
)
\begin{aligned} \bigtriangledown_{\theta}\bar{R}&=\sum_\tau R(\tau)P_{\theta}(\tau)\bigtriangledown_{\theta}\log P_{\theta}(\tau)\\ &=\sum_\tau R(\tau)P_{\theta_{old}}(\tau)\frac{P_{\theta}(\tau)\bigtriangledown_{\theta}\log P_{\theta}(\tau)}{P_{\theta_{old}}(\tau)} \\ &=\sum_\tau R(\tau)P_{\theta_{old}}(\tau)\frac{\bigtriangledown_{\theta} P_{\theta}(\tau)}{P_{\theta_{old}}(\tau)} \end{aligned}
▽θRˉ=τ∑R(τ)Pθ(τ)▽θlogPθ(τ)=τ∑R(τ)Pθold(τ)Pθold(τ)Pθ(τ)▽θlogPθ(τ)=τ∑R(τ)Pθold(τ)Pθold(τ)▽θPθ(τ)
那么,
R
ˉ
=
∑
τ
R
(
τ
)
P
θ
o
l
d
(
τ
)
P
θ
(
τ
)
P
θ
o
l
d
(
τ
)
=
E
τ
∼
P
θ
o
l
d
(
τ
)
[
R
(
τ
)
P
θ
(
τ
)
P
θ
o
l
d
(
τ
)
]
≈
1
N
∑
τ
R
(
τ
)
P
θ
(
τ
)
P
θ
o
l
d
(
τ
)
\begin{aligned} \bar{R}&=\sum_\tau R(\tau)P_{\theta_{old}}(\tau)\frac{P_{\theta}(\tau)}{P_{\theta_{old}}(\tau)}\\ &=E_{\tau\sim P_{\theta_{old}}(\tau)}\left[\frac{R(\tau)P_{\theta}(\tau)}{P_{\theta_{old}}(\tau)}\right]\\ &\approx \frac{1}{N}\sum_{\tau}\frac{R(\tau)P_{\theta}(\tau)}{P_{\theta_{old}}(\tau)} \end{aligned}
Rˉ=τ∑R(τ)Pθold(τ)Pθold(τ)Pθ(τ)=Eτ∼Pθold(τ)[Pθold(τ)R(τ)Pθ(τ)]≈N1τ∑Pθold(τ)R(τ)Pθ(τ)
当然,
θ
o
l
d
\theta_{old}
θold和
θ
\theta
θ也不能差太多,所以PPO算法实现的时候会考虑两个概率分布的相对熵或者考虑截断,如图,
其中,
J
θ
k
(
θ
)
J^{\theta^k}(\theta)
Jθk(θ)就是我们这边的
R
ˉ
\bar{R}
Rˉ。最大化这个就可以得到
θ
\theta
θ的更新。
此外,PPO算法还考虑基线和折扣因子,这都是对我们公式中 R ( τ ) R(\tau) R(τ)进行改写的。这两个trick比较简单,我太懒了,不想写了,就到这儿吧。
代码可以参考这个。