强化学习(二)A3C算法详解,从policy gradient到Asynchronous Advantage Actor-critic

Asynchronous Advantage Actor-critic

在强化学习中,有许多经典的模型,其中一个就是A3C,全称是Asynchronous Advantage Actor-critic。这种模型其实是从之前我们提及的最基本的policy gradient模型一步一步发展来的。最初的强化学习模型中只有一个actor,这个actor的作用是根据当前对于environment的observation得到action;在policy gradient模型的基础上,我们引入了一个新的部分critic,它能够根据当前的observation和采取的action得出本次episode的累计reward的期望值,在actor和critic的基础上,便得出了Advantage Actor-Critic模型,这种模型能够克服之前的policy gradient算法中累计reward的偏差太大的问题;在Advantage Actor-Critic模型的基础上,有学者针对其训练速度过慢引入了一种新的基于异步的、分散式的网络架构,这种网络架构就是Asynchronous Advantage Actor-critic,使用这种网络架构能够有效提升训练速度。在之前的文档中,我们已经详细学习了关于policy-gradient的模型和算法,我们接下来从Advantage Actor-Critic模型出发,分析Asynchronous Advantage Actor-critic的模型结构和算法。

一、关于 Advantage Actor-critic

1.为什么引入Advantage Actor-critic?

