Zee带你看代码系列
学习强化学习,码代码的能力必须要出众,要快速入门强化学习 搞清楚其中真正的原理,读源码是一个最简单的最直接的方式。最近创建了一系列该类型文章,希望对大家有多帮助。
传送门
另外,我会将所有的文章及所做的一些简单项目,放在我的个人网页上。
水平有限,可能有理解不到位的地方,希望大家主动沟通交流。
邮箱:zachary2wave@163.com
Thanks for reading, and enjoy yourself。
OPENAI-Baeslines-PPO
2017年 OpenAI 和 Deep Mind先后推出了TRPO和PPO算法,该算法通过限制了new policy和 Old policy之间的KL散度大小(Kullback-Leibler Divergence,KLD),从而解决学习率过大引起不收敛的问题。
基本原理
TRPO
基于策略的强化学习的主要目标是找到一个“ 可以让带有折扣的未来期望的收益达到最大 ” 的策略。带有折扣的未来期望的收益可以表示为:
η
(
π
)
=
E
s
0
,
a
0
,
…
[
∑
t
=
0
∞
γ
t
r
(
s
t
)
]
\eta(\pi)=\mathbb{E}_{s_{0}, a_{0}, \ldots}\left[\sum_{t=0}^{\infty} \gamma^{t} r\left(s_{t}\right)\right]
η(π)=Es0,a0,…[t=0∑∞γtr(st)]
TRPO的主要想法就是在每一步更新的策略的时候,新的策略都要比老的策略好。那么新旧策略之间的期望收益差可以表示为:
η
(
π
~
)
=
η
(
π
)
+
E
τ
∼
π
~
[
∑
t
=
0
∞
γ
t
A
π
(
s
t
,
a
t
)
]
⎵
p
o
l
i
c
y
g
a
p
\eta (\tilde \pi ) = \eta (\pi ) +\mathbb{E} \underbrace {{_{{\tau\sim\tilde \pi }}}\left[ {\sum\limits_{t = 0}^\infty {{\gamma ^t}} {A_\pi }\left( {{s_t},{a_t}} \right)} \right]}_{{\rm{policy \quad gap}}}
η(π~)=η(π)+Epolicygap
τ∼π~[t=0∑∞γtAπ(st,at)]
Policy gap 是老策略的优势函数(advantage function)在新策略采样轨迹下的期望值。(2)式可以进一步表示为:
η
(
π
~
)
=
η
(
π
)
+
∑
t
=
0
∞
∑
s
P
(
s
t
=
s
∣
π
~
)
∑
a
π
~
(
a
∣
s
)
γ
t
A
π
(
s
,
a
)
=
η
(
π
)
+
∑
s
∑
t
=
0
∞
γ
t
P
(
s
t
=
s
∣
π
~
)
∑
a
π
~
(
a
∣
s
)
A
π
(
s
,
a
)
=
η
(
π
)
+
∑
s
ρ
π
~
(
s
)
∑
a
π
~
(
a
∣
s
)
A
π
(
s
,
a
)
\begin{aligned} \eta(\tilde{\pi}) &=\eta(\pi)+\sum_{t=0}^{\infty} \sum_{s} P\left(s_{t}=s | \tilde{\pi}\right) \sum_{a} \tilde{\pi}(a | s) \gamma^{t} A_{\pi}(s, a) \\&=\eta(\pi)+\sum_{s} \sum_{t=0}^{\infty} \gamma^{t} P\left(s_{t}=s | \tilde{\pi}\right) \sum_{a} \tilde{\pi}(a | s) A_{\pi}(s, a) \\ &=\eta(\pi)+\sum_{s} \rho_{\tilde{\pi}}(s) \sum_{a} \tilde{\pi}(a | s) A_{\pi}(s, a) \end{aligned}
η(π~)=η(π)+t=0∑∞s∑P(st=s∣π~)a∑π~(a∣s)γtAπ(s,a)=η(π)+s∑t=0∑∞γtP(st=s∣π~)a∑π~(a∣s)Aπ(s,a)=η(π)+s∑ρπ~(s)a∑π~(a∣s)Aπ(s,a)
在上面的等式中,
ρ
π
~
(
s
)
=
∑
t
=
0
∞
γ
t
P
(
s
t
=
s
∣
π
~
)
\rho_{\tilde{\pi}}(s) =\sum_{t=0}^{\infty} \gamma^{t} P\left(s_{t}=s | \tilde{\pi}\right)
ρπ~(s)=∑t=0∞γtP(st=s∣π~) 表示在新策略
π
~
\tilde{\pi}
π~ 下状态
s
t
s_t
st的带有折扣因子的概率。当没有得到新策略的时候,该式是非常难以求得的。 如果采用老策略的$\rho_{\pi}(s) $ 来近似,则可以得到下式:
L
π
(
π
~
)
=
η
(
π
)
+
∑
s
ρ
π
(
s
)
∑
a
π
~
(
a
∣
s
)
A
π
(
s
,
a
)
L_{\pi}(\tilde{\pi})=\eta(\pi)+\sum_{s} \rho_{\pi}(s) \sum_{a} \tilde{\pi}(a | s) A_{\pi}(s, a)
Lπ(π~)=η(π)+s∑ρπ(s)a∑π~(a∣s)Aπ(s,a)
但是这里必须考虑到的是,新策略与老策略的差距非常小的时候,才有
L
π
(
π
~
)
≈
η
(
π
~
)
L_{\pi}(\tilde{\pi})\approx \eta(\tilde{\pi})
Lπ(π~)≈η(π~)。
如果,采用如下的方式来跟新策略:
π
n
e
w
(
a
∣
s
)
=
(
1
−
α
)
π
o
l
d
(
a
∣
s
)
+
α
π
′
(
a
∣
s
)
\pi_{\mathrm{new}}(a | s)=(1-\alpha) \pi_{\mathrm{old}}(a | s)+\alpha \pi^{\prime}(a | s)
πnew(a∣s)=(1−α)πold(a∣s)+απ′(a∣s)
那么
L
π
(
π
~
)
L_{\pi}(\tilde{\pi})
Lπ(π~) 和
η
(
π
~
)
\eta(\tilde{\pi})
η(π~) 之间的关系可以表示为:
η
(
π
new
)
≥
L
π
old
(
π
new
)
−
2
ϵ
γ
(
1
−
γ
)
2
α
2
\eta\left(\pi_{\text { new }}\right) \geq L_{\pi_{\text { old }}}\left(\pi_{\text { new }}\right)-\frac{2 \epsilon \gamma}{(1-\gamma)^{2}} \alpha^{2}
η(π new )≥Lπ old (π new )−(1−γ)22ϵγα2
其中,$
\epsilon=\max {s}\left|\mathbb{E}{a \sim \pi^{\prime}(a | s)}\left[A_{\pi}(s, a)\right]\right|
$,需要被注意的是,这里
α
\alpha
α代表了步进的大小。如果采用从方差散度(total variation divergence,
D
T
V
(
p
∥
q
)
=
1
2
∑
i
∣
p
i
−
q
i
∣
D_{T V}(p \| q)=\frac{1}{2} \sum_{i}\left|p_{i}-q_{i}\right|
DTV(p∥q)=21∑i∣pi−qi∣)的方式来衡量新旧策略的不同时,
α
\alpha
α可以表示为
α
=
D
T
V
max
(
π
,
π
~
)
=
max
s
D
T
V
(
π
(
⋅
∣
s
)
∥
π
~
(
⋅
∣
s
)
)
\alpha = D_{\mathrm{TV}}^{\max }(\pi, \tilde{\pi})=\max _{s} D_{T V}(\pi(\cdot | s) \| \tilde{\pi}(\cdot | s))
α=DTVmax(π,π~)=smaxDTV(π(⋅∣s)∥π~(⋅∣s))
公式(5)就可以表示为:
η
(
π
new
)
≥
L
π
old
(
π
new
)
−
4
ϵ
γ
(
1
−
γ
)
2
α
2
\eta\left(\pi_{\text { new }}\right) \geq L_{\pi_{\text { old }}}\left(\pi_{\text { new }}\right)-\frac{4 \epsilon \gamma}{(1-\gamma)^{2}} \alpha^{2}
η(π new )≥Lπ old (π new )−(1−γ)24ϵγα2
其中,
ϵ
=
max
s
,
a
∣
A
π
(
s
,
a
)
∣
\epsilon=\max _{s, a}\left|A_{\pi}(s, a)\right|
ϵ=maxs,a∣Aπ(s,a)∣。根据
D
T
V
(
p
∥
q
)
2
≤
D
K
L
(
p
∥
q
)
D_{T V}(p \| q)^{2} \leq D_{K L}(p \| q)
DTV(p∥q)2≤DKL(p∥q),将TV散度更换成KL散度的关系,这是由于将KL散度将更利于求解高斯分布等模型。 这样式(7)可以写成:
η
(
π
~
)
≥
L
π
(
π
~
)
−
C
D
K
L
max
(
π
,
π
~
)
where
C
=
4
ϵ
γ
(
1
−
γ
)
2
\begin{aligned} \eta(\tilde{\pi}) & \geq L_{\pi}(\tilde{\pi})-C D_{\mathrm{KL}}^{\max }(\pi, \tilde{\pi}) \\ & \text { where } C=\frac{4 \epsilon \gamma}{(1-\gamma)^{2}} \end{aligned}
η(π~)≥Lπ(π~)−CDKLmax(π,π~) where C=(1−γ)24ϵγ
在上式中,如果新策略等于旧策略,那么不等式变为等式,所以如果我们在每一次更新迭代的时候,都使得下届最大化而求得的新策略
π
~
\tilde{\pi}
π~,就一定是一个比旧策略更好的策略。这样,策略寻找问题变化成一个最优化问题,即:
maximize
L
θ
old
(
θ
)
subject to
D
K
L
max
(
θ
old
,
θ
)
≤
δ
\begin{array}{l}{\text { maximize } \quad L_{\theta_{\text { old }}}(\theta)} \\ {\text { subject to } \quad D_{\mathrm{KL}}^{\max }\left(\theta_{\text { old }}, \theta\right) \leq \delta}\end{array}
maximize Lθ old (θ) subject to DKLmax(θ old ,θ)≤δ
有5个方法化简该问题:
- 从公式3中可以看出 L θ old ( θ ) L_{\theta_{\text { old }}}(\theta) Lθ old (θ),中包含较多常数项 η ( π ) \eta(\pi) η(π)。 同时,化简后面的advantage function可以得到:
∑ a π ~ θ ( a ∣ s ) A θ o l d = ∑ a π ~ θ ( a ∣ s ) ( Q θ o l d ( s , a ) − V θ o l d ( s ) ) = ∑ a π ~ θ ( a ∣ s ) Q θ o l d ( s , a ) − V θ o l d \sum_{a} \tilde{\pi}_{\theta}(a | s) A_{\theta_{o l d}}=\sum_{a} \tilde{\pi}_{\theta}(a | s)\left(Q_{\theta_{o l d}}(s, a)-V_{\theta_{o l d}}(s)\right)=\sum_{a} \tilde{\pi}_{\theta}(a | s) Q_{\theta_{o l d}}(s, a)-V_{\theta_{o l d}} a∑π~θ(a∣s)Aθold=a∑π~θ(a∣s)(Qθold(s,a)−Vθold(s))=a∑π~θ(a∣s)Qθold(s,a)−Vθold
上式中的 V o l d V_{old} Vold 也是常数,所以直接最小化 ∑ a π ~ θ ( a ∣ s ) Q θ o l d ( s , a ) \sum_{a}\tilde{\pi}_{\theta}(a | s) Q_{\theta_{o l d}}(s, a) ∑aπ~θ(a∣s)Qθold(s,a)即可。
-
对目标函数中的状态概率求和项 ,用期望来表示,即 ∑ s ρ π ( s ) \sum_{s} \rho_{\pi}(s) ∑sρπ(s) 代替为 E s ∼ ρ \mathbb{E}_{s \sim \rho} Es∼ρ.
-
对目标函数中的状态概率求和项 ,用期望来表示,即 ∑ a π ~ θ ( a ∣ s ) Q θ o l d ( s , a ) \sum_{a} \tilde{\pi}_{\theta}(a | s) Q_{\theta_{o l d}}(s, a) ∑aπ~θ(a∣s)Qθold(s,a) 代替为 E a ∼ π ~ θ \mathbb{E}_{a \sim \tilde{\pi}_{\theta}} Ea∼π~θ.
-
现实中无法得到根据新的策略采样得到 ∑ a π ~ θ ( a ∣ s ) A θ o l d \sum_{a} \tilde{\pi}_{\theta}(a | s) A_{\theta_{o l d}} ∑aπ~θ(a∣s)Aθold,所以利用 the importance sampling ,可以表示为:
E a ∼ π ~ ( θ ) [ f ( θ ) ] = ∫ π ~ ( θ ) f ( θ ) d θ = ∫ q ( θ ) q ( θ ) π ~ ( θ ) f ( θ ) d θ = ∫ q ( θ ) π ~ ( θ ) q ( θ ) f ( θ ) d θ = E a ∼ q ( θ ) [ π ~ ( θ ) q ( θ ) f ( θ ) ] \begin{aligned} E_{a \sim \tilde{\pi}(\theta)}[f(\theta)] &=\int \tilde{\pi}(\theta) f(\theta) d \theta \\ &=\int \frac{q(\theta)}{q(\theta)} \tilde{\pi}(\theta) f(\theta) d \theta \\ &=\int q(\theta) \frac{\tilde{\pi}(\theta)}{q(\theta)} f(\theta) d \theta \\ &=E_{a \sim q(\theta)}\left[\frac{\tilde{\pi}(\theta)}{q(\theta)} f(\theta)\right] \end{aligned} Ea∼π~(θ)[f(θ)]=∫π~(θ)f(θ)dθ=∫q(θ)q(θ)π~(θ)f(θ)dθ=∫q(θ)q(θ)π~(θ)f(θ)dθ=Ea∼q(θ)[q(θ)π~(θ)f(θ)]
利用旧策略的采样 来完成新策略的估计。 -
约束条件中,KL散度约束在每一个状态s上,所以很难求得,所以最好的方法是利用平均,即:
D ‾ K L ρ ( θ 1 , θ 2 ) : = E s ∼ ρ [ D K L ( π θ 1 ( ⋅ ∣ s ) ∥ π θ 2 ( ⋅ ∣ s ) ) ] \overline{D}_{\mathrm{KL}}^{\rho}\left(\theta_{1}, \theta_{2}\right) :=\mathbb{E}_{s \sim \rho}\left[D_{\mathrm{KL}}\left(\pi_{\theta_{1}}(\cdot | s) \| \pi_{\theta_{2}}(\cdot | s)\right)\right] DKLρ(θ1,θ2):=Es∼ρ[DKL(πθ1(⋅∣s)∥πθ2(⋅∣s))]
最后最优问题化简为:
maximize
E
s
∼
ρ
old
,
a
∼
π
(
θ
old
)
[
π
~
(
θ
)
π
(
θ
old
)
Q
θ
old
(
s
,
a
)
]
subject to
E
s
∼
ρ
θ
old
[
D
‾
K
L
(
π
θ
old
(
⋅
∣
s
)
∥
π
~
θ
(
⋅
∣
s
)
)
]
≤
δ
\begin{array}{l}{\text { maximize } \mathbb{E}_{s \sim \rho_{\text { old }}, a \sim \pi(\theta_{\text { old }})}\left[\frac{\tilde{\pi}(\theta)}{{\pi(\theta_{\text { old }})}} Q_{\theta_{\text { old }}}(s, a)\right]} \\ {\text { subject to } \mathbb{E}_{s \sim \rho_{\theta_{\text { old }}}}\left[\overline{D}_{\mathrm{KL}}\left(\pi_{\theta_{\text { old }}}(\cdot | s) \| \tilde{\pi}_{\theta}(\cdot | s)\right)\right] \leq \delta}\end{array}
maximize Es∼ρ old ,a∼π(θ old )[π(θ old )π~(θ)Qθ old (s,a)] subject to Es∼ρθ old [DKL(πθ old (⋅∣s)∥π~θ(⋅∣s))]≤δ
为了求解上面的最优化问题,我们必须知道
Q
θ
old
(
s
,
a
)
Q_{\theta_{\text { old }}}(s, a)
Qθ old (s,a) and
π
(
θ
old
)
{\pi}(\theta_{\text { old }})
π(θ old )。文中给出了2中方法来估计
Q
Q
Q
第一种方法single path就是,在 π ( θ old ) {\pi}(\theta_{\text { old }}) π(θ old )下直接找出许多条轨迹 然后求解,直接平均估计每一个状态的 Q θ old ( s , a ) Q_{\theta_{\text { old }}}(s, a) Qθ old (s,a)求解。第二种办法vine是,找一个状态,在该状态下求n次 找到估计 Q θ old ( s , a ) Q_{\theta_{\text { old }}}(s, a) Qθ old (s,a)。
解式(11)的最优化问题, 可以分为两步
1、 更新方向的选择,利用一阶模型近似约束条件和目标方程:
- 目标方程部分:
让目标方程转化为一阶近似,令
A ‾ ( θ ′ ) = E s ∼ ρ old , a ∼ π ( θ old ) [ π ~ ( θ ) π ( θ old ) Q θ old ( s , a ) ] \overline{A}(\theta')=\mathbb{E}_{s \sim \rho_{\text { old }}, a \sim \pi(\theta_{\text { old }})}\left[\frac{\tilde{\pi}(\theta)}{{\pi(\theta_{\text { old }})}} Q_{\theta_{\text { old }}}(s, a)\right] A(θ′)=Es∼ρ old ,a∼π(θ old )[π(θ old )π~(θ)Qθ old (s,a)]
那么 A ‾ ( θ ′ ) \overline{A}(\theta') A(θ′)一阶线性近似是 $ \nabla_{\theta} \overline{A}(\theta){T}\left(\theta{\prime}-\theta\right) , 其 中 , 其中 ,其中\theta’$ 是下一步的策略参数, θ \theta θ 是现在的策略参数。
- 约束条件部分:
KL散度的二阶近似为:
D
‾
K
L
(
θ
o
l
d
,
θ
)
≈
1
2
(
θ
−
θ
o
l
d
)
T
A
(
θ
−
θ
o
l
d
)
\overline{D}_{\mathrm{KL}}\left(\theta_{\mathrm{old}}, \theta\right) \approx \frac{1}{2}\left(\theta-\theta_{\mathrm{old}}\right)^{T} A\left(\theta-\theta_{\mathrm{old}}\right)
DKL(θold,θ)≈21(θ−θold)TA(θ−θold)
其中A代表了Fisher information matrix:
A
i
j
=
∂
∂
θ
i
∂
∂
θ
j
D
‾
K
L
(
θ
o
l
d
,
θ
)
A_{i j}=\frac{\partial}{\partial \theta_{i}} \frac{\partial}{\partial \theta_{j}} \overline{D}_{\mathrm{KL}}\left(\theta_{\mathrm{old}}, \theta\right)
Aij=∂θi∂∂θj∂DKL(θold,θ)
2、 更新策略参数在该方向上执行线性搜索,确保我们在满足非线性约束的同时改善非线性目标
θ
′
=
θ
+
α
F
−
1
∇
θ
J
(
θ
)
α
=
2
ϵ
∇
θ
J
(
θ
)
T
F
∇
θ
J
(
θ
)
\begin{array}{l}{\theta^{\prime}=\theta+\alpha \mathbf{F}^{-1} \nabla_{\theta} J(\theta)} \\ {\alpha=\sqrt{\frac{2 \epsilon}{\nabla_{\theta} J(\theta)^{T} \mathbf{F} \nabla_{\theta} J(\theta)}}}\end{array}
θ′=θ+αF−1∇θJ(θ)α=∇θJ(θ)TF∇θJ(θ)2ϵ
PPO
PPO 是一种基于TRPO的算法,在求解上面一些方法,但是本质上还是TRPO
PPO提出了两种算法:
第一种是约束限制转移概率
r
t
(
θ
)
=
π
θ
(
a
t
∣
s
t
)
π
θ
old
(
a
t
∣
s
t
)
r_{t}(\theta)=\frac{\pi_{\theta}\left(a_{t} | s_{t}\right)}{\pi_{\theta} \operatorname{old}\left(a_{t} | s_{t}\right)}
rt(θ)=πθold(at∣st)πθ(at∣st):
L
C
L
I
P
(
θ
)
=
E
^
t
[
min
(
r
t
(
θ
)
A
^
t
,
clip
(
r
t
(
θ
)
,
1
−
ϵ
,
1
+
ϵ
)
A
^
t
)
]
L^{C L I P}(\theta)=\hat{\mathbb{E}}_{t}\left[\min \left(r_{t}(\theta) \hat{A}_{t}, \operatorname{clip}\left(r_{t}(\theta), 1-\epsilon, 1+\epsilon\right) \hat{A}_{t}\right)\right]
LCLIP(θ)=E^t[min(rt(θ)A^t,clip(rt(θ),1−ϵ,1+ϵ)A^t)]
是吧变化量限制在某一个范围之内。这种方式是最直接的形式,因为直接把变化量限定在一个范围之内,但是其中的参数
ϵ
\epsilon
ϵ 还是没有给出一个固定的指标。
另一种约束是KL散度上的约束
L
K
L
P
E
N
(
θ
)
=
E
^
t
[
π
θ
(
a
t
∣
s
t
)
π
θ
old
(
a
t
∣
s
t
)
A
^
t
−
β
KL
[
π
θ
old
(
⋅
∣
s
t
)
,
π
θ
(
⋅
∣
s
t
)
]
]
L^{K L P E N}(\theta)=\hat{\mathbb{E}}_{t}\left[\frac{\pi_{\theta}\left(a_{t} | s_{t}\right)}{\pi_{\theta_{\text { old }}}\left(a_{t} | s_{t}\right)} \hat{A}_{t}-\beta \operatorname{KL}\left[\pi_{\theta_{\text { old }}}\left(\cdot | s_{t}\right), \pi_{\theta}\left(\cdot | s_{t}\right)\right]\right]
LKLPEN(θ)=E^t[πθ old (at∣st)πθ(at∣st)A^t−βKL[πθ old (⋅∣st),πθ(⋅∣st)]]
Let
d
=
E
^
t
[
K
L
[
π
θ
o
l
d
(
⋅
∣
s
t
)
,
π
θ
(
⋅
∣
s
t
)
]
]
d=\hat{\mathbb{E}}_{t}\left[\mathrm{KL}\left[\pi_{\theta_{\mathrm{old}}}\left(\cdot | s_{t}\right), \pi_{\theta}\left(\cdot | s_{t}\right)\right]\right]
d=E^t[KL[πθold(⋅∣st),πθ(⋅∣st)]]
If d < d targ / 1.5 , β ← β / 2 d<d_{\operatorname{targ}} / 1.5, \beta \leftarrow \beta / 2 d<dtarg/1.5,β←β/2
if d > d targ × 1.5 , β ← β × 2 d>d_{\operatorname{targ}}\times 1.5, \beta \leftarrow \beta \times 2 d>dtarg×1.5,β←β×2
实际上, 当利用(16)作为loss function 的时候,神经网络的loss function 必须还增加策略的熵升 和 值函数误差项
L
t
C
L
I
P
+
V
F
+
S
(
θ
)
=
E
^
t
[
L
t
C
L
I
P
(
θ
)
−
c
1
L
t
V
F
(
θ
)
+
c
2
S
[
π
θ
]
(
s
t
)
]
L_{t}^{C L I P+V F+S}(\theta)=\hat{\mathbb{E}}_{t}\left[L_{t}^{C L I P}(\theta)-c_{1} L_{t}^{V F}(\theta)+c_{2} S\left[\pi_{\theta}\right]\left(s_{t}\right)\right]
LtCLIP+VF+S(θ)=E^t[LtCLIP(θ)−c1LtVF(θ)+c2S[πθ](st)]
其中
S
S
S 代表了在该策略下的熵的奖励, 这是为了确保充分的探索。
L
t
V
F
(
θ
)
=
(
V
θ
(
s
t
)
−
V
t
targ
)
2
L_{t}^{V F}(\theta)=\left(V_{\theta}\left(s_{t}\right)-V_{t}^{\operatorname{targ}}\right)^{2}
LtVF(θ)=(Vθ(st)−Vttarg)2
所以整个算法流程是 : 利用老策略 采样 计算 优势函数 更新策略 再循环
Baseline中的PPO
baseline的PPO有两个版本一个版本为PPO1 一个版本为PPO2
PPO1 版本
Baseline的PPO 主要分为以下3个部分:
-
主程序部分: pposgd_simple
根据 env 和 提供的神经网络 创建好整个强化学习算法架构,并输出策略pi。 -
神经网络部分: cnn_policy和mlp_policy
创建神经网络模型 -
概率分布部分: common.distributions
根据当前所输出的动作和状态,建立对应
概率分布部分
由于采用的是随机策略PPO输出的结果都是概率分布的参数,然后再从中采样。所以在每个action输出的时候都是输出对应的概率分布的参数。这个部分主要的功能:
- 将对应动作参数类型转化为概率分布
- 为对应概率分布的参数生成必要的action 的placeholder
- 求交叉熵以及散度。
- 对概率分布采样得到动作。
神经网络部分
动作节点的创建
神经网络首先调用概率分布函数,将动作建立为对应概率分布,并在调用的时候已经建立好对应的节点。
网络中节点初始化
状态的创建:状态建立的时候 为了避免重复创建同名称的状态, 利用了 get_placeholder 这个函数创建。创建的时候 将所有的placeholder 都放入了一个字典里 类型为{“名称”:placeholder,数据类型,数据维度}。 创建好的状态都可以直接用 函数get_placeholder_cached 来进行调用。
然后对ob进行归一化,所有都归一到-5 到 5 之间。用RunningMeanStd 函数。
网络创建
vf 网络: 输入为状态 输出为vpred
pol网络: 输入为状态 输出为动作
如果是高斯变量 那么网络输出的是均值
如果不是高斯变量 那么网络输出的是概率参数
为了多次调用不同,在每次调用该类的过程中都需要先输入独特的名称 使得不同网络便于区分。 将网络利用with tf.variable_scope(name):命名。
-
Vf网络:critic网络
每层都相等、输入为归一化之后的状态、输出为单个元素,均采用tanh。 需要参数num_hid_layers(网络层数)、hid_size(隐藏层节点个数)。
利用for循环 循环生成。
with tf.variable_scope('vf'):
obz = tf.clip_by_value((ob - self.ob_rms.mean) / self.ob_rms.std, -5.0, 5.0)
last_out = obz
for i in range(num_hid_layers):
last_out = tf.nn.tanh(tf.layers.dense(last_out, hid_size, name="fc%i"%(i+1), kernel_initializer=U.normc_initializer(1.0)))
self.vpred = tf.layers.dense(last_out, 1, name='final', kernel_initializer=U.normc_initializer(1.0))[:,0]
-
pol网络 :actor网络
每层都相等、输入为归一化之后的状态、输出为动作,均采用tanh
主程序部分
PPO中主程序主要部分在learning中,重要参数有
- env : 环境
- policy_fn: 网络
- clip_param:
准备工作
###### 网络输出输入
首先用所提供的 网络创建新旧policy
pi = policy_fn("pi", ob_space, ac_space) # Construct network for new policy
oldpi = policy_fn("oldpi", ob_space, ac_space) # Network for old policy
其中 policy_fn 是一个class(类) 具体看神经网络部分。
接着提取之前所创建的 参数 状态ob 和 动作ac
输入口:
atarg = tf.placeholder(dtype=tf.float32, shape=[None]) # 优势方程 (17式中的A)
ret = tf.placeholder(dtype=tf.float32, shape=[None]) # Empirical return
lrmult = tf.placeholder(name='lrmult', dtype=tf.float32, shape=[])
定义图中的loss
计算loss所需的值:(107-111)
kloldnew = oldpi.pd.kl(pi.pd) # 计算新老策略的KL散度
ent = pi.pd.entropy() # 计算新策略的熵值
meankl = tf.reduce_mean(kloldnew) # 平均KL散度
meanent = tf.reduce_mean(ent) # 平均熵
计算(18)式的误差 包含 三项 L C L I P ( θ ) L^{C L I P}(\theta) LCLIP(θ)、 L t V F ( θ ) L_{t}^{V F}(\theta) LtVF(θ)、 S S S
-
16式的 L C L I P ( θ ) L^{C L I P}(\theta) LCLIP(θ)
然后计算公式 (16)式所需要的值
113 - 新老策略的概率π相除 然后得到 比率
114 - 比率乘以优势函数 优势函数 也是一个 placeholder
115 - 经过剪裁的比率 乘以优势函数
116 对应(16)式惩罚项 L C L I P ( θ ) L^{C L I P}(\theta) LCLIP(θ)
ratio = tf.exp(pi.pd.logp(ac) - oldpi.pd.logp(ac))
surr1 = ratio * atarg
surr2 = tf.clip_by_value(ratio, 1.0 - clip_param, 1.0 + clip_param) * atarg
pol_surr = - tf.reduce_mean(tf.minimum(surr1, surr2))
- L t V F ( θ ) = ( V θ ( s t ) − V t targ ) 2 L_{t}^{V F}(\theta)=\left(V_{\theta}\left(s_{t}\right)-V_{t}^{\operatorname{targ}}\right)^{2} LtVF(θ)=(Vθ(st)−Vttarg)2 这个地方 V t targ V_{t}^{\operatorname{targ}} Vttarg 是直接给出的 因为在前面定义了 一个placeholder
vf_loss = tf.reduce_mean(tf.square(pi.vpred - ret))
-
S S S c1 是 -entcoeff 是输入参数
pol_entpen = (-entcoeff) * meanent
生成梯度、优化器所需要的函数
lossandgrad = U.function([ob, ac, atarg, ret, lrmult], losses + [U.flatgrad(total_loss, var_list)])
adam = MpiAdam(var_list, epsilon=adam_epsilon)
assign_old_eq_new = U.function([],[], updates=[tf.assign(oldv, newv) for (oldv, newv) in zipsame(oldpi.get_variables(), pi.get_variables())])
compute_losses = U.function([ob, ac, atarg, ret, lrmult], losses)
1 、 计算梯度
输入ob 状态, ac 动作 , atarg 优势函数, ret , lrmult]
计算得到pol_surr L C L I P ( θ ) L^{C L I P}(\theta) LCLIP(θ) , pol_entpen S S S , vf_loss L t V F ( θ ) L_{t}^{V F}(\theta) LtVF(θ) , meankl 新老策略KL散度均值 , meanent 新策略熵值 以及对应的神经网络梯度
2、 生成优化器
3、 新旧策略的迭代
4、 计算loss :计算优化之后的LOSS 与1 的区别在于 不计算梯度
更新迭代过程
前期策略采样 和 优势函数估计
traj_segment_generator(pi, env, horizon, stochastic):
horizon 是采样的多少步
stochastic 标识 利用随机采样 即 pd.sample 或者 pd.mode
前向采样
seg = seg_gen.__next__()
add_vtarg_and_adv(seg, gamma, lam)
后向更新
for _ in range(optim_epochs):
losses = []
for batch in d.iterate_once(optim_batchsize):
*newlosses, g = lossandgrad(batch["ob"], batch["ac"], batch["atarg"], batch["vtarg"], cur_lrmult)
adam.update(g, optim_stepsize * cur_lrmult)
losses.append(newlosses)