David Silver 增强学习——Lecture 7 策略梯度算法(三)

David Silver 增强学习——Lecture 7 策略梯度算法(三)

其他Lecture

【1】搬砖的旺财:David Silver 增强学习——笔记合集(持续更新)


拓展

李宏毅老师的DRL课程,受益匪浅:

PPThttp://speech.ee.ntu.edu.tw/~tlkagk/courses/MLDS_2018/Lecture/PPO%20(v3).pdf

视频bilibili.com/video/av24


DeepMind的PPO paperEmergence of Locomotion Behaviours in Rich Environments

OpenAI的PPO paperProximal Policy Optimization Algorithms


前言

Lecture 7的前两个博客讲了策略梯度的原理以及可以减小方差的一些方法,本文将着重讲另一种策略梯度算法——PPO,并给出源码帮助理解,同时还将给出tf_agents中ppo_agent的代码注释,还希望大家多多支持我的专栏~


On-policy Learning和Off-policy Learning

回顾一下On-policy和Off-policy的定义:

  • On-policy,即用于采样策略\pi目标策略\pi 一致,即Agent一边和环境互动,一边学习。
  • Off-policy,即用于采样策略\mu目标策略\pi 不一致,即Agent通过看别人玩游戏来学习。
On-policy,阿光自己下棋,自己学棋;Off-policy,阿光在旁边看佐为下棋,并且学棋

详情请参考:

搬砖的旺财:David Silver 增强学习——Lecture 5 不基于模型的控制zhuanlan.zhihu.com图标

