目录

深度强化学习目录

简介

策略梯度(Policy Gradient)的缺点在于采样量大,且每一次更新参数都需要采样n轮,更新完又要去采样……换言之,对游戏数据的利用率很低,太慢了。
这种采样-学习-采样的过程,是一种on-policy策略,接下来我们要将的PPO则不同,是一种off-policy的策略。

符号

本篇中运用到的符号和上一篇中的基本一致。

On/Off Policy

  • On Policy:训练同一个agent,同时还要求他去对环境进行交互。
  • Off Policy:训练的是一个agent,实际和环境交互的是另一个agent。

举个下棋的例子,如果你是通过自己下棋来不断提升自己的棋艺,那么就是on-policy的,如果是通过看别人下棋来提升自己,那么就是off-policy的

Off-poicy的好处是什么?他能重复利用别人的数据来进行训练。我update了1次参数,可以用他的数据来训练;我update了100次参数,还是可以用他的数据来训练。
这听起来似乎是反直觉的:我参数都变了100次了,为什么还能用别人之前得到的数据来训练?这就涉及到一个重要性采样(importance sampling)的问题了。

重要性采样(importance sampling)

重要性采样,即使用q分布来逼近p分布的方法。公式如下:Exp[f(x)]=f(x)p(x)dx=f(x)p(x)q(x)q(x)dx=Exq[f(x)p(x)q(x)] \begin{aligned} \mathbb{E}_{x\sim p}[f(x)]&=\int f(x)p(x)dx\\ &=\int f(x)\frac{p(x)}{q(x)}q(x)dx\\ &=\mathbb{E}_{x\sim q}[f(x)\frac{p(x)}{q(x)}] \end{aligned}
其中,p(x)q(x)\frac{p(x)}{q(x)}叫作重要性权重(importance weight)。
这样,我们就完成用q分布逼近p分布,也即用训练的actor来逼近与环境交互的actor。
实际运用中,p和q的分布不能相差过大,否则需要多次采样才能得到较为近似的结果。
3.Proximal Policy Optimization(PPO)+on/off policy
如上图,当xp(x)x\sim p(x)时,我们采样的p(x)p(x)大部分在右半侧,这是由p的分布决定的。这样的采样会导致我们得到f(x)f(x)结果为正的错误结论。只有当采样数量非常多时,我们才能采样到左半侧的点,这里的点q很小p很大,所以重要性权重p(x)q(x)\frac{p(x)}{q(x)}也很大,这样就会一下把f(x)f(x)的期望值往负数上拉,从而得到正确结果。而这一切的前提在于,足够多的的采样量,如果采样次数不够,可能一直采的都是右半侧的点。
好在实际训练的时候我们可以延迟更新参数θ\theta'(即不断更新分布q(x)q(x)),大概50轮更新一次的样子,这样既能保证pq之间的距离不要太大,训练又不会太慢。

修改Rˉθ\nabla\bar{R}_\theta

