在前面的章节里,我们已经介绍了基于策略的强化学习算法,也提到了异策略强化学习需要满足的条件:由于重要性采样的关系我们希望每次更新的时候策略分布之间差距并不是很大,这实际上是一种约束,即我们希望能每次更新的时候不大幅度地改变分布的形态,基于这种考虑openai的前辈们提出了TRPO算法,但是TRPO算法会有一些缺陷,他拿二次函数去近似约束条件,拿一次函数近似待优化的损失函数,这种近似会造成收敛上的困难,于是便有了第二次smart的改进,得到PPO系列的算法,PPO算法也是当前openai的默认算法,是策略算法的最好实现
PPO的完整代码,我已放在我的github上了,诚意之作,欢迎点星,欢迎fork,这份代码的可读性要好于openai的baseline,更适合于初学者以及想弄明白其中原理的人,不到500行代码。
TRPO算法
回顾策略梯度的方法,根据之前的介绍我们知道在策略梯度中我们的更新满足如下关系:
θ n e w = θ o l d + α ∇ θ J \theta_{new}=\theta_{old}+\alpha\nabla_\theta J θnew=θold+α∇θJ
策略梯度的硬伤就在于更新步长 α \alpha α,当步长选的不合适的时候更新的参数会更差,因此很容易导致越学越差,最后崩溃,那什么样的步长叫做合适的步长呢,试想我们如果能找到一种步长,使他每次更新时都能保证回报函数单调递增,这样的步长就是好步长。TRPO的核心就是解决这个问题。
我们用 τ \tau τ来表示一个状态行为序列,或者说一条轨迹,那么某种策略下的期望回报可以看做是如下式子:
η ( π ~ ) = E τ ∣ π ~ [ ∑ t = 0 ∞ γ t ( r ( s t ) ) ] \eta(\tilde \pi)= E_{\tau|\tilde\pi}[\sum\limits_{t=0}^{\infty}\gamma^t(r(s_t))] η(π~)=Eτ∣π~[t=0∑∞γt(r(st))]
既然TRPO的根本目的是为了使每次更新的回报函数单调不减,那么一个很自然的想法是将新的策略对应的回报函数分解成原来策略的回报函数加一个其他项,那么只要保证新的策略的其他项是大于零的,我们就得到了一个一直提升策略的方案。
在这种思想的引导下,我们可以得到如下等式:
η ( π ~ ) = η ( π ) + E τ ∈ π ~ [ ∑ t = 0 ∞ γ t A π ( s t , a t ) ] \eta(\tilde\pi)=\eta(\pi)+E_{\tau\in{\tilde\pi}}[\sum\limits_{t=0}^{\infty}\gamma^tA_{\pi}(s_t,a_t)] η(π~)=η(π)+Eτ∈π~[t=0∑∞γtAπ(st,at)]
其中
A π ( s , a ) = Q π ( s , a ) − V π ( s ) = E s ′ ∼ P ( s ′ ∣ s , a ) [ r ( s ) + γ V π ( s ′ ) − V π ( s ) ] A_{\pi}(s,a) = Q_{\pi}(s,a) - V_{\pi}(s) = E_{s'\sim P(s'|s,a)}[r(s)+\gamma V^{\pi}(s')-V^{\pi}(s)] Aπ(s,a)=Qπ(s,a)−Vπ(s)=Es′∼P(s′∣s,a)[r(s)+γVπ(s′)−Vπ(s)]
整个公式的证明稍许复杂不做详述。
我们将公式写开可以得到:
η ( π ~ ) = η ( π ) + ∑ t = 0 ∞ ∑ s P ( s t = s ∣ π ~ ) ∑ a π ~ ( a ∣ s ) γ t A π ( s , a ) \eta(\tilde\pi)=\eta(\pi)+\sum_{t=0}^{\infty}\sum\limits_s P(s_t=s|\tilde\pi)\sum\limits_a\tilde\pi(a|s)\gamma^t A_{\pi}(s,a) η(π~)=η(π)+t=0∑∞s∑P(