从REINFORCE到PPO,看Policy Gradient的前世今生

Policy Gradient和Q-learning可以说是model-free RL的两大阵营。前者是off-line、on-policy的方法,后者是on-line、off-policy的方法。前者是策略迭代,关心的是策略网络的参数;后者是值迭代,关心的是值网络的输出。随着RL的不断发展,这两类方法在不断交错领跑的过程中交汇融合,不断给我们带来新的惊喜。

本文重点在介绍Policy Gradient方法,从其“初心”出发,通过一步步的推导来讲述新的算法。后半部分的重点将放在兼具漂亮理论基础和简洁代码实现的PPO方法上,欢迎RL入门级的小朋友们一起讨论学习!

Policy Gradient

如果你已经了解了DQN,也许会想到这样一个问题:为什么一定要用值函数来做决策(当然这个想法也是很自然的),为什么不绕过值函数直接用神经网络来表示策略呢?
当然,想要讨论清楚这个问题不是很容易,有很多不同的看法,感兴趣的小朋友可以看一下知乎上对问题RL两大类算法的本质区别?(Policy Gradient 和 Q-Learning)
南京大学俞杨老师的答案,很有启发性。

让我们再退一步,我们想要的东西到底是什么呢?其实就是让我们采取策略的期望收益最大化!

θ∗=argmaxθEτ∼pθ(τ)r(τ)J(θ) θ ∗ = arg ⁡ max θ ⁡ E τ ∼ p θ ( τ ) r ( τ ) ⏟ J ( θ )

\theta^*= \mathop{\arg\max}_{\theta} \underbrace{E_{\tau \sim p_\theta (\tau) } r(\tau)} _ {J(\theta)}

τ τ \tau表示一条样本轨迹,策略所影响的,是样本轨迹 τ τ \tau出现的概率,也就是 pθ(τ) p θ ( τ ) p_\theta (\tau)。

那么 r(τ) r ( τ ) r(\tau)和 pθ(τ) p θ ( τ ) p_\theta(\tau)指的具体是什么呢?我们再进一步展开来写一下:

r(τ)=∑tr(st,at)pθ(τ)=p(s1)∏tπθ(at|st)p(st+1|st,at) r ( τ ) = ∑ t r ( s t , a t ) p θ ( τ ) = p ( s 1 ) ∏ t π θ ( a t | s t ) p ( s t + 1 | s t , a t )

r(\tau)= \sum_t r(s_t,a_t) \\ p_\theta (\tau) = p(s_1) \prod_t { \pi_\theta (a_t|s_t) p(s_{t+1}|s_t, a_t) }

注意,这里的 τ τ \tau和 t t t的含义不同,τ" role="presentation">ττ\tau是样本轨迹, t t t是样本轨迹上的时间。仔细看pθ(τ)" role="presentation">pθ(τ)pθ(τ)p_\theta(\tau)我们就会发现,将概率展开以后实际上我们的策略可以影响的只有 πθ(at|st) π θ ( a t | s t ) \pi_\theta (a_t|s_t),也就是在状态 st s t s_t下采取动作 at a t a_t的概率。这也就是我们策略的数学表示。

REINFORCE

现在我们就可以再向前走一步,按照机器学习的一般思路,我已经定义好了我的目标函数 J(θ) J ( θ ) J(\theta),如果可以求出它的梯度 ∇θJ(θ) ∇ θ J ( θ ) \nabla_\theta J(\theta),我们就可以梯度下降了!为了求梯度,我们将 J(θ) J ( θ ) J(\theta)改写成积分的形式:

J(θ)∇θJ(θ)=Eτ∼pθ(τ)r(τ)=∫pθ(τ)r(τ)dτ=∫∇θpθ(τ)r(τ)dτ=∫pθ(τ)∇θlogpθ(τ)r(τ)dτ=Eτ∼pθ(τ)∇θlogpθ(τ)r(τ) J ( θ ) = E τ ∼ p θ ( τ ) r ( τ ) = ∫ p θ ( τ ) r ( τ ) d τ ∇ θ J ( θ ) = ∫ ∇ θ p θ ( τ ) r ( τ ) d τ = ∫ p θ ( τ ) ∇ θ log ⁡ p θ ( τ ) r ( τ ) d τ = E τ ∼ p θ ( τ ) ∇ θ log ⁡ p θ ( τ ) r ( τ )

