强化学习A3C算法

在前面的文章深度确定性策略梯度DDPG介绍了DDPG算法,该算法是Actor-Critic算法的一个增强算法,在本篇文章中将介绍另一个增强算法A3C。

在以前的算法中,几乎都采用了经验回放的方法来打破样本的相关性,并以此更新参数。实际还有另一种打破样本相关性的方法,使用异步更新的方式来更新参数。A3C算法便是异步更新参数的一种方法,且性能相当良好。

算法原理

A3C的本质还是Actor-Critic框架,不同之处在于,A3C算法使用了多个智能体副本来跟环境进行交互,智能体副本之间都是并行的进行交互,计算梯度,最后将梯度累积汇总在一起来更新主智能体的参数。

也就是说,以前的算法都是让一个智能体去不断的学习,而现在让一群智能体去学习,最后将这些智能体的学习成果汇聚到一个主智能体身上。整个流程可以参考下图:

由于使用多个智能体副本与环境进行交互,在单位时间内产生的样本与智能体副本的成正比,因此即使没有经验池,也可以让模型得到充分的训练。

网络结构

在A3C算法中,将Actor和Critic变为了一个拥有两个不同输出分支的网络,且没有target-net和eval-net双网络结构。也就是说,现在只有一个A3C网络,它接受一个状态SS作为输入,同时输出状态价值VV和对应的策略π\pi。从Actor和Critic的角度去看,就是将两者输出层之前的所有层的参数都进行了共享,这减少了需要训练的参数数量。具体可以用下图来表示:

对于Actor网络,其参数θ\theta'的梯度公式为:

dθ=θlogπ(aisi;θ)(RV(si;θv))d\theta'=\nabla_{\theta'}\log\pi(a_i|s_i;\theta')(R-V(s_i;\theta_v'))

V(si;θv)V(s_i;\theta_v')是Critic网络的输出,RV(si;θv)R-V(s_i;\theta_v')是优势函数。实际上在原文中,还提出了加入交叉熵作为正则项来增强模型的探索性,此时梯度公式为:

dθ=θlogπ(aisi;θ)(RV(si;θv))+βθH(π(st;θ))d\theta'=\nabla_{\theta'}\log\pi(a_i|s_i;\theta')(R-V(s_i;\theta_v'))+\beta\nabla_{\theta'}H(\pi(s_t;\theta'))

β\beta是一个超参数,可以自己设置。

对于Critic网络,其参数θv\theta_v'的梯度公式为:

dθv=(RV(si;θv))2/θvd\theta_v'=\partial(R-V(s_i;\theta_v'))^2/\partial\theta_v'

由于在计算梯度的过程中,并没有如DDPG对动作求梯度,因此A3C既适用于连续型动作空间的强化学习问题,也适用于离散型动作空间的强化学习问题。

A3C在解决离散型动作空间的强化学习问题时,Actor的输出是动作空间的概率分布,基于这个概率分布进行采样即可。

A3C在解决连续型动作空间的强化学习问题时,首先对输出的动作空间的概率分布作高斯分布的假设,在训练过程中Actor的输出是高斯分布的充分统计量μ\muσ2\sigma^2,之后再进行采样选择动作,在预测过程中将不再采样,直接使用μ\mu对应的动作。Actor对于μ\mu的输出使用了一个全连接层,而σ2\sigma^2是通过在全连接层之后加上softplussoftplus激活函数输出的结果,即σ2=log(1+ex)\sigma^2=log(1+e^x)

算法流程

由于算法本身没有太多复杂的地方,在此就不赘述。需要注意的是,在训练过程中,原文使用了共享优化器RMSPropRMSProp,使用以下公式进行更新:

g=αg+(1α)Δθ2θ=θηΔθg+ϵ\begin{gathered} g=\alpha g+(1-\alpha)\Delta\theta^2 \\ \theta=\theta-\eta\frac{\Delta\theta}{\sqrt{g+\epsilon}} \end{gathered}

此外,如果使用python实现该算法,由于python的GIL问题,多线程并没有什么用处,只能使用多进程的方式来替代。

坚持原创技术分享,您的支持将鼓励我继续创作!
  • 本文作者:bdqfork
  • 本文链接:/articles/53
  • 版权声明:本博客所有文章除特别声明外,均采用BY-NC-SA 许可协议。转载请注明出处!
表情 |预览
快来做第一个评论的人吧~