近端策略优化(PPO, Proximal Policy Optimization)是强化学习中十分重要的一种算法,被 OpenAI 作为默认强化学习算法,在多种强化学习应用中表现十分优异。
换一种拟人的方式来讲:
为什么要考虑使用Off-policy?
我们可以回顾Policy Gradient的过程,Policy Gradient是一种on-policy的方法,他首先要利用现有策略和环境互动,产生学习资料(决策数据 τ \tau τ),然后利用产生的资料,按照Policy Gradient的方法更新策略参数。然后再用新的策略去交互、更新、交互、更新,如此重复。这其中有很多的时间都浪费在了产生资料的过程中,Off-Policy的目的就是更加充分的利用actor产生的交互资料,增加学习效率。
为什么要使用Importance Sampling呢?
我们可以看一下Policy Gradient的梯度公式:
∇ R ˉ ( τ ) = E τ ~ p θ ( τ ) [ A θ ( s t , a t ) ∇ l o g p θ ( a t n ∣ s t n ) ] \nabla\bar{R}(\tau) = E_{\tau~p_\theta(\tau)}[A^\theta(s_t, a_t)\nabla log p_\theta(a_t^n|s_t^n) ] ∇Rˉ(τ)=Eτ~pθ(τ)[Aθ(st,at)∇logpθ(atn∣stn)]
问题在于上面的式子是基于 τ ~ p θ ( τ ) \tau~p_\theta(\tau) τ~pθ(τ)采样的,一旦更新了参数,从 θ \theta θ到 θ ′ \theta' θ′,这个概率 P θ P_{\theta} Pθ就不对了。而Importance Sampling解决的正是从 τ ~ p θ ( τ ) \tau~p_\theta(\tau) τ~pθ(τ)采样,计算 θ ′ \theta' θ′的 ∇ R ˉ ( τ ) \nabla\bar{R}(\tau) ∇Rˉ(τ)的问题。
重要性采样(Importance Sampling)的推导可以点击链接查看,这里直接给出公式:
E x ~ p [ f ( x ) ] = ∫ f ( x ) p ( x ) d x = ∫ f ( x ) p ( x ) q ( x ) q ( x ) d x = E x ~ q [ f ( x ) p ( x ) q ( x ) ] E_{x~p}[f(x)] = \int f(x)p(x)dx = \int f(x) \frac{p(x)}{q(x)}q(x)dx = E_{x~q}[f(x) \frac{p(x)}{q(x)}] Ex~p[f(x)]=∫f(x)p(x)dx=∫f(x)q(x)p(x)q(x)dx=Ex~q[f(x)q(x)p(x)]
上面的式子表示,已知 x x x服从分布 p p p,我们要计算 f ( x ) f(x) f(x),但是 p p p不方便采样,我们就可以通过 q q q去采样,计算期望。
E x ~ q [ f ( x ) p ( x ) q ( x ) ] E_{x~q}[f(x) \frac{p(x)}{q(x)}] Ex~q[f(x)q(x)p(x)]
这里我们用 q q q做采样, p ( x ) q ( x ) \frac{p(x)}{q(x)} q(x)p(x)叫做重要性权重,用来修正 q q q与 p p p两个分布的差异。理论上利用重要性采样的方法我们可以用任何 q q q来完成采样,但是由于采样数量的限制, q q q与 p p p的差异不能太大。如果差异过大, E x ~ q [ f ( x ) p ( x ) q ( x ) ] E_{x~q}[f(x) \frac{p(x)}{q(x)}] Ex~q[f(x)q(x)p(x)]与 E x ~ p [ f ( x ) ] E_{x~p}[f(x)] Ex~p[f(x)]的差异也会很大。
在on-policy情况下,Policy Gradient公式为:
∇ R ˉ ( τ ) = E ( s t , a t ) ~ π θ [ A θ ( s t , a t ) ∇ l o g p θ ( a t n ∣ s t n ) ] \nabla\bar{R}(\tau) = E_{(s_t,a_t)~\pi_\theta}[A^\theta(s_t, a_t)\nabla log p_\theta(a_t^n|s_t^n) ] ∇Rˉ(τ)=E(st,at)~πθ[Aθ(st,at)∇logpθ(atn∣stn)]
由上面的推导可得,我们利用 θ ′ \theta' θ′采样,优化 θ \theta θ时的公式为:
∇ R ˉ ( τ ) = 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 ) ] \nabla\bar{R}(\tau) = E_{(s_t,a_t)~\pi_{\theta'}}[\frac{p_{\theta(s_t,a_t)}}{p_{\theta'(s_t,a_t)}}A^{\theta}(s_t, a_t)\nabla log p_\theta(a_t^n|s_t^n) ] ∇Rˉ(τ)=E(st,at)~πθ′[pθ′(st,at)pθ(st,at)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)表示,所以式子变为:
∇ R ˉ ( τ ) = 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 ) ] \nabla\bar{R}(\tau) = E_{(s_t,a_t)~\pi_{\theta'}}[\frac{p_{\theta(s_t,a_t)}}{p_{\theta'(s_t,a_t)}}A^{\theta'}(s_t, a_t)\nabla log p_\theta(a_t^n|s_t^n) ] ∇Rˉ(τ)=E(st,at)~πθ′[pθ′(st,at)pθ(st,at)Aθ′(st,at)∇logpθ(atn∣stn)]
将 p θ ( s t , a t ) p_{\theta(s_t,a_t)} pθ(st,at)展开可得:
∇ R ˉ ( τ ) = 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 ) ] \nabla\bar{R}(\tau) = E_{(s_t,a_t)~\pi_{\theta'}}[ \frac{p_{\theta(a_t|s_t)}}{p_{\theta'(a_t|s_t)}} \frac{p_{\theta(s_t)}}{p_{\theta'(s_t)}} A^{\theta'}(s_t, a_t)\nabla log p_\theta(a_t^n|s_t^n) ] ∇Rˉ(τ)=E(st,at)~πθ′[pθ′(at∣st)pθ(at∣st)pθ′(st)pθ(st)Aθ′(st,at)∇logpθ(atn∣stn)]
我们认为某一个状态 s t s_t st出现的概率与策略函数无关,只与环境有关,所以可以认为 p θ ( s t ) ≈ p θ ′ ( s t ) p_{\theta(s_t)} \approx p_{\theta'(s_t)} pθ(st)≈pθ′(st),由此得出如下公式:
∇ R ˉ ( τ ) = E ( s t , a t ) ~ π θ ′ [ p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) A θ ′ ( s t , a t ) ∇ l o g p θ ( a t n ∣ s t n ) ] \nabla\bar{R}(\tau) = E_{(s_t,a_t)~\pi_{\theta'}}[ \frac{p_{\theta(a_t|s_t)}}{p_{\theta'(a_t|s_t)}} A^{\theta'}(s_t, a_t)\nabla log p_\theta(a_t^n|s_t^n) ] ∇Rˉ(τ)=E(st,at)~πθ′[pθ′(at∣st)pθ(at∣st)Aθ′(st,at)∇logpθ(atn∣stn)]
根据上面的式子,我们就可以完成off-policy的工作,反推出目标函数为:
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'}}[ \frac{p_{\theta(a_t|s_t)}}{p_{\theta'(a_t|s_t)}} A^{\theta'}(s_t, a_t)] Jθ′(θ)=E(st,at)~πθ′[pθ′(at∣st)pθ(at∣st)Aθ′(st,at)]
J θ ′ ( θ ) J^{\theta'}(\theta) Jθ′(θ)中括号里的 θ \theta θ表示我们要优化的参数, θ ′ \theta' θ′表示实际和环境互动产生样本的Actor的参数,在计算过程中 p θ ′ ( a t ∣ s t ) p_{\theta'(a_t|s_t)} pθ′(at∣st)和 A θ ′ ( s t , a t ) A^{\theta'}(s_t, a_t) Aθ′(st,at)都是根据样本计算出的常数,所以也很好理解,我们优化的目标就是 p θ ( a t ∣ s t ) p_{\theta(a_t|s_t)} pθ(at∣st)。
TRPO
TRPO是PPO的前身,叫做信任区域策略优化(Trust Region Policy Optimization)。其思路如下:优化目标就是我们上面推出的 J θ ′ ( θ ) J^{\theta'}(\theta) Jθ′(θ),但是我们使用了重要性采样,而重要性采样的要求就是原采样和目标采样不能相差太大,这里就是指 π θ \pi_{\theta} πθ和 π θ ′ \pi_{\theta'} πθ′输出的动作不能相差太大。TRPO采用KL散度(KL divergence)的方法来评价二者的差异,记作 K L ( θ , θ ′ ) KL(\theta, \theta') KL(θ,θ′)。算法规定,当进行优化时, K L ( θ , θ ′ ) KL(\theta, \theta') KL(θ,θ′)要小于一个阈值 σ \sigma σ,TRPO公式如下:
J T R P O θ ′ ( θ ) = E ( s t , a t ) ~ π θ ′ [ p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) A θ ′ ( s t , a t ) ] , K L ( θ , θ ′ ) < σ J_{TRPO}^{\theta'}(\theta) = E_{(s_t,a_t)~\pi_{\theta'}}[ \frac{p_{\theta(a_t|s_t)}}{p_{\theta'(a_t|s_t)}} A^{\theta'}(s_t, a_t)],KL(\theta, \theta')<\sigma JTRPOθ′(θ)=E(st,at)~πθ′[pθ′(at∣st)pθ(at∣st)Aθ′(st,at)],KL(θ,θ′)<σ
PPO
TRPO相当于给目标函数增加了一项额外的约束(constrain),而且这个约束并没有体现在目标函数里,在计算过程中这样的约束是很难处理的。PPO的做法就是将这样约束融进了目标函数,其目标函数如下:
J P P O θ ′ ( θ ) = E ( s t , a t ) ~ π θ ′ [ p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) A θ ′ ( s t , a t ) ] − β K L ( θ , θ ′ ) J_{PPO}^{\theta'}(\theta) = E_{(s_t,a_t)~\pi_{\theta'}}[ \frac{p_{\theta(a_t|s_t)}}{p_{\theta'(a_t|s_t)}} A^{\theta'}(s_t, a_t)] - \beta KL(\theta, \theta') JPPOθ′(θ)=E(st,at)~πθ′[pθ′(at∣st)pθ(at∣st)Aθ′(st,at)]−βKL(θ,θ′)
上面的式子我们可以理解为:训练一个累计回报期望更高但是又和 θ ′ {\theta'} θ′很像的 θ {\theta} θ。
PPO算法流程:
上面从 θ k \theta^{k} θk到 θ k + 1 \theta^{k+1} θk+1的优化过程中,可以更新很多次也没有关系,因为我们使用了重要性采样,也对 θ \theta θ的动作空间进行了约束,这一步的目的就是尽可能的最大化目标函数。
针对上面的算法还有一个自使用KL约束的方法,叫做adaptive KL divergence,其实就是动态调整 β \beta β,如下:
这个方法里面要设置一个我们可以接受的KL散度的上限和下限:
PPO2也叫做PPO-Clip,该方法不采用KL散度作为约束,而是采用逻辑上合理的思路设计目标函数,其目标函数如下:
J P P O 2 θ ′ ( θ ) ≈ ∑ ( s t , a t ) min ( p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) A θ ′ ( s t , a t ) , c l i p ( p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) , 1 − ϵ , 1 + ϵ ) A θ ′ ( s t , a t ) ) \begin{aligned} J_{PPO2}^{\theta'}(\theta) \approx \sum_{(s_t, a_t)} \min(&\frac{p_{\theta(a_t|s_t)}}{p_{\theta'(a_t|s_t)}}A^{\theta'}(s_t, a_t), \\ &clip(\frac{p_{\theta(a_t|s_t)}}{p_{\theta'(a_t|s_t)}}, 1-\epsilon, 1+\epsilon) A^{\theta'}(s_t, a_t)) \end{aligned} JPPO2θ′(θ)≈(st,at)∑min(pθ′(at∣st)pθ(at∣st)Aθ′(st,at),clip(pθ′(at∣st)pθ(at∣st),1−ϵ,1+ϵ)Aθ′(st,at))
clip 函数的意思是,在括号里面有三项,分别是(变量,下限,上限),如果变量小于下限,那么就输出下限,大于上限就输出上限,如果在二者之间,就输出变量的值, c l i p ( p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) , 1 − ϵ , 1 + ϵ ) clip(\frac{p_{\theta(a_t|s_t)}}{p_{\theta'(a_t|s_t)}}, 1-\epsilon, 1+\epsilon) clip(pθ′(at∣st)pθ(at∣st),1−ϵ,1+ϵ)的函数图像如下。
直接分析目标函数,我们可以知道这个函数的取值逻辑如下:
知道 J P P O 2 θ k ( θ ) J_{PPO2}^{\theta^k}(\theta) JPPO2θk(θ)的取值逻辑之后,我们就可以来分析将目标函数设计成这样的目的和想法。
目标函数想做的事情就是希望在提升累计期望回报的同时,保证 p θ ( a t ∣ s t ) {p_{\theta(a_t|s_t)}} pθ(at∣st)和 p θ k ( a t ∣ s t ) {p_{\theta^k(a_t|s_t)}} pθk(at∣st)不要差距太大,那他是如何做到的呢?
有一点可以可能不清晰的是,为什么A>0时,下限不做约束,A<0时上限不做约束。原因是,如果A>0, p θ ( a t ∣ s t ) {p_{\theta(a_t|s_t)}} pθ(at∣st)一定朝着变大的方向优化,不可能变小,所以不需要约束下限;A<0时也是同理。