\begin{align*} J(\theta) &= E_{\tau \sim p_\theta (\tau)} r(\tau)=\int p_\theta (\tau) r(\tau) d\tau \\ \nabla_\theta J(\theta) &= \int \nabla_\theta p_\theta (\tau) r(\tau) d\tau \\ &= \int p_\theta (\tau) \nabla_\theta \log p_\theta (\tau) r(\tau) d\tau \\ &= E_{\tau \sim p_\theta (\tau) } \nabla_\theta \log p_\theta (\tau) r(\tau) \end{align*}

这里用到了一个小技巧, ∇θpθ(τ)=pθ(τ)∇θpθ(τ)pθ(τ)=pθ(τ)∇θlogpθ(τ) ∇ θ p θ ( τ ) = p θ ( τ ) ∇ θ p θ ( τ ) p θ ( τ ) = p θ ( τ ) ∇ θ log ⁡ p θ ( τ ) \nabla_\theta p_\theta (\tau) = p_\theta (\tau) \dfrac {\nabla_\theta p_\theta (\tau)} { p_\theta (\tau)} = p_\theta (\tau) \nabla_\theta \log p_\theta (\tau) ,这样做的目的是把 pθ(τ) p θ ( τ ) p_\theta (\tau)重新拿到外边来,就可以再写成期望的形式了。

现在公式中的自变量仍然是 τ τ \tau,实际应用中我们不可能直接对 τ τ \tau求导,因此我们再把 pθ(τ) p θ ( τ ) p_\theta(\tau)带进来看看能不能将 τ τ \tau给替换为我们可以操作的 st s t s_t、 at a t a_t,

∇θlogpθ(τ)∇θJ(θ)=∇θlogp(s1)0+∑t⎡⎣⎢∇θlogπθ(at|st)+∇θlogp(st+1|st,at)0⎤⎦⎥=∑t∇θlogπθ(at|st)=Eτ∼pθ(τ)[∑t∇θlogπθ(at|st)][∑tr(st,at)] ∇ θ log ⁡ p θ ( τ ) = ∇ θ log ⁡ p ( s 1 ) ⏟ 0 + ∑ t [ ∇ θ log ⁡ π θ ( a t | s t ) + ∇ θ log ⁡ p ( s t + 1 | s t , a t ) ⏟ 0 ] = ∑ t ∇ θ log ⁡ π θ ( a t | s t ) ∇ θ J ( θ ) = E τ ∼ p θ ( τ ) [ ∑ t ∇ θ log ⁡ π θ ( a t | s t ) ] [ ∑ t r ( s t , a t ) ]

\begin{align*} \nabla_\theta \log p_\theta (\tau) &= \underbrace { \nabla_\theta \log p(s_1) }_0+ \sum_t { \left[ \nabla_\theta \log \pi_\theta (a_t|s_t) + \underbrace { \nabla_\theta \log p(s_{t+1}|s_t, a_t) }_0 \right] } \\ &= \sum_t { \nabla_\theta \log \pi_\theta (a_t|s_t) } \\ \nabla_\theta J(\theta) &= E_{\tau \sim p_\theta (\tau)} \left[ \sum_t { \nabla_\theta \log \pi_\theta (a_t|s_t) } \right] \left[ \sum_t r(s_t,a_t) \right]\end{align*}

于是,我们也就得到了我们的第一个算法REINFORCE:

  1. 用参数为 θ θ \theta的策略 πθ(a|s) π θ ( a | s ) \pi_\theta(a|s)采样N条样本轨迹 τi τ i {\tau_i}
  2. 估计梯度 ∇θJ(θ)≈1N∑i(∑t∇θlogπθ(at|st))(∑tr(st,at)) ∇ θ J ( θ ) ≈ 1 N ∑ i ( ∑ t ∇ θ log ⁡ π θ ( a t | s t ) ) ( ∑ t r ( s t , a t ) ) \nabla_\theta J(\theta) \approx \dfrac{1}{N}\sum_i \left( \sum_t { \nabla_\theta \log \pi_\theta (a_t|s_t) } \right) \left( \sum_t r(s_t,a_t) \right)
  3. 更新参数 θ←θ+α∇θJ(θ) θ ← θ + α ∇ θ J ( θ ) \theta \gets \theta + \alpha \nabla_\theta J(\theta) ,重复1