\begin{align*}  \nabla_\theta U\left( \theta \right) &= {\Bbb E}_{\tau \sim p_\theta(\tau)}\left[ R\left( \tau \right) \nabla_{\theta}{\textrm{log}}p_\theta\left( \tau \right) \right] \end{align*} 其实是On-policy的方法,即采样的policy和学习的policy是一致的,这样带来的问题是,一旦 \theta 更新了,所有采样得到的 \tau \sim p_{\theta}(\tau) 都不能使用了。目的是,希望用policy \pi_{\theta'} 去采样数据来训练 \theta


重要性采样

采样的目的:其实是想求得 {\Bbb E}_{x\sim p(x)}\left[ f\left( x \right) \right] ,也就是 {\Bbb E}\left[ f\left( x \right) \right]=\int_{x}f(x)p(x)dx ,即 f\left( x \right)p\left( x \right) 分布下的期望。 如果符合 p\left( x \right) 分布的样本不太好生成,我们可以引入另一个分布 q\left( x \right) ,可以很方便地生成样本,使得:

\begin{align*}  {\Bbb E}_{x \sim p(x)}\left[ f\left( x \right) \right] &=\int_{x}f\left( x \right)p\left( x \right)dx\\  &=\int_{x}\frac{p\left( x \right)}{q\left( x \right)}f\left( x \right)q\left( x \right)dx\\  &={\Bbb E}_{x \sim q(x)}\left[ \frac{p\left( x \right)}{q\left( x \right)}f(x) \right] \end{align*}

详情请参考:

搬砖的旺财:David Silver 增强学习补充——重要性采样zhuanlan.zhihu.com图标

对两个期望求方差:

方差的计算公式: \textrm{Var}\left( X \right)={\Bbb E}\left( X-{\Bbb E}\left( X \right) \right)^2={\Bbb E}\left[ X^2 \right]-\left[ {\Bbb E}\left( X \right) \right]^2

\textrm{Var}_{x \sim p(x)}\left[ f\left( x \right) \right]={\Bbb E}_{x \sim p(x)}\left\{ \left[ f\left( x \right) \right]^2 \right\}-\left\{ {\Bbb E}_{x \sim p(x)}\left[ f\left( x \right) \right] \right \}^2

\begin{align*}  \textrm{Var}_{x \sim q(x)}\left[ \frac{p\left( x \right)}{q\left( x \right)}f(x)  \right] &={\Bbb E}_{x \sim q(x)}\left\{ \left[ \frac{p\left( x \right)}{q\left( x \right)}f(x)  \right]^2 \right\}-\left\{ {\Bbb E}_{x \sim q(x)}\left[  \frac{p\left( x \right)}{q\left( x \right)}f(x) \right] \right\}^2\\ &={\Bbb E}_{x \sim q(x)}\left\{  \frac{\left[ p\left( x \right) \right]^2}{\left[ q\left( x \right)\right]^2}\left[ f(x) \right]^2 \right\}-\left\{ {\Bbb E}_{x \sim q(x)}\left[  \frac{p\left( x \right)}{q\left( x \right)}f(x) \right] \right\}^2\\ &={\Bbb E}_{x \sim p(x)}\left\{  \underline{\frac{ p\left( x \right) }{q\left( x \right)}}\left[ f(x) \right]^2 \right\}-\left\{ {\Bbb E}_{x \sim p(x)}\left[f(x) \right] \right\}^2\\ \end{align*}

举例说明存在的问题:

蓝线代表分布 p(x) ,绿线代表分布 q(x) ,红线代表函数 f(x) ,现在从 p(x)q(x) 分布中采样出 x ,投到 f(x) 中计算。

可以看出 p(x)q(x) 分布对于 f(x) 的计算而言差别是很大的,因为在蓝线附近采样到的 x 丢到 f(x) 中算出来的是负值,而绿线附近采样到的 x 丢到 f(x) 中算出的是正值。

现在关注 {\Bbb E}_{x \sim q(x)}\left[ \frac{p\left( x \right)}{q\left( x \right)}f(x) \right] ,如果对 q(x) 分布采样得不够多,只在红线右边得到6个绿点,那么 p(x)q(x)f(x) 都是正的,则 {\Bbb E}_{x \sim q(x)}\left[ \frac{p\left( x \right)}{q\left( x \right)}f(x) \right] 恒为正;但是如果采样到红线左边的1个绿点(概率很小),则 f(x) 为负,同时 f(x) 乘上的importance weight是一个很大的正值,这样会得到一个比较大的负值,对期望起到平衡作用,期望有可能变成负的。所以要求 \theta\theta' 要比较接近。


On-policy PG到Off-policy PG

所以,off-policy的做法就是让 p_{\theta'}(\tau)p_\theta(\tau) 做示范,即从分布 p_{\theta'}(\tau) 的采样数据,同时用importance weight做修正:

\begin{align*}  \nabla_\theta U\left( \theta \right) &= {\Bbb E}_{\tau \sim p_\theta(\tau)}\left[ R\left( \tau \right) \nabla_{\theta}{\textrm{log}}p_\theta\left( \tau \right) \right] \end{align*} ---> \begin{align*}  \nabla_\theta U\left( \theta \right) &= {\Bbb E}_{\tau \sim p_{\theta'}(\tau)}\left[ \frac{p_\theta\left( \tau \right)}{p_{\theta'}(\tau)}R\left( \tau \right) \nabla_{\theta}{\textrm{log}}p_\theta\left( \tau \right) \right] \end{align*}

R(\tau) 写成Advantage function的形式,并将轨迹分解成状态和动作,可以得到:

\begin{align*}  {\text{Gradient for Update}} &=\Bbb E_{\left( s_t,a_t \right)\sim{\pi_{\theta}}}\left[ A^{\theta}\left( s_t,a_t \right)\nabla_{\theta} {\text{log}} p_{\theta}\left( a^n_t|s_t^n \right) \right]\\ &=\Bbb E_{\left( s_t,a_t \right)\sim{\pi_{\theta'}}}\left[ \frac{p_{\theta}(s_t,a_t)}{p_{\theta'}(s_t,a_t)}A^{\theta}\left( s_t,a_t \right)\nabla_{\theta} {\text{log}} p_{\theta}\left( a^n_t|s_t^n \right) \right]\\ \end{align*}

值得注意的是,用On-policy计算 A^{\theta}\left( s_t,a_t \right) 时,是 \theta 与环境互动得来的,但现在是 \theta' 与环境互动,所以应该是 A^{\theta'}\left( s_t,a_t \right)

