在Policy Gradient推导和REINFORCE算法两篇文章介绍了PG算法的推导和实现,本篇要介绍的算法是Proximal Policy Optimization (PPO)
,中文叫近短策略优化算法。PPO由于其非常的好的性能与易于实现等特性,已被作为OpenAI公司的首选算法,可见这个算法的优秀性能,具体可以查看OpenAI-PPO
在TRPO算法中,对于第一个问题可以使用importance sampling的方式,第二个问题使用Trust region and natural policy gradient方法,TRPO算法是OpenAI在15年提出的算法,做了很多开创性的工作,当然要理解起来论文也不是那么容易的,PPO可以看作是TRPO的一个简化版本,也用到了importance sampling技术,然后效果也不输TRPO,感兴趣的可以自行阅读Arxiv: TRPO
重要性采样(importance sampling)是一种近似的采样方法,如下式子所示:我们要求f(x)
的期望,其中x
服从p(x)
分布,可以通过如下入学变换,x
可以从另外一个分布q(x)
中采样,这时f(x)
就需要乘上一个重要性权重 p ( x ) q ( x ) \frac{p(x)}{q(x)} q(x)p(x). 通过这种方式就可以从另外一个分布采样来计算原式,后面只需要乘上一个重要性权重就可以了。
那么重要性权重有什么用呢?上面说了PG算法效率低下,是因为PG属于on-policy算法,那我们能不能把PG变成off-policy算法呢?答案是可以的,方法就是重要性采样。
PG的策略更新梯度为: ∇ J ( θ ) = E τ − p θ ( τ ) [ R ( τ ) ∇ l o g p θ ( τ ) ] \nabla J(\theta)=E_{\tau-p_\theta (\tau)}[R(\tau)\nabla logp_\theta(\tau)] ∇J(θ)=Eτ−pθ(τ)[R(τ)∇logpθ(τ)] ,根据上面的式子,更新梯度可以变为如下形式:
∇ J ( θ ) = E τ − p θ ′ ( τ ) [ p θ ( τ ) p θ ′ ( τ ) R ( τ ) ∇ l o g p θ ( τ ) ] \nabla J(\theta)=E_{\tau-p_{\theta'} (\tau)}\left[\frac{p_\theta(\tau)}{p_{\theta'}(\tau)}R(\tau)\nabla logp_\theta(\tau)\right] ∇J(θ)=Eτ−pθ′(τ)[pθ′(τ)pθ(τ)R(τ)∇logpθ(τ)]
此时有两个策略,参数分别为 θ ′ \theta' θ′和 θ \theta θ ,我们使用 θ ′ \theta' θ′ 来和环境交互采样数据,然后用来更新 θ \theta θ 策略,这样就变成了off-policy
方式,采集到的数据可以进行多次更新。 θ \theta θ 更新多次之后把参数复制给 θ ′ \theta' θ′ .
下面把使用优势函数的形式改成off-policy形式:
使用优势函数的更新梯度为:
E ( s t , a t ) − π θ [ A θ ( s t , a t ) ∇ l o g p θ ( a t n ∣ s t n ) ] E_{(s_t,a_t)-\pi_\theta}[A^\theta(s_t,a_t)\nabla logp_\theta(a_t^n|s_t^n)] E(st,at)−πθ[Aθ(st,at)∇logpθ(atn∣stn)]
使用重要性采样后有:
= E ( s t , a t ) − π θ ′ [ P θ ( s t , a t ) P θ ′ ( s t , a t ) A θ ′ ( s t , a t ) ∇ l o g p θ ( a t n ∣ s t n ) ] = E ( s t , a t ) − π θ ′ [ p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) p θ ( s t ) p θ ′ ( s t ) A θ ′ ( s t , a t ) ∇ l o g p θ ( a t n ∣ s t n ) ] \begin{aligned} = & E_{(s_t,a_t)-\pi_{\theta'}}\left[\frac{P_\theta(s_t,a_t)}{P_{\theta'}(s_t,a_t)}\color{red}A^{\theta'}(s_t,a_t) \color{black} \nabla logp_\theta(a_t^n|s_t^n)\right] \\ = & E_{(s_t,a_t)-\pi_{\theta'}}\left[\frac{p_\theta(a_t|s_t)}{p_{\theta'}(a_t|s_t)}\cancel{\frac{p_\theta(s_t)}{p_{\theta'}(s_t)}}\color{red}A^{\theta'}(s_t,a_t)\color{black}\nabla logp_\theta(a_t^n|s_t^n)\right] \\ \end{aligned} ==E(st,at)−πθ′[Pθ′(st,at)Pθ(st,at)Aθ′(st,at)∇logpθ(atn∣stn)]E(st,at)−πθ′[pθ′(at∣st)pθ(at∣st)pθ′(st)pθ(st) Aθ′(st,at)∇logpθ(atn∣stn)]
上式中需要注意的第一点是对于优势函数的计算, A θ ( s t , a t ) A^{\theta}(s_t,a_t) Aθ(st,at)要变为 A θ ′ ( s t , a t ) A^{\theta'}(s_t,a_t) Aθ′(st,at)。因为优势函数是基于采样策略的和环境交互的数据计算的,这里我们的采样策略参数是 θ ′ \theta' θ′,所以要换成 θ ′ \theta' θ′。另外一点是对于 p θ ( s t ) p θ ′ ( s t ) \frac{p_\theta(s_t)}{p_{\theta'}(s_t)} pθ′(st)pθ(st) 一般认为分子分母是近似相等的,这么处理的原因1是对于 p θ ( s t ) p_\theta(s_t) pθ(st) 难以计算(比如游戏中某一状态的概率怎么算?)第二点就是在PPO中我们要求策略 θ \theta θ 和 θ ′ \theta' θ′ 差别不能太大,这样就算计算出来 p θ ( s t ) p_\theta(s_t) pθ(st) 和 p θ ′ ( s t ) p_{\theta'}(s_t) pθ′(st), 最终结果也会接近于1。至于为什么两个分布不能差别太大,下面会具体介绍。到这里我们就得到了优势函数形式PPO损失函数:
J θ ′ ( θ ) = E ( s t , a t ) − π θ ′ [ p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) A θ ′ ( s t , a t ) ] J^{\theta'}(\theta) = E_{(s_t,a_t)-\pi_{\theta'}}\left[\frac{p_\theta(a_t|s_t)}{p_{\theta'}(a_t|s_t)}A^{\theta'}(s_t,a_t)\right] Jθ′(θ)=E(st,at)−πθ′[pθ′(at∣st)pθ(at∣st)Aθ′(st,at)]
其中 J θ ′ ( θ ) J^{\theta'}(\theta) Jθ′(θ) 表示用 θ ′ \theta' θ′ 采样,用 θ \theta θ 更新。
上面我们说了,在PPO算法中这两个分布不能相差太远,下面来解释原因。还是回到下面这个重要性采样例子:
E x − p [ f ( x ) ] = E x − q [ p ( x ) q ( x ) f ( s ) ] E_{x-p}[f(x)] = E_{x-q}[\frac{p(x)}{q(x)}f(s)] Ex−p[f(x)]=Ex−q[q(x)p(x)f(s)]
**上面这个公式在理论上是没有问题的,即便p
分布和q
分布差别很大也没问题,前提是需要非常大量的采样。但是在实际算法中,由于做不到非常大量的采样,所以这里需要给p
分布和q
分布加一个限制,就是不能差别太大。**下面结合图片讲解,如图红线代表f(x)
,蓝色线为p(x)
分布,绿色线为 q(x)
分布,其分布差别很大。
p(x)
分布采样有限的一些点,那么很大概率上会采样到A区域,那么此时算出来f(x)
的期望是负的。q(x)
分布采样的话,很大概率会采样带范围B(采样点为右边六个绿色点),那么此时很容易会得出 E[f(x)]
是正数的情况。但实际上根据p(x)
分布可以看出在采样有限点下 f(x)
的期望应该是负的,这显然是有问题的。f(x)
的期望仍然是负数。下面谈谈PPO中的限制,PPO论文提供了两种限制梯度更新方式:
PPO1使用KL距离来表示两个分布的差距大小,并把KL距离作为一个惩罚项,使用参数 β \beta β来调节
PPO2没有使用 KL 距离限制,而是直接用 clip 剪切。把重要性权重限制在 ( 1 − ϵ , 1 + ϵ ) (1-\epsilon, 1+\epsilon) (1−ϵ,1+ϵ) 范围内。
具体可以结合着图片个式子分析下。这种处理法方法简单粗暴,但效果却出奇的好,不得不说真的很神奇。
以上就是PPO理论部分的内容了,代码实现连接见PPO TF2.X实现,对比着PG的代码和上述理论知识,还是挺好理解的。本篇文章部分图片参考了李宏毅老师的课件,另外李宏毅老师讲的真的不错,简单易懂,这里放上课程链接:李宏毅强化学习。
另外,本强化学习算法系列尤其是头几篇文章参考了周博磊老师的强化学习纲要,周老师的课程更加偏理论一些,对初学者可能不太友好,建议先对算法有个直观的了解然后再观看。
强化学习常用算法打算就介绍这么多,后面会更新一些模仿学习和多智能体强化学习的内容