基于LunarLander登陆器的TRPO强化学习(含PYTHON工程)
TRPO强化学习算法主要分为3个部分,分别介绍其理论、细节、实现
本文主要介绍TRPO的特点、思路、和优化式子的推导
TRPO系列(TRPO是真的复杂,全部理解花费了我半个月的时间嘞,希望也能帮助大家理解一下):
11.1、信赖域策略优化算法TRPO强化学习-从理论到实践
11.2、信赖域策略优化算法TRPO强化学习-约束优化求解
11.3、信赖域策略优化算法TRPO强化学习-运用实践
只需要代码请直接到11.3、信赖域策略优化算法TRPO强化学习-运用实践
其他算法:
07、基于LunarLander登陆器的DQN强化学习案例(含PYTHON工程)
08、基于LunarLander登陆器的DDQN强化学习(含PYTHON工程)
09、基于LunarLander登陆器的Dueling DQN强化学习(含PYTHON工程)
10、基于LunarLander登陆器的Dueling DDQN强化学习(含PYTHON工程)
11、基于LunarLander登陆器的A2C强化学习(含PYTHON工程)
参考:【TRPO系列讲解】(五)TRPO_理论推导篇
目录
- 基于LunarLander登陆器的TRPO强化学习(含PYTHON工程)
- 1、 TRPO相对于一般梯度下降法的改进
- 2、 TRPO常用变量定义
- 3、 TRPO的基本思路与TRPO的优化目标
- 4、 TRPO的替代优势函数与重要性采样的运用
- 5、 TRPO的迭代求解
1、 TRPO相对于一般梯度下降法的改进
一般梯度下降法的缺点:
- 更新步长难以选取
- 数据采样效率低
TRPO的优点:
- 使用了多个近似加速
- 使用了重要性采样,提升了样本效率
- 使用自然梯度法进行更新,解决了策略网络更新步长难以选取的问题
TRPO的缺点:
- 无法处理大参数矩阵:尽管使用了共轭梯度法,TRPO仍然难以处理大的 Fisher矩阵,即使它们不需要求逆
- 二阶优化很慢:TRPO的实际实现是基于约束的,需要计算上述Fisher矩阵,这大大减慢了更新过程
- 我们不能利用一阶随机梯度优化器,例如ADAM
- TRPO 很复杂:TRPO很难解释、实现和调试。当训练没有产生预期的结果时,确定如何提高性能可能会很麻烦
TRPO的改进:近端策略优化算法(PPO)
2、 TRPO常用变量定义
Return:回报U,可以理解为获得高奖励的可能,越大代表越可能获得高奖励。实际使用的是折扣回报,因为对于很远的奖励我们还需要考虑时间成本。对于一个随机的环境,在t时刻我们无法获得Ut的具体取值,因为我们不知道未来的奖励。
U t = R t + γ ⋅ R t + 1 + γ 2 ⋅ R t + 2 + γ 3 ⋅ R t + 3 + ⋯ U_t=R_t+\gamma\cdot R_{t+1}+\gamma^2\cdot R_{t+2}+\gamma^3\cdot R_{t+3}+\cdots Ut=Rt+γ⋅Rt+1+γ2⋅Rt+2+γ3⋅Rt+3+⋯
η \eta η:策略pi的性能评估,也就是折扣回报Ut在t=0的期望,直观的解释是用当前策略网络pi去玩游戏的表现:
η ( π ) = 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^tr(s_t)\right] η(π)=Es0,a0,…[t=0∑∞γtr(st)]
Q(s,a):动作价值函数,其输入为当前状态和要执行的动作,输出为该动作能带来多大的价值,因此,一种贪心的方法是选择能够使Q(s,a)最大动作执行。
Q π ( s t , a t ) = E s t + 1 , a t + 1 , … [ ∑ l = 0 ∞ γ l r ( s t + l ) ] Q_\pi(s_t,a_t)=\mathbb{E}s_{t+1},a_{t+1},\ldots\left[\sum_{l=0}^\infty\gamma^lr(s_{t+l})\right] Qπ(st,at)=Est+1,at+1,…[l=0∑∞γlr(st+l)]
Q(s,a)的维度等于动作空间的维度。打个简单的比方,假设我现在有两个动作,向北去捡芝麻,向南去捡西瓜。从最终获得的奖励来看,西瓜是大于芝麻的,但是如果芝麻就在我桌上,但是西瓜在20km以外,那可能我还是选择芝麻得了。那么动作价值函数可能就是(1,0.1)。1是捡芝麻的动作价值,0.1是捡西瓜的动作价值,虽说西瓜好吃,但是太远了,所以其动作价值打分特别低。
Q(s,a)和Ut关系:Q(s,a)是Ut的期望,期望可以理解为求积分,实际上Q是对Ut把所有t之后的时刻(t+1、t+2等等)当作变量求积分得到的。因此Q(s,a)可以直观反应当前状态s下执行各个动作的好坏。
Q π ( s t , a t ) = E [ U t ∣ s t , a t ] Q_\pi(s_t,{a_t})=\mathbb{E}[U_t\mid s_t,{a_t}] Qπ(st,at)=E[Ut∣st,at]
V(s):状态价值函数,是Q函数的期望。因为期望的积分动作消去了动作A,因此状态价值函数V可以用来直观的反应一个状态的好坏。其实际上是Q(s,a)对不同a的加权平均。
例如,自家高低三路被破,依据这个状态我们就知道现在的状态打分不太行。状态打分不行的原因是每个动作都不会带来太高的打分(都要输了)。
V π ( s t ) = E A t [ Q π ( s t , A t ) ∣ s t ] V_{\pi}(s_{t})=\mathbb{E}_{{A_{t}}}[Q_{\pi}(s_{t},{A_{t}})\mid s_{t}] Vπ(st)=EAt[Qπ(st,At)∣st]
A:优势函数,其数值等于动作价值函数减去状态价值函数,相当于动作价值Q(s,a)减去了其baseline:
A π ( s , a ) = Q π ( s , a ) − V π ( s ) A_\pi(s,a)=Q_\pi(s,a)-V_\pi(s) Aπ(s,a)=Qπ(s,a)−Vπ(s)
3、 TRPO的基本思路与TRPO的优化目标
之前提及, η ( π ) \eta(\pi) η(π)是TRPO算法中衡量策略网络 π \pi π优劣的主要参数,假设 π ~ \tilde{\pi} π~是网络 π \pi π更新后的新策略,那么我们有朴素的愿望,那就是越更新越好,就是将 η ( π ~ ) \eta(\tilde{\pi}) η(π~)写为加法的形式,如:
η ( π ~ ) = η ( π ) + ( … ) \eta(\tilde{\pi})=\eta(\pi)+(\ldots) η(π~)=η(π)+(…)
理论证明,这是确实可行的, η ( π ~ ) \eta(\tilde{\pi}) η(π~)可以写为如下的形式(推导见【TRPO系列讲解】(五)TRPO_理论推导篇的8min):
η ( π ~ ) = η ( π ) + E s 0 , a 0 , … ∼ π ~ [ ∑ t = 0 ∞ γ t A π ( s t , a t ) ] \eta(\tilde{\pi})=\eta(\pi)+\mathbb{E}s_{0},a_{0},\ldots\sim\tilde{\pi}\left[\sum_{t=0}^{\infty}\gamma^{t}A_{\pi}(s_{t},a_{t})\right] η(π~)=η(π)+Es0,a0,…∼π~[t=0∑∞γtAπ(st,at)]
因此,简单来讲,只要每次更新的 E s 0 , a 0 , … ∼ π ~ [ ∑ t = 0 ∞ γ t A π ( s t , a t ) ] \mathbb{E}s_{0},a_{0},\ldots\sim\tilde{\pi}\left[\sum_{t=0}^{\infty}\gamma^{t}A_{\pi}(s_{t},a_{t})\right] Es0,a0,…∼π~[∑t=0∞γtAπ(st,at)]大于0,那么每次更新一定会提升策略网络的性能;如果每次更新得到的 E s 0 , a 0 , … ∼ π ~ [ ∑ t = 0 ∞ γ t A π ( s t , a t ) ] = 0 \mathbb{E}s_{0},a_{0},\ldots\sim\tilde{\pi}\left[\sum_{t=0}^{\infty}\gamma^{t}A_{\pi}(s_{t},a_{t})\right]=0 Es0,a0,…∼π~[∑t=0∞γtAπ(st,at)]=0,那么可以认为该策略网络趋于收敛了。
对于离散的情况,可以将期望进行展开:
η ( π ~ ) = η ( π ) + ∑ t = 0 ∞ ∑ s P ( s t = s ∣ π ~ ) ∑ a π ~ ( a t = a ∣ s t ) γ t A π ( s t , a t ) \eta(\tilde{\pi})=\eta(\pi)+\sum_{t=0}^\infty\sum_sP(s_t=s\mid\tilde{\pi})\sum_a\tilde{\pi}(a_t=a\mid s_t)\gamma^tA_\pi(s_t,a_t) η(π~)=η(π)+t=0∑∞s∑P(st=s∣π~)a∑π~(at=a∣st)γtAπ(st,at)
简单交换一下求和的顺序:
η ( π ~ ) = η ( π ) + ∑ s ∑ t = 0 ∞ γ t P ( s t = s ∣ π ~ ) ∑ a π ~ ( a t = a ∣ s t ) A π ( s t , a t ) \eta(\tilde{\pi})=\eta(\pi)+\sum_s\sum_{t=0}^\infty\gamma^tP(s_t=s\mid\tilde{\pi})\sum_a\tilde{\pi}(a_t=a\mid s_t)A_\pi(s_t,a_t) η(π~)=η(π)+s∑t=0∑∞γtP(st=s∣π~)a∑π~(at=a∣st)Aπ(st,at)
定义 ∑ t = 0 ∞ γ t P ( s t = s ∣ π ~ ) \sum_{t=0}^\infty\gamma^tP(s_t=s\mid\tilde{\pi}) ∑t=0∞γtP(st=s∣π~)为折扣的访问频率(单纯为了简化式子的表达):
ρ π ( s ) = ∑ t = 0 ∞ γ t P ( s t = s ∣ π ) \rho_\pi(s)=\sum_{t=0}^\infty\gamma^tP(s_t=s\mid\pi) ρπ(s)=t=0∑∞γtP(st=s∣π)
由此 η ( π ~ ) \eta(\tilde{\pi}) η(π~)可以简写为:
η ( π ~ ) = η ( π ) + ∑ s ρ π ~ ( s ) ∑ a π ~ ( a ∣ s ) A π ( s , a ) \eta(\tilde{\pi})=\eta(\pi)+\sum_s\rho_{\tilde{\pi}}(s)\sum_a\tilde{\pi}(a\mid s)A_\pi(s,a) η(π~)=η(π)+s∑ρπ~(s)a∑π~(a∣s)Aπ(s,a)
上面这个函数非常简洁明了,但仍然有一些繁杂之处。我们在衡量新策略 π ~ \tilde{\pi} π~的性能,观测其等式右边,需要得到两个涉及到新策略 π ~ \tilde{\pi} π~的参数,分别是 ρ π ~ ( s ) \rho_{\tilde{\pi}}(s) ρπ~(s)和 π ~ ( a ∣ s ) \tilde{\pi}(a\mid s) π~(a∣s)。对于 π ~ ( a ∣ s ) \tilde{\pi}(a\mid s) π~(a∣s),我们只需要对网络进行更新就可以得到,是非常容易的。然而,新策略的折扣的访问频率 ρ π ~ ( s ) \rho_{\tilde{\pi}}(s) ρπ~(s)需要我们在得到 π ~ ( a ∣ s ) \tilde{\pi}(a\mid s) π~(a∣s)后再玩一局游戏才能得到(需要重新和环境交互),相当于需要有一次交互不更新策略网络只为了得到 ρ π ~ ( s ) \rho_{\tilde{\pi}}(s) ρπ~(s)。
为了解决这个问题,对 ρ π ~ ( s ) \rho_{\tilde{\pi}}(s) ρπ~(s)函数进行近似,使用旧策略的 ρ π ( s ) \rho_{{\pi}}(s) ρπ(s)来代替 ρ π ~ ( s ) \rho_{\tilde{\pi}}(s) ρπ~(s),由此可以通过一次交互同时得到 ρ π ( s ) \rho_{{\pi}}(s) ρπ(s)和更新后的策略 π ~ \tilde{\pi} π~:
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\mid s)A_\pi(s,a) Lπ(π~)=η(π)+s∑ρπ(s)a∑π~(a∣s)Aπ(s,a)
该函数也是用来衡量新网络的表现优劣。为什么能进行替代呢?详细的数学推导过程见【TRPO系列讲解】(五)TRPO_理论推导篇的18min。
这种替代自然也是有条件的,那就是新旧策略网络的 ρ ( s ) \rho_(s) ρ(s)不能差太多,也就是新旧策略网络不能差的太多,新旧策略网络输出的实际上概率分布,而衡量两个概率分布之间差异的方法是KL散度。
由此,可以初步写出TRPO算法的优化式子了(当然,在原文中,使用了惩罚项,通过近似才得到了下面给出的式子的,详细的数学推导过程见【TRPO系列讲解】(五)TRPO_理论推导篇的19min):
1、最大化策略pi的性能评估,近似前是 η ( π ~ ) \eta(\tilde{\pi}) η(π~),近似后是 L π ( π ~ ) L_\pi(\tilde{\pi}) Lπ(π~)
2、新旧策略网络不能差的太多(保证近似可靠的条件),最大的区别要小于一定的常数
m a x θ L θ o l d ( θ ) subject to D K L m a x ( θ o l d , θ ) ≤ δ \begin{aligned}&max_{\theta}L_{\theta_{old}}\left(\theta\right)\\&\text{subject to }D_{KL}^{max}\left(\theta_{old},\theta\right)\leq\delta\end{aligned} maxθLθold(θ)subject to DKLmax(θold,θ)≤δ
然而,原文还进一步进行了近似,使用KL散度的期望代替最大的KL散度(不知道为啥),代替后直接蒙特卡洛近似就能之前求出来,因此表达式可以写为:
m a x θ L θ o l d ( θ ) subject to D ˉ K L ρ θ o l d ( θ o l d , θ ) ≤ δ \begin{aligned}&max_{\theta}L_{\theta_{old}}\left(\theta\right)\\&\text{subject to }\bar{D}_{KL}^{\rho_{\theta old}}\left(\theta_{old},\theta\right)\leq\delta\end{aligned} maxθLθold(θ)subject to DˉKLρθold(θold,θ)≤δ
4、 TRPO的替代优势函数与重要性采样的运用
我们 m a x θ L θ o l d ( θ ) max_{\theta}L_{\theta_{old}}\left(\theta\right) maxθLθold(θ)的主要目的是得到新的策略网络,因此在此式子之中,旧策略网络 π \pi π的参数 θ o l d \theta_{old} θold相当于是已知量,因此我们实际需要最大化的部分是下式的最右边的那一项:
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\mid s)A_\pi(s,a) Lπ(π~)=η(π)+s∑ρπ(s)a∑π~(a∣s)Aπ(s,a)
也就是:
∑ s ρ π ( s ) ∑ a π ~ ( a ∣ s ) A π ( s , a ) \sum_s\rho_\pi\left(s\right)\sum_a\tilde{\pi}(a\mid s)A_\pi\left(s,a\right) s∑ρπ(s)a∑π~(a∣s)Aπ(s,a)
上面这个式子实际上就是替代优势函数(surrogate advantage) L ( θ k , θ ) \mathcal{L}(\theta_{k},\theta) L(θk,θ)的原型。为了计算上面的式子,我们需要使用蒙特卡洛方法,因此先将其写成期望的形势:
L ( θ k , θ ) = ∑ s ρ π ( s ) ∑ a π ~ ( a ∣ s ) A π ( s , a ) = E s ∼ ρ π , a ∼ π ~ [ A π ( s , a ) ] \mathcal{L}(\theta_{k},\theta)=\sum_s\rho_\pi\left(s\right)\sum_a\tilde{\pi}(a\mid s)A_\pi\left(s,a\right)=\mathop{\mathrm{E}}_{s\sim\rho_\pi,a\sim\tilde{\pi}}\left[A_\pi\left(s,a\right)\right] L(θk,θ)=s∑ρπ(s)a∑π~(a∣s)Aπ(s,a)=Es∼ρπ,a∼π~[Aπ(s,a)]
但是,问题来了,注意观察期望分布的服从函数 s ∼ ρ π , a ∼ π ~ s\sim\rho_\pi,a\sim\tilde{\pi} s∼ρπ,a∼π~,可见状态的获取和动作的获取分别依赖于旧的策略 π \pi π和新策略 π ~ {\tilde \pi } π~,这就给采样带来了很大的困难。具体表现为,动作a服从的分布来自于新网络 π ~ {\tilde \pi } π~,每更新一次网络,就需要服从更加新的网络的a来进行计算,因此每次采样的数据只能用于一次网络更新,效率非常低(一次采样数据无法使用batch多次训练)。
重要性采样的基本公式如下所示(可以更换期望服从的分布):
E x ∼ p ( x ) [ f ( x ) ] = ∫ p ( x ) f ( x ) d x = ∫ q ( x ) q ( x ) p ( x ) f ( x ) d x = ∫ q ( x ) p ( x ) q ( x ) f ( x ) d x = E x ∼ q ( x ) [ p ( x ) q ( x ) f ( x ) ] \begin{aligned} E_{x\sim p(x)}[f(x)]& =\int p(x)f(x)dx \\ &=\int\frac{q(x)}{q(x)}p(x)f(x)dx \\ &=\int q(x)\frac{p(x)}{q(x)}f(x)dx \\ &=E_{x\sim q(x)}\left[\frac{p(x)}{q(x)}f(x)\right] \end{aligned} Ex∼p(x)[f(x)]=∫p(x)f(x)dx=∫q(x)q(x)p(x)f(x)dx=∫q(x)q(x)p(x)f(x)dx=Ex∼q(x)[q(x)p(x)f(x)]
由此可得:
E s ∼ ρ π , a ∼ π ~ [ A π ( s , a ) ] = E s ∼ ρ π , a ∼ π [ π ~ ( a ∣ s ) π ( a ∣ s ) A π ( s , a ) ] \mathop{\mathrm{E}}_{s\sim\rho_\pi,a\sim\tilde{\pi}}\left[A_\pi\left(s,a\right)\right] = {E_{s\sim\rho_\pi,a\sim{\pi}}}\left[ {\frac{{{\tilde\pi }(a|s)}}{{{\pi _{{{{}}}}}(a|s)}}{A_{\pi}}(s,a)} \right] Es∼ρπ,a∼π~[Aπ(s,a)]=Es∼ρπ,a∼π[π(a∣s)π~(a∣s)Aπ(s,a)]
由此,动作和状态都依赖与旧策略 π \pi π,我们可以愉快的使用同一组数据多次对网络进行更新啦。
因此,最终得到的优化式子就是(使用了KL散度的期望代替最大的KL散度):
max θ E s ∼ ρ θ o l d , a ∼ θ o l d [ π θ ( a ∣ s ) π θ o l d ( a ∣ s ) A θ o l d ( s , a ) ] s u b j e c t t o E s ∼ ρ θ o l d [ D K L ( π θ o l d ( ⋅ ∣ s ) ∥ π θ ( ⋅ ∣ s ) ) ] ≤ δ \begin{array}{l} {\max _\theta }E{_{s\sim{\rho _{{\theta _{old}}}},a\sim\theta_{old} }}\left[ {\frac{{{\pi _\theta }(a\mid s)}}{{{\pi _{{\theta _{old}}}}(a\mid s)}}{A_{{\theta _{old}}(s,a)}}} \right]\\ subject\;to\quad {E_{s\sim{\rho _{{\theta _{old}}}}}}\left[ {{D_{KL}}({\pi _{{\theta _{old}}}}( \cdot \mid s)\parallel {\pi _\theta }( \cdot \mid s))} \right] \le \delta \end{array} maxθEs∼ρθold,a∼θold[πθold(a∣s)πθ(a∣s)Aθold(s,a)]subjecttoEs∼ρθold[DKL(πθold(⋅∣s)∥πθ(⋅∣s))]≤δ
5、 TRPO的迭代求解
…
11.2、信赖域策略优化算法TRPO强化学习-约束优化求解