可以将 ∇θJ(θ) ∇ θ J ( θ ) \nabla_\theta J(\theta) 看成这样的两部分: ∑tlogπθ(at|st) ∑ t log ⁡ π θ ( a t | s t ) \sum_t \log \pi_\theta (a_t|s_t)是改进策略的方向, ∑tr(st,at) ∑ t r ( s t , a t ) \sum_t r(s_t,a_t)是改进策略的步长,回报大的就走一大步,回报小的就走一小步,回报为负就往反方向走一步。

Actor-Critic

REINFORCE方法缺点很多,它的效率是非常低的,其中一个非常重要的原因就是方差非常大。 ∑tr(st,at) ∑ t r ( s t , a t ) \sum_t r(s_t,a_t) 是每一次仿真的结果,如果效果好了就会对这一次仿真的所有决策奖励,效果不好了就会全部惩罚,这显然是有问题的。
让我们再来好好看一下 ∇θJ(θ) ∇ θ J ( θ ) \nabla_\theta J(\theta)的计算过程

∇θJ(θ)=Eτ∼pθ(τ)[∑t∇θlogπθ(at|st)][∑t′=0∞r(st′,at′)] ∇ θ J ( θ ) = E τ ∼ p θ ( τ ) [ ∑ t ∇ θ log ⁡ π θ ( a t | s t ) ] [ ∑ t ′ = 0 ∞ r ( s t ′ , a t ′ ) ]