为了引入Advantage Actor-Critic的概念,我们先从之前policy-gradient算法中的一个缺陷入手。我们回顾之前的policy-gradient算法,其核心就是梯度更新公式:
Rθ1Nn=1Nt=1Tn(t=tTnγttrtnb)logP(atnstn,θ) \nabla \overline{R}_\theta \approx \frac{1}{N} \cdot \sum_{n=1}^{N} \sum_{t=1}^{T_n}(\sum_{t'=t}^{T_n}\gamma^{t'-t}\cdot r_{t'}^n-b)\nabla logP(a_t^n|s_t^n,\theta)
在上式中,括号中项t=tTnγttrtnb\sum_{t'=t}^{T_n}\gamma^{t'-t}\cdot r_{t'}^n-b就是在第n个episode内,t时刻采取的action对应的本episode的累计reward,值得注意的是,在该项中,每一个时刻的reward与一个系数序列相乘之后才进行了累加计算,该系数序列的意义在于能够使距离当前action更近的immediate reward在该累加式中具有更大的权重,也就是说,每个action和observation对应的的条件概率更能反映较近一段时间内的reward情况。而在该项中,减去的偏置值b的意义在于能够使得accumulated reward项能够正负几乎等概的出现,其中的原因在之前的笔记中已经详细解释过了。

我们回顾该梯度表达式其中的含义。该表达式其实就是对于每一个observation和action对应的条件概率进行梯度上升,只不过在梯度前面要乘以本次episode的total reward,那么问题来了,total reward作为一个累积量,其受每一个action的影响是有限的,也就是说,对于同样的observation和同样的action,可能他们最终的accumulated reward是不一样的,这是为什么呢,其实这源于我们进行训练的过程相当于采样的过程,因为每个observation和action虽然对应着不同的accumulated reward,但是它们服从于一个固定的分布,在理想情况中,如果我们的训练能够遍历所有的accumulated情况,那么我们的模型其实能够学习到相应的知识,但是在实际的训练当中,我们得到的样本点相当于是在整个分布中进行采样的结果,所以必然会有一些可能的accumulated reward没有被采样到的情况。这就意味着,我们在进行若干个episode之后,每个episode内的total reward对于每一个独立的observation和action是随机的,所以为了避免这种情况,我们引入了Advantage Actor-critic。

2.在梯度表达式中引入critic

在提出了上面的问题之后,我们要想办法解决,由于accumulated reward的随机性,所以我们想到使用reward的期望值来减少这种随机性,由此,我们会轻易地想到之前的笔记中提到的critic,根据定义,critic的作用是根据当前的observation和action拟合出当前episode的期望reward。在之前的critic中,根据Q函数的定义,我们可以将t=tTnγttrtnb\sum_{t'=t}^{T_n}\gamma^{t'-t}\cdot r_{t'}^n-b中的t=tTnγttrtn\sum_{t'=t}^{T_n}\gamma^{t'-t}\cdot r_{t'}^n替换为Q function,即:
t=tTnγttrtn=Qπθ(stn,atn) \sum_{t'=t}^{T_n}\gamma^{t'-t}\cdot r_{t'}^n = Q^{\pi_\theta}(s_t^n,a_t^n)
对于偏置项,我们可以使用critic中的V function,即
b=Vπθ(stn) b=V^{\pi_\theta}(s_t^n)
至于为什么能做这样的替换,我们给出以下的解释:在原有的t=tTnγttrtnb\sum_{t'=t}^{T_n}\gamma^{t'-t}\cdot r_{t'}^n-b中,前项其实反映的是每一个action对于本次episode中的accumulated reward的影响,后项可以理解做,只考虑所有的observation对于accumulated reward的影响,二者相减的结果就能**“零均值的、准确的”**反映每个action对于accumulated reward的影响,从而使用这种影响因子指导梯度的更新,就能够使得actor在训练的过程中,以增加每个episode的accumulated reward为目标进行梯度的更新,然而,我们使用Q function和V function恰好能够实现上述的作用。

据此,我们就可以得到基于critic的梯度表达式:
Rθ1Nn=1Nt=1Tn(Qπθ(stn,atn)Vπθ(stn))logP(atnstn,θ) \nabla \overline{R}_\theta \approx \frac{1}{N} \cdot \sum_{n=1}^{N} \sum_{t=1}^{T_n}(Q^{\pi_\theta}(s_t^n,a_t^n)- V^{\pi_\theta}(s_t^n))\nabla logP(a_t^n|s_t^n,\theta)
在上式中,我们注意到,有两个function需要我们进行估计,这无疑增大了我们的工作量,由之前关于Q function和V function的定义,我们可以得知二者的关系:
Qπθ(stn,atn)=E[rtn+Vπθ(st+1n)] Q^{\pi_\theta}(s_t^n,a_t^n) = E[r_t^n + V^{\pi_\theta}(s_{t+1}^n)]
所以,我们可以进一步的化简梯度表达式得到:
Rθ1Nn=1Nt=1Tn(rtn+Vπθ(st+1n)Vπθ(stn))logP(atnstn,θ) \nabla \overline{R}_\theta \approx \frac{1}{N} \cdot \sum_{n=1}^{N} \sum_{t=1}^{T_n}(r_t^n + V^{\pi_\theta}(s_{t+1}^n)- V^{\pi_\theta}(s_t^n))\nabla logP(a_t^n|s_t^n,\theta)
所以,我们只需要估计V function即可,关于上式中将期望运算去掉的原因是基于实际的实验得出的。

3.Advantage Actor-critic算法过程

在这里插入图片描述

如上图所示,进行Advantage Actor-critic的大致流程可以描述如下:

(1)利用现有的actor π\pi与当前的environment进行交互,得到一组trajectory;

(2)利用这组trajectory,通过TD或MC的方式学习到V function:Vπθ(stn)V^{\pi_\theta}(s_t^n)

(3)将Vπθ(stn)V^{\pi_\theta}(s_t^n)带入梯度更新公式,使用之前的方法对参数进行更新,得到π\pi'

以上三个步骤是一次迭代的步骤,在训练中只需要循环进行迭代即可。

4.关于实现Advantage Actor-critic的Tips

(1)在actor π(s)\pi(s)和critic Vπ(s)V^\pi(s)网络之间共享参数

对于actor和critic两个网络来说,他们的输入其实都是observation,更具体地说,我们以图片为例,那么,这两者都可以使用卷积神经网络来实现,在具体实现的时候,而这可以共享一些前层的网络参数,因为这次网络参数表征的是更高层次的特征,而这种特征对于actor和critic是相同的,我们可以通过共享参数的方式,减少模型的复杂度。

强化学习(二)A3C算法详解,从policy gradient到Asynchronous Advantage Actor-critic

(2)在π(s)\pi(s)中引入输出熵作为正则项

输出熵能够衡量不同action之间的概率分布的接近程度,通过引入输出熵能够使得模型在采取action时能够变得“更具探索性”,以便对不同的action进行采样,优化最终的结果。

二、Asynchronous Advantage Actor-critic

其实,从Advantage Actor-critic到Asynchronous Advantage Actor-critic的演变过程其实比较简单,思维跨越并没有之前从policy gradient到Advantage Actor-critic那么大,这种架构的提出更多是出于实际部署和算法收敛速度方面的考虑。

我们回顾上文中的Advantage Actor-critic算法过程,实际上在将actor进行一次迭代训练的过程中,我们需要依据一次的observation完成对critic完成所有的训练,这会使得整个模型的训练变得冗长低效,为了解决这一问题,Asynchronous Advantage Actor-critic算法提出了一种新的架构,借用多线程分别与环境进行交互,提高训练速度,加快收敛,具体的模型结构如下图所示。

强化学习(二)A3C算法详解,从policy gradient到Asynchronous Advantage Actor-critic

整个模型结构的上方是全局的网络,该网络并不直接与环境进行交互,下*干个并行的网络是直接与环境进行交互的worker。每一个子网络都包括两个部分:Actor和Critic,整个网络进行训练的过程如下:

每个线程和环境交互到一定量的数据后,就计算在自己线程里的神经网络损失函数的梯度,但是这些梯度却并不更新自己线程里的神经网络,而是去更新公共的神经网络。也就是n个线程会独立的使用累积的梯度分别更新公共部分的神经网络模型参数。每隔一段时间,线程会将自己的神经网络的参数更新为公共神经网络的参数,进而指导后面的环境交互。

最终,全局的网络就是我们需要学习的模型,其实每一个线程中的worker都是用于并行的和不同的environment进行交互,这样做能够大幅提升网络训练的效率