在前面的文章深度确定性策略梯度DDPG介绍了DDPG算法,该算法是Actor-Critic算法的一个增强算法,在本篇文章中将介绍另一个增强算法A3C。
在以前的算法中,几乎都采用了经验回放的方法来打破样本的相关性,并以此更新参数。实际还有另一种打破样本相关性的方法,使用异步更新的方式来更新参数。A3C算法便是异步更新参数的一种方法,且性能相当良好。
算法原理
A3C的本质还是Actor-Critic框架,不同之处在于,A3C算法使用了多个智能体副本来跟环境进行交互,智能体副本之间都是并行的进行交互,计算梯度,最后将梯度累积汇总在一起来更新主智能体的参数。
也就是说,以前的算法都是让一个智能体去不断的学习,而现在让一群智能体去学习,最后将这些智能体的学习成果汇聚到一个主智能体身上。整个流程可以参考下图:
由于使用多个智能体副本与环境进行交互,在单位时间内产生的样本与智能体副本的成正比,因此即使没有经验池,也可以让模型得到充分的训练。
网络结构
在A3C算法中,将Actor和Critic变为了一个拥有两个不同输出分支的网络,且没有target-net和eval-net双网络结构。也就是说,现在只有一个A3C网络,它接受一个状态作为输入,同时输出状态价值和对应的策略。从Actor和Critic的角度去看,就是将两者输出层之前的所有层的参数都进行了共享,这减少了需要训练的参数数量。具体可以用下图来表示:
对于Actor网络,其参数的梯度公式为:
是Critic网络的输出,是优势函数。实际上在原文中,还提出了加入交叉熵作为正则项来增强模型的探索性,此时梯度公式为:
是一个超参数,可以自己设置。
对于Critic网络,其参数的梯度公式为:
由于在计算梯度的过程中,并没有如DDPG对动作求梯度,因此A3C既适用于连续型动作空间的强化学习问题,也适用于离散型动作空间的强化学习问题。
A3C在解决离散型动作空间的强化学习问题时,Actor的输出是动作空间的概率分布,基于这个概率分布进行采样即可。
A3C在解决连续型动作空间的强化学习问题时,首先对输出的动作空间的概率分布作高斯分布的假设,在训练过程中Actor的输出是高斯分布的充分统计量和,之后再进行采样选择动作,在预测过程中将不再采样,直接使用对应的动作。Actor对于的输出使用了一个全连接层,而是通过在全连接层之后加上激活函数输出的结果,即。
算法流程
由于算法本身没有太多复杂的地方,在此就不赘述。需要注意的是,在训练过程中,原文使用了共享优化器,使用以下公式进行更新:
此外,如果使用python实现该算法,由于python的GIL问题,多线程并没有什么用处,只能使用多进程的方式来替代。