\nabla_\theta J(\theta)=E_{\tau \sim p_\theta (\tau)} \left[ \sum_t { \nabla_\theta \log \pi_\theta (a_t|s_t) } \right] \left[ \sum_{t'=0}^{\infty} r(s_{t'},a_{t'}) \right]

如果 t2>t1 t 2 > t 1 t_2>t_1, πθ(at2|st2) π θ ( a t 2 | s t 2 ) \pi_\theta (a_{t_2}|s_{t_2})理论上是不会对 ∑t1t=0r(st,at) ∑ t = 0 t 1 r ( s t , a t ) \sum_{t=0}^{t_1} r(s_t,a_t) 产生影响的。因此上面的计算式可以改进成为

∇θJ(θ)=Eτ∼pθ(τ)[∑t∇θlogπθ(at|st)∑t′=t∞r(st′,at′)] ∇ θ J ( θ ) = E τ ∼ p θ ( τ ) [ ∑ t ∇ θ log ⁡ π θ ( a t | s t ) ∑ t ′ = t ∞ r ( s t ′ , a t ′ ) ]

\nabla_\theta J(\theta)=E_{\tau \sim p_\theta (\tau)} \left[ \sum_t { \nabla_\theta \log \pi_\theta (a_t|s_t) } \sum_{t'=t}^{\infty} r(s_{t'},a_{t'}) \right]

实际上, Qt=∑∞t′=tr(st′,at′) Q t = ∑ t ′ = t ∞ r ( s t ′ , a t ′ ) Q_t=\sum_{t'=t}^{\infty} r(s_{t'},a_{t'})和我们对Q因子的定义非常接近了,都是从时刻 t t t开始到结束时的收益。

我们已经减少了一些方差了,能不能再减小呢?我们都知道,对于随机变量X" role="presentation">XXX,其方差 DX=EX2−(EX)2 D X = E X 2 − ( E X ) 2 DX=EX^2-(EX)^2,如果 EX2 E X 2 EX^2比较小的话,那么方差就会小了。自然想到给 r(τ) r ( τ ) r(\tau)减去一个值,即 r(τ)←r(τ)−b r ( τ ) ← r ( τ ) − b r(\tau) \gets r(\tau)-b,选择合适的 b b b(比如1N∑ir(τi)" role="presentation">1N∑ir(τi)1N∑ir(τi)\dfrac{1}{N}\sum_i r(\tau_i)),那么方差就会变小了。方差小了,结果会不会变呢?答案是不变的,我们来证明一下:

E[∇θlogπθ(τ)b]=∫πθ(τ)∇θlogπθ(τ)bdτ=∫∇θπθ(τ)bdτ=b∫∇θπθ(τ)dτ=b∇θ∫πθ(τ)dτ=b∇θ1=0 E [ ∇ θ log ⁡ π θ ( τ ) b ] = ∫ π θ ( τ ) ∇ θ log ⁡ π θ ( τ ) b d τ = ∫ ∇ θ π θ ( τ ) b d τ = b ∫ ∇ θ π θ ( τ ) d τ = b ∇ θ ∫ π θ ( τ ) d τ = b ∇ θ 1 = 0

E [\nabla_\theta \log \pi_\theta(\tau) b] = \int \pi_\theta(\tau) \nabla_\theta \log \pi_\theta(\tau) b d\tau = \int \nabla_\theta \pi_\theta(\tau) b d\tau = b \int \nabla_\theta \pi_\theta(\tau) d\tau =b \nabla_\theta \int \pi_\theta(\tau) d\tau= b \nabla_\theta 1 = 0

所以只要 b b b本身是与τ" role="presentation">ττ\tau无关的,那么我们就可以这样做!上面的证明是以 τ τ \tau为自变量的,其实当我们用 Qt Q t Q_t时一样可以推出这个结果。

b b b的选取成为了另一个问题。理论上可以推出一个最优的b" role="presentation">bbb,不过应用中我们会用 Vt V t V_t估计 b b b。也就是说用另外的一个网络来估计Q(st,at)" role="presentation">Q(st,at)Q(st,at)Q(s_t,a_t), V(st)=Eat∼πθ(at|st)Q(st,at) V ( s t ) = E a t ∼ π θ ( a t | s t ) Q ( s t , a t ) V(s_t)=E_{a_t \sim \pi_\theta(a_t|s_t)}Q(s_t,a_t),这样就有

∇θJ(θ)=Eτ∼pθ(τ)[∑t∇θlogπθ(at|st)[Q(st,at)−V(st)])] ∇ θ J ( θ ) = E τ ∼ p θ ( τ ) [ ∑ t ∇ θ log ⁡ π θ ( a t | s t ) [ Q ( s t , a t ) − V ( s t ) ] ) ]

\nabla_\theta J(\theta)=E_{\tau \sim p_\theta (\tau)} \left[ \sum_t { \nabla_\theta \log \pi_\theta (a_t|s_t) } [Q(s_t,a_t)-V(s_t)]) \right]

是不是看上去舒服多了?对DQN熟悉的小朋友们就可以用上熟悉的值网络了,不过这次我们的目的是通过估计值网络来帮助更新策略网络。

Q(st,at)−V(st) Q ( s t , a t ) − V ( s t ) Q(s_t,a_t)-V(s_t)实际上就是我们的优势函数 A(st,at) A ( s t , a t ) A(s_t,a_t)。对于连续动作的问题, Q(st,at) Q ( s t , a t ) Q(s_t,a_t)是比较难用网络表示的,即使表示出来也难以由 Q(st,at) Q ( s t , a t ) Q(s_t,a_t)直接求出 V(st) V ( s t ) V(s_t)。因此,有时候我们会选择直接估计 V(st) V ( s t ) V(s_t),用 r(st,at)+V(st+1)−V(st) r ( s t , a t ) + V ( s t + 1 ) − V ( s t ) r(s_t,a_t)+V(s_{t+1})-V(s_t)来估计 A(st,at) A ( s t , a t ) A(s_t,a_t)。注意,这里又是估计的量, r(st,at)+V(st+1)−V(st) r ( s t , a t ) + V ( s t + 1 ) − V ( s t ) r(s_t,a_t)+V(s_{t+1})-V(s_t)和 A(st,at) A ( s t , a t ) A(s_t,a_t)之间是有偏的。自从我们选择了用估计的 Q(st,at) Q ( s t , a t ) Q(s_t,a_t)代替 ∑∞t′=tr(st′,at′) ∑ t ′ = t ∞ r ( s t ′ , a t ′ ) \sum_{t'=t}^{\infty} r(s_{t'},a_{t'})开始,我们就一直在牺牲偏差来降低方差,以提高我们的学习速度。

Actor-Critic是一个算法框架,这里给出其中一种的算法流程:

  1. 用参数为 θ θ \theta的策略 πθ(a|s) π θ ( a | s ) \pi_\theta(a|s)采样N个状态转移 {si,ai,ri,s′i} { s i , a i , r i , s i ′ } \{ s_i,a_i,r_i,s'_i \}
  2. 更新值网络参数 ϕ ϕ \phi使得 Vϕ(si)←ri+Vϕ(s′i) V ϕ ( s i ) ← r i + V ϕ ( s i ′ ) V_\phi(s_i) \gets r_i+V_\phi(s'_i)
  3. 估计 A^(si,ai)=ri+V(s′i)−V(si) A ^ ( s i , a i ) = r i + V ( s i ′ ) − V ( s i ) \hat{A}(s_i,a_i) = r_i + V(s'_i) - V(s_i)
  4. 估计梯度 ∇θJ(θ)≈1N∑i∇θlogπθ(ai|si)A^(si,ai) ∇ θ J ( θ ) ≈ 1 N ∑ i ∇ θ log ⁡ π θ ( a i | s i ) A ^ ( s i , a i ) \nabla_\theta J(\theta) \approx \dfrac{1}{N}\sum_i \nabla_\theta \log \pi_\theta (a_i|s_i) \hat{A}(s_i,a_i)
  5. 更新参数 θ←θ+α∇θJ(θ) θ ← θ + α ∇ θ J ( θ ) \theta \gets \theta + \alpha \nabla_\theta J(\theta) ,重复1

除了用值函数来估计 A^(s,a) A ^ ( s , a ) \hat{A}(s,a) ,Actor-Critic框架中至少还可以使用以下形式(我们基本上都讨论过了):

  1. ∑∞t=0rt ∑ t = 0 ∞ r t \sum_{t=0}^{\infty}r_t —— 轨迹的总回报
  2. ∑∞t′=trt′ ∑ t ′ = t ∞ r t ′ \sum_{t'=t}^{\infty}r_{t'} —— 动作后的回报
  3. ∑∞t′=trt′−b(st) ∑ t ′ = t ∞ r t ′ − b ( s t ) \sum_{t'=t}^{\infty}r_{t'}-b\left(s_t\right) —— 减去基线
  4. Qπ(st,at) Q π ( s t , a t ) Q^{\pi}\left(s_t,a_t\right) —— 状态-行为值函数
  5. Aπ(st,at) A π ( s t , a t ) A^{\pi}\left(s_t,a_t\right) —— 优势函数
  6. rt+Vπ(st+1)−Vπ(st) r t + V π ( s t + 1 ) − V π ( s t ) r_t+V^{\pi}\left(s_{t+1}\right)-V^{\pi}\left(s_t\right) —— 时序差分误差(TD error)

PPO

截至目前,上述提到的算法都还有一些共同的问题。其中一个非常大的问题就是参数空间的距离并不等于策略空间的距离,也就是说在不同的状态下改变相同步长的网络参数,产生策略的概率改变是不同的,而且差异非常大!以下图为例,一个最简单的sigmoid函数输出在同样的参数步长下的输出是变化很大的!

再换句话说,我们希望可以找到一种方法,来自动调整参数空间的步长,以达到策略空间均匀变化的目的。

为了达到这样一个目标,我们需要知道不同的两个策略其目标函数的差异有多少,如果可以有效的评价出这个差值,那么我们就可以根据它来调整我们的策略了。幸运的是,两个策略目标函数的差值之间存在着这样一个关系

J(π′)−J(π)=Eτ∼π′[∑t=0∞γtAπ(st,at)] J ( π ′ ) − J ( π ) = E τ ∼ π ′ [ ∑ t = 0 ∞ γ t A π ( s t , a t ) ]

J(\pi') - J(\pi) = E_{\tau \sim \pi' } \left[ \sum_{t=0}^\infty \gamma^tA^\pi(s_t,a_t) \right]

这里 π π \pi是参数化的策略 πθ(at|st) π θ ( a t | s t ) \pi_\theta (a_t|s_t), π′ π ′ \pi'则是更新后的策略。证明过程这里提示两点,一是 J(π)=Eτ∼π′[∑∞t=0γtrt] J ( π ) = E τ ∼ π ′ [ ∑ t = 0 ∞ γ t r t ] J(\pi) = E_{\tau \sim \pi'} \left[ \sum_{t=0}^\infty \gamma^tr_t \right],二是 A(st,at)=rt+V(st+1,at+1)−V(st,at) A ( s t , a t ) = r t + V ( s t + 1 , a t + 1 ) − V ( s t , a t ) A(s_t,a_t) = r_t + V(s_{t+1}, a_{t+1}) - V(s_t, a_t),代入上式即可。

下面的问题是,我们怎么利用上面这个关系呢?请注意,上式的采样是在新的策略 π′ π ′ \pi' 下进行的,但我们还不知道新的策略是什么怎么采样呢,这不是因果矛盾了吗?难道我们要一个一个策略去试选个最好的?当你想在不同的分布下去估计某个期望,那一定绕不开重要性采样(Importance Sampling),不懂的同学请自行百度。

我们引入一个新的概念,叫折扣状态分布,定义是 dπ(s)=(1−γ)∑∞t=0γtP(st=s|π) d π ( s ) = ( 1 − γ ) ∑ t = 0 ∞ γ t P ( s t = s | π ) d^\pi(s) = (1-\gamma) \sum_{t=0}^\infty \gamma^t P(s^t=s | \pi),直观理解就是在时间上更近的地方考虑的更多一些。在这个分布下,就有关系如下:

J(π′)−J(π)=Eτ∼π′[∑t=0∞γtAπ(st,at)]=11−γEst∼dπ′,at∼π′[Aπ(st,at)]=11−γEst∼dπ′,at∼π[π′(at|st)π(at|st)Aπ(st,at)] J ( π ′ ) − J ( π ) = E τ ∼ π ′ [ ∑ t = 0 ∞ γ t A π ( s t , a t ) ] = 1 1 − γ E s t ∼ d π ′ , a t ∼ π ′ [ A π ( s t , a t ) ] = 1 1 − γ E s t ∼ d π ′ , a t ∼ π [ π ′ ( a t | s t ) π ( a t | s t ) A π ( s t , a t ) ]

\begin{align*} J(\pi') - J(\pi) &= E_{\tau \sim \pi' } \left[ \sum_{t=0}^\infty \gamma^tA^\pi(s_t,a_t) \right] \\ &= \dfrac {1} { 1-\gamma} E_{s_t \sim d^{\pi'}, a_t \sim \pi' } \left[ A^\pi (s_t, a_t) \right] \\ &= \dfrac {1} { 1-\gamma} E_{s_t \sim d^{\pi'}, a_t \sim \pi } \left[ \dfrac{\pi'(a_t|s_t)}{\pi(a_t|s_t)}A^\pi (s_t, a_t) \right] \\ \end{align*}

这一部分可能比较难理解,我们一步步来解释一下。第一个等号这里做的事情是将轨迹 τ τ \tau拆开到每一个时间步上来看,然后将 P(st=s|π) P ( s t = s | π ) P(s^t=s | \pi) 放到了求期望的角标里,也就是说考虑成了在 dπ′(s) d π ′ ( s ) d^{\pi'}(s) 这种折扣分布条件下的期望。第二步就是用了重要性采样,解决了我们上面说到的 π′ π ′ \pi'我们还不知道的问题。

等等! at a t a_t 是只和 π π \pi 有关了,但是 st s t s_t 不还是和 π′ π ′ \pi' 有关吗?是的。但 dπ(s) d π ( s ) d^{\pi}(s) 和 dπ′(s) d π ′ ( s ) d^{\pi'}(s) 已经很接近了,理论证明如果 π π \pi和 π′ π ′ \pi'足够接近,那么其评价函数之差将满足

|J(π′)−(J(π)+Lπ(π′))|≤CEst[DKL(π′||π)]−−−−−−−−−−−−√ | J ( π ′ ) − ( J ( π ) + L π ( π ′ ) ) | ≤ C E s t [ D K L ( π ′ | | π ) ]

|J(\pi') - \left(J(\pi) + L_{\pi}(\pi')\right)| \le C \sqrt {E_{s_t} [ D_{KL}(\pi'||\pi)] }

Lπ(π′)=11−γEst∼dπ,at∼π[π′(at|st)π(at|st)Aπ(st,at)] L π ( π ′ ) = 1 1 − γ E s t ∼ d π , a t ∼ π [ π ′ ( a t | s t ) π ( a t | s t ) A π ( s t , a t ) ]

L_{\pi}(\pi') = \dfrac {1} { 1-\gamma} E_{s_t \sim d^{\pi}, a_t \sim \pi } \left[ \dfrac{\pi'(a_t|s_t)}{\pi(a_t|s_t)}A^\pi (s_t, a_t) \right]

其中 DKL(π′||π) D K L ( π ′ | | π ) D_{KL}(\pi'||\pi) 是 π π \pi和 π′ π ′ \pi'之间的KL散度,用以衡量两个分布之间的距离。现在,所有的分布中就没有需要从 π′ π ′ \pi'进行采样的了。我们只需要计算一下更新参数后的 π π \pi和 π′ π ′ \pi'之间的比值已经KL散度,就可以估计两个策略之间的评价函数的差异了。

虽然现在已经很简单了,但 DKL(π′||π) D K L ( π ′ | | π ) D_{KL}(\pi'||\pi) 这个东西还是有点让我们伤脑筋,毕竟每一次更新参数都要判断一下这个条件是不是满足。为了解决这个问题,又有一系列的方法出现,比如用近似的方法去估计出最优解,再比如将 DKL(π′||π) D K L ( π ′ | | π ) D_{KL}(\pi'||\pi) 作为惩罚项加入到loss中。但是这些方法实现起来都比较麻烦,就是那种看都不想看一眼的麻烦。

于是,PPO就粉墨登场了。PPO其实就是近似的求解,原文中提到了两种方式来近似,一种是自动调整对KL散度的惩罚因子,一种是用clip的方法巧妙地构造了一个新的目标函数。因为第二种方法用过的都说好,我们重点来介绍一下它。

很简单,原来的方案中下一轮的参数 θk+1 θ k + 1 \theta_{k+1} 满足

θk+1=argmaxθLθk(θ)s.t.DKL(θk+1||θk)<δLθk(θ)=Eτ∼πk∑t=0∞[πθ(at|st)πθk(at|st)Aπθk(st,at)] θ k + 1 = arg ⁡ max θ ⁡ L θ k ( θ ) s . t . D K L ( θ k + 1 | | θ k ) < δ L θ k ( θ ) = E τ ∼ π k ∑ t = 0 ∞ [ π θ ( a t | s t ) π θ k ( a t | s t ) A π θ k ( s t , a t ) ]

\theta_{k+1} =\mathop{\arg\max}_{\theta} L_{\theta_k}(\theta) \\ s.t. D_{KL}(\theta_{k+1}||\theta_k)

现在换一种近似的目标函数

θk+1=argmaxθLclipθk(θ)Lclipθk(θ)=Eτ∼πk∑t=0∞[min(rt(θ)Aπθk(st,at),clip(rt(θ),1−ϵ,1+ϵ)Aπθk(st,at))]rt(θ)=πθ(at|st)πθk(at|st) θ k + 1 = arg ⁡ max θ ⁡ L θ k c l i p ( θ ) L θ k c l i p ( θ ) = E τ ∼ π k ∑ t = 0 ∞ [ m i n ( r t ( θ ) A π θ k ( s t , a t ) , c l i p ( r t ( θ ) , 1 − ϵ , 1 + ϵ ) A π θ k ( s t , a t ) ) ] r t ( θ ) = π θ ( a t | s t ) π θ k ( a t | s t )

\theta_{k+1} =\mathop{\arg\max}_{\theta} L^{clip}_{\theta_k}(\theta) \\ L^{clip}_{\theta_k}(\theta) = E_{\tau \sim \pi_k } \sum_{t=0}^\infty \left[ min( r_t( \theta ) A^{ \pi_{\theta_k} } (s_t, a_t) , clip(r_t(\theta),1-\epsilon,1+\epsilon) A^{ \pi_{\theta_k} } (s_t, a_t) ) \right] \\ r_t(\theta) = \dfrac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{k}}(a_t|s_t)}

不要被公式的长度给吓到,其实就是控制了 π π \pi和 π′ π ′ \pi'的比值,如果这两个的比值接近那么自然其KL散度也不比较小,反之就剪掉超过的部分,将其比值限制在一个小范围内。这里的 ϵ ϵ \epsilon常取0.1或0.2。原文中还做了对比实验,说明了不同目标函数之间的关系。读图我们可以看到当 ϵ ϵ \epsilon取得很小时, Lclipθk(θ) L θ k c l i p ( θ ) L_{\theta_k}^{clip}(\theta)和 Lθk(θ)−DKL(theta||thetak) L θ k ( θ ) − D K L ( t h e t a | | t h e t a k ) L_{\theta_k}(\theta)-D_{KL}(theta||theta_k)是很接近的。

实验

至此,所有的理论部分都讲完了。我写了一个pytorch在pendulum问题上的小实验,大家感兴趣的可以看一下我的github。训练的效果、训练过程的曲线,还有学到的value和action都贴在了下面。



ppo学到的动作非常光滑,效果也很好。就是相对DQN来说,学的速度比较慢。

感谢阅读!

参考文献

  • UC Berkeley 强化学习课程 CS294-112
  • PPO算法原文 Proximal Policy Optimization Algorithms

从REINFORCE到PPO,看Policy Gradient的前世今生相关推荐

  1. Policy gradient Method of Deep Reinforcement learning (Part One)

    目录 Abstract Part one: Basic knowledge Policy Environment Dynamics Policy Policy Approximation Policy ...

  2. 李宏毅深度强化学习(国语)课程(2018) 笔记(一)Policy Gradient (Review)

    李宏毅深度强化学习(国语)课程(2018) https://www.bilibili.com/video/BV1MW411w79n?spm_id_from=333.337.search-card.al ...

  3. Policy-based RL小结(Policy Gradient ; Natural policy gradient ;TRPO;ACKTR;PPO )

    文章目录 Policy-based RL 前言 1. 预备知识 1.1 策略类型 1.2 策略优化的目标函数 1.2.1 可结束的环境的目标函数 1.2.3 连续动作环境的目标函数 1.2.4 实际的 ...

  4. RL policy gradient 之 A2C, A3C,PPO小总结

    Policy gradient Parameterize policy directly No value function On policy 训练: Because samples can not ...

  5. *、Policy Gradient和PPO(PPO2)

    文章目录 1.基本组成部分 2.policy gradient执行过程 3.执行policy gradient的Tips 3.1 增加一个baseline 3.2 分配合理的reward权重 4.Pr ...

  6. Policy Gradient 之 A3C 与 A2C 算法

    Policy Gradient 之 A3C 与 A2C 算法 Motivation Background Algorithm Policy Gradient Actor-Critic A3C A2C ...

  7. pytorch笔记:policy gradient

    本文参考了 策略梯度PG( Policy Gradient) 的pytorch代码实现示例 cart-pole游戏_李莹斌XJTU的博客-CSDN博客_策略梯度pytorch 在其基础上添加了注释和自 ...

  8. 系统学习深度学习(三十五)--策略梯度(Policy Gradient)

    转自:https://www.cnblogs.com/pinard/p/10137696.html 在前面讲到的DQN系列强化学习算法中,我们主要对价值函数进行了近似表示,基于价值来学习.这种Valu ...

  9. 强化学习6——policy gradient的优化( Use temporal causality,Baseline and Critic)

    policy gradient的优化 听周博雷教授的课程有感 为什么优化 因为基于MC policy gradient的优化,方差较大 方法1: Use temporal causality 使用时序 ...

最新文章

  1. 你面试稳了!通关LeetCode刷题完整攻略,省时又高效
  2. # 中小型网络构建-ACL
  3. 魅蓝android底层是什么,集体去YunOS化:魅蓝2\魅蓝Metal更换安卓底层
  4. python俄罗斯方块代码34行_少儿编程分享:码趣君教你用Python编写俄罗斯方块(四)...
  5. 查看mysql 更新命令_MySQL UPDATE 查询
  6. 【论文复现】使用CNN进行文本分类
  7. centos7 关闭防火墙的指令_Centos7.3防火墙配置
  8. tf.GraphKeys,tf.add_to_collection() 与 tf.get_collection()
  9. 在Eclipse中使用Gradle开发web3j以太坊应用
  10. iPhone客户端开发笔记(二)
  11. 电脑网页截屏怎么截长图?借助Safari对整个网页进行长截图
  12. c语言 从文件中读取车牌,输入一个车牌号写入文件,找出所有后四位是一个完全平方数的车牌号并输出
  13. oracle 打包导出表,数据库导出表数据库
  14. 2013网易实习生招聘 岗位:数据挖掘工程师
  15. FastDFS集群tracker实现负载均衡
  16. elasticsearch rpm安装及详细配置
  17. 2017年美国计算机科学,2017年U.S.News美国大学研究生计算机科学专业排名TOP10
  18. 数据库的视图,视图的更新,视图的可操作性
  19. 离均差oracle 函数,Oracle入门到精通
  20. Bypass部分知识

热门文章

  1. 中国大学MOOC数据库系统概论中国人民大学实验三 触发器
  2. MySQL数据库(三)-表行的语句使用
  3. 按关键字搜索易贝商品 API
  4. php爬虫邮箱邮件,简单网络爬虫实现爬取网页邮箱
  5. [Windows]_[中级]_[界面程序打开控制台输出-转发输出到控制台]
  6. 常见硬件面试题(含答案)盘点,硬件工程师学习笔记
  7. 一图必通 | 计网~TCP、IP
  8. 树叶叶脉的提取及描述
  9. java持久化框架_众里寻他千百度-- 轻量级持久化框架-java-火龙果软件工程
  10. TensorFlow 中的 LRNOp