OPENAI-Baeslines-详解(四)-PPO中文

Zee带你看代码系列

学习强化学习,码代码的能力必须要出众,要快速入门强化学习 搞清楚其中真正的原理,读源码是一个最简单的最直接的方式。最近创建了一系列该类型文章,希望对大家有多帮助。
传送门
另外,我会将所有的文章及所做的一些简单项目,放在我的个人网页上。
水平有限,可能有理解不到位的地方,希望大家主动沟通交流。
邮箱:[email protected]

Thanks for reading, and enjoy yourself。

OPENAI-Baeslines-PPO

2017年 OpenAI 和 Deep Mind先后推出了TRPO和PPO算法,该算法通过限制了new policy和 Old policy之间的KL散度大小(Kullback-Leibler Divergence,KLD),从而解决学习率过大引起不收敛的问题。


文章目录

  • Zee带你看代码系列
    • OPENAI-Baeslines-PPO
    • @[toc]
      • 基本原理
        • TRPO
        • PPO
      • Baseline中的PPO
        • PPO1 版本
        • 概率分布部分
      • 神经网络部分
            • 动作节点的创建
            • 网络中节点初始化
            • 网络创建
      • 主程序部分
          • 准备工作
            • 定义图中的loss
            • 生成梯度、优化器所需要的函数
          • 更新迭代过程
            • 前期策略采样 和 优势函数估计
            • 前向采样
            • 后向更新

基本原理

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=0sP(st=sπ~)aπ~(as)γtAπ(s,a)=η(π)+st=0γtP(st=sπ~)aπ~(as)Aπ(s,a)=η(π)+sρπ~(s)aπ~(as)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π~(as)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(as)=(1α)πold(as)+απ(as)
那么 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(pq)=21ipiqi)的方式来衡量新旧策略的不同时, α \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,aAπ(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(pq)2DKL(pq),将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π~θ(as)Aθold=aπ~θ(as)(Qθold(s,a)Vθold(s))=aπ~θ(as)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π~θ(as)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π~θ(as)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π~θ(as)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θ=Eaq(θ)[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θjDKL(θ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} θ=θ+αF1θ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(atst)πθ(atst)
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 (atst)πθ(atst)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

所以整个算法流程是 : 利用老策略 采样 计算 优势函数 更新策略 再循环

OPENAI-Baeslines-详解(四)-PPO中文_第1张图片

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)

你可能感兴趣的:(baseline)