\begin{align*}  {\text{Gradient for Update}} &=\Bbb E_{\left( s_t,a_t \right)\sim{\pi_{\theta'}}}\left[ \frac{p_{\theta}(s_t,a_t)}{p_{\theta'}(s_t,a_t)}A^{\theta'}\left( s_t,a_t \right)\nabla_{\theta} {\text{log}} p_{\theta}\left( a^n_t|s_t^n \right) \right]\\ \end{align*}

接下来,将 p_{\theta}(s_t,a_t) 拆解成 p_{\theta}(a_t|s_t)p_{\theta}(s_t)

\begin{align*}  {\text{Gradient for Update}} &=\Bbb E_{\left( s_t,a_t \right)\sim{\pi_{\theta'}}}\left[ \frac{p_{\theta}(a_t|s_t)}{p_{\theta'}(a_t|s_t)}\frac{p_{\theta}(s_t)}{p_{\theta'}(s_t)}A^{\theta'}\left( s_t,a_t \right)\nabla_{\theta} {\text{log}} p_{\theta}\left( a^n_t|s_t^n \right) \right]\\ \end{align*}

假设, \theta 与环境互动看到 s_t 的几率与 \theta' 与环境互动看到 s_t 的几率相同,即 {p_{\theta}(s_t)}={p_{\theta'}(s_t)}

\begin{align*}  {\text{Gradient for Update}} &=\Bbb E_{\left( s_t,a_t \right)\sim{\pi_{\theta'}}}\left[ \frac{p_{\theta}(a_t|s_t)}{p_{\theta'}(a_t|s_t)}A^{\theta'}\left( s_t,a_t \right)\nabla_{\theta} {\text{log}} p_{\theta}\left( a^n_t|s_t^n \right) \right] \end{align*}

由此反推得到的目标函数: \begin{align*}   U\left( \theta \right)  &={\Bbb E}_{(s_t,a_t) \sim \pi_{\theta'}}\left[ \frac{p_{\theta}(a_t|s_t)}{p_{\theta'}(a_t|s_t)}A^{\theta'}\left( s_t,a_t \right) \right]  \end{align*}

\nabla f(x)=f(x)\nabla{\text{log}f(x)}

Proximal Policy Optimization(KL Penalty)

前面讲过,要求 \theta\theta' 要比较接近,否则采用重要性采样时效果会很差。

PPO算法的原理,就是在目标函数后加一个约束KL散度 \beta {\textrm{KL}}\left( \theta,\theta' \right) ,来保证 \theta\theta' 的相似性,这个约束就像深度学习中的正则化项。TRPO也是同样的思想,但是很难计算,建议就用PPO。

\beta 其实和学习率有点类似,需要手动设置。我们可以设定两个阈值 {\text {KL}}_{max}{\text {KL}}_{min} ,如果算出来的KL散度 \beta {\textrm{KL}}\left( \theta,\theta' \right) 大于 {\text {KL}}_{max} ,说明 \theta\theta' 相差太大,需要加大 \beta ,加大惩罚。反之则减小 \beta ,减小惩罚。

伪代码如下:


Proximal Policy Optimization(CLIP)

还有一种PPO2,是PPO的简化。PPO2原始的公式为:

里面是对 r_t(\theta){\hat A}_t{\text{clip}}(r_t(\theta),1-\epsilon,1+\epsilon){\hat A}_t 取最小值 min。

clip函数的意思是:

如果 r_t(\theta) 小于 1-\epsilon ,则取 1-\epsilon
r_t(\theta) 大于 1+\epsilon 则取 1+\epsilon
若介于两者之间,则取 r_t(\theta)

clip函数的图像为(其中横坐标是 r_t(\theta) ):

现在综合考虑min中的两项,第二项对应上图蓝色的折线,第一项对应下图绿色的斜线,若 {\hat A}_t>0 ,则取下图左边红线部分,若 {\hat A}_t<0 则取下图右边红色部分:

这个式子其实就是让 \theta\theta' 不要差距太大。如果 {\hat A}_t>0 ,代表当前的action是好的,所以我们希望 r_t(\theta) 越大越好(即横轴代表的 r_t(\theta) 增大),但是 \theta\theta' 二者不能相差太多,所以设了一个上界 1+\epsilon (上图左边); {\hat A}_t<0 ,则说明当前的action不好,所以希望 r_t(\theta) 越小越好,但同样要设一个下界 1-\epsilon


代码

链接:CoderWangcai/RL_GYM

以后会将代码整合在这里,还请大家多多star~


tf_agents

未完待续~


请批评指正~

编辑于 2019-08-21

文章被以下专栏收录