在policy gradient(即on-policy)中,有:Rˉθ=Eτpθ(τ)[R(τ)logpθ(τ)]\nabla\bar{R}_\theta=\mathbb{E}_{\tau \sim p_\theta (\tau)}[R(\tau)\nabla logp_\theta(\tau)]
公式作出如下变换:
Rˉθ=Eτpθ(τ)[pθ(τ)pθ(τ)R(τ)logpθ(τ)]\nabla\bar{R}_\theta=\mathbb{E}_{\tau \sim p_\theta' (\tau)}[\frac{p_\theta(\tau)}{p_{\theta'}(\tau)}R(\tau)\nabla logp_\theta(\tau)]
在原来的方法里,我们用πθ\pi_\theta采样更新参数,更新完参数后又用模型πθ\pi_\theta重新采样,很慢。现在我们换一种方式,用πθ\pi_{\theta'}采样,再用采样来的数据训练πθ\pi_\theta。由于固定θ\theta'不变,这样我们就能重复利用不变的q分布(即θ\theta')来逼近变化的p分布(即θ\theta),而且大大减少了采样花费的时间。

不是R(τ)R(\tau)而是Aθ(st,at)A^\theta(s_t,a_t)

上一篇中我们讨论过了,直接计算整个游戏过程的reward再反馈到所有行为上是不合理的,所以我们用优势函数A来代替R。同样地,接下来我们讨论更改为A后的公式应该怎么修改。
Rˉθ=E(st,at)πθ[Aθ(st,at)logpθ(atnstn)]=E(st,at)πθ[Pθ(st,at)Pθ(st,at)Aθ(st,at)logpθ(atnstn)]=E(st,at)πθ[pθ(atst)pθ(atst)pθ(st)pθ(st)Aθ(st,at)logpθ(atnstn)]=E(st,at)πθ[pθ(atst)logpθ(atnstn)pθ(atst)Aθ(st,at)]=E(st,at)πθ[pθ(atst)pθ(atst)Aθ(st,at)] \begin{aligned} \nabla\bar{R}_\theta&=\mathbb{E}_{(s_t,a_t) \sim \pi_\theta }[A^\theta (s_t,a_t)\nabla logp_\theta(a_t^n \vert s_t^n)]\\ &=\mathbb{E}_{(s_t,a_t) \sim \pi_{\theta'} }[\frac{P_\theta(s_t,a_t)}{P_{\theta'}(s_t,a_t)}A^{\theta'} (s_t,a_t)\nabla logp_\theta(a_t^n \vert s_t^n)]\\ &=\mathbb{E}_{(s_t,a_t) \sim \pi_{\theta'} }[\frac{p_\theta(a_t\vert s_t)}{p_{\theta'}(a_t\vert s_t)}\frac{p_{\theta}(s_t)}{p_{\theta'}(s_t)}A^{\theta'} (s_t,a_t)\nabla logp_\theta(a_t^n \vert s_t^n)]\\&=\mathbb{E}_{(s_t,a_t) \sim \pi_{\theta'} }[\frac{p_\theta(a_t\vert s_t)\nabla logp_\theta(a_t^n \vert s_t^n)}{p_{\theta'}(a_t\vert s_t)}A^{\theta'} (s_t,a_t)]\\ &=\mathbb{E}_{(s_t,a_t) \sim \pi_{\theta'} }[\frac{\nabla p_{\theta}(a_t\vert s_t)}{p_{\theta'}(a_t\vert s_t)}A^{\theta'} (s_t,a_t)]\\ \end{aligned}
推导过程中有三个问题需要注意。

  • 第一点,在第二步中我们将分布从πθ\pi_\theta转换为πθ\pi_{\theta'},实际采样用的是θ\theta',因此优势函数给出的值不再是依靠参数θ\theta,而是参数θ\theta',我们是直接假设两者近似的。
  • 第二点,在第四步中我们要假设pθ(st)pθ(st)\frac{p_{\theta}(s_t)}{p_{\theta'}(s_t)}为1,即两个参数下sts_t出现的概率接近。这个假设是直觉性的,也是为了便于计算,没什么好说的。
  • 第三点,f(x)=f(x)logf(x)\nabla f(x)=f(x)\nabla logf(x),简单地高数知识。

于是我们得到了Rˉθ\nabla\bar{R}_\theta。等式右侧只有一项与θ\theta相关,而且这一项同样也是p\nabla p,是梯度。等式两边同时去掉梯度算子符号,于是可以获得以下目标函数:Jθ(θ)=Rˉθ=E(st,at)πθ[pθ(atst)pθ(atst)Aθ(st,at)]J^{\theta'}(\theta)=\bar{R}_\theta=\mathbb{E}_{(s_t,a_t) \sim \pi_{\theta'} }[\frac{p_{\theta}(a_t\vert s_t)}{p_{\theta'}(a_t\vert s_t)}A^{\theta'} (s_t,a_t)]
目标函数的上标θ\theta'是说明它是用参数θ\theta'采样的数据来估计θ\theta的。

添加约束

有了目标函数,一切看起来都很不错。但是实际上有一个问题:pθp_\thetapθp_{\theta'}不能差太多。这是我们之前的一个假设。现在,我们需要添加约束来证实这一点成立,而这也是PPO实际在做的。
怎么做呢?很简单,PPO的目标函数如下:
JPPOθ(θ)=Jθ(θ)βKL(θ,θ)J^{\theta'}_{PPO}(\theta)=J^{\theta'}(\theta)-\beta KL(\theta,\theta')
其中,KL是KL散度,详情百度,可以理解为一种距离公式。不同的是,他计算的不是θ\thetaθ\theta'参数上的距离,而是行为上的距离。
什么叫参数上的距离,什么叫行为上的距离?
参数上的距离很好理解,就是两个向量之间的距离,重点在于行为上的距离。
我们知道,两个Actor(即策略)分别用参数θ\thetaθ\theta',他们接收状态s,输出行为的概率分布πθ(s)\pi_\theta(s)πθ(s)\pi_{\theta'}(s)。而我们的KL散度指的就是这两个行为概率分布之间的距离,这就叫行为的距离。
参数上的距离意义不大,而行为上的距离能保证面对相同的state时,两个Actor能输出近似的行为概率分布。
上面这些就是基本的内容了,除此之外,我们还额外添加了一个约束。当KL(θ,θ)>KLmaxKL(\theta,\theta')>KL_{max}时,增加β\beta;当KL(θ,θ)<KLminKL(\theta,\theta')<KL_{min}时,减小β\betaKLmaxKL_{max}KLminKL_{min}都是自己设置的,这么做的目的是为了动态调整参数β\beta,防止太过追求θ\thetaθ\theta'距离远近,导致Jθ(θ)J^{\theta'}(\theta)没有起到想要的效果。

PPO2

PPO算法太复杂了,有一个PPO2,实现起来简单多了,我就不解释了,想了解的可以去B站直接搜李宏毅的视频。
3.Proximal Policy Optimization(PPO)+on/off policy

相关文章:

  • 2021-05-05
  • 2021-12-04
  • 2021-09-08
  • 2021-05-08
  • 2021-06-24
  • 2021-11-23
  • 2021-05-23
猜你喜欢
  • 2021-06-07
  • 2021-12-05
  • 2021-07-20
  • 2021-08-06
  • 2021-11-20
  • 2021-11-05
  • 2021-09-05
相关资源
相似解决方案