深度强化学习8——Actor-Critic(AC、A2C、A3C)
阅读原文时间:2021年04月20日阅读:1

上篇文章我们讲到Policy Gradient可能给出的action分布是比较极端的,导致很多状态无法进行探索,陷入局部最优,本篇我们将讨论策略(Policy Based)和价值(Value Based)相结合的方法:Actor-Critic算法。

在讨论Actor-Critic算法前,我们回顾一下Policy Gradient方法的完整流程,如下图所示:

先采集相应的数据包括状态、动作和奖励,然后用梯度提升的式子更新参数,随后再根据更新后的策略再采集数据,再更新参数,如此循环进行。注意到图中的only used once,因为在更新参数后,我们的策略已经变了,而先前的数据是基于更新参数前的策略得到的,实际上如果数据采集不好,就会导致得到在某个action上给出0.9999…的概率,陷入局部最优。

Actor-Critic(AC)

Actor-Critic从名字上看包括两部分,演员(Actor)和评价者(Critic)。其中Actor使用我们上一节讲到的策略函数,负责生成动作(Action)并和环境交互。而Critic使用我们之前讲到了的价值函数,负责评估Actor的表现,并指导Actor下一阶段的动作。

在Actor-Critic算法中,我们要做两组近似:

  1. 策略函数函数近似:
  2. 价值函数的近似:状态价值函数和动作价值函数

我们再来看Policy Gradient的梯度计算公式:

                                                

这个期望内部的两项:

  1. 奖励函数,选择 action 的获得的分数,是一个标量
  2. 告诉我们了使得 log 函数增加的方向

实际上,我们上面公式是通过获得最大期望奖励推导,如果没用明确的初始状态,也可以定义优化的目标变为平均价值或者动作价值,在Policy Gradient中,如果我们用Q函数来代替R,同时我们创建一个Critic网络来计算Q函数值,那么我们就得到了Actor-Critic方法,公式变为:

                                                                 

此时的Critic也是根据我们在Q-learning算法中的更新公式,对估计的Q值和实际Q值的平方误差进行更新,对Critic来说,其loss为:

                                                          

Actor-Critic算法可选形式*

根据梯度计算公式,Actor-Critic中Actor参数的更新公式可以简写为:

                                                                       

1)  如果我们基于状态价值函数进行评估,则公式变为

                                                                          

2)  我们还可以用在时序差分学习(TD)讲过的TD误差进行更新,我们这里用表示误差,则公式写为

                                                                             

Actor-Critic算法的完整流程如下(用TD误差进行更新)

Actor-Critic算法虽然思路很好,但是由于有些动作无法采样导致难收敛的原因,还需要做改进。

Advantage Actor-Critic(A2C)

我们在上一章最后讲到为了平衡算法中没有采取的动作需要增加一个基线,使得反馈有正有负,同样的方式我们也可以优化AC算法,这里的基线通常用状态的价值函数来表示

                                                       

上述公式其实也是我们在DQN的改进方法讲过Dueling DQN中的优势函数(Advantage function),其中优势函数的计算公式为 

                                                                

Actor参数更新公式为

                                                                      

与Dueling DQN不同的是,如果要根据上述式子计算,我们需要有两个网络分别计算动作价值Q和状态价值V,为了优化计算做了近似表示

                                                                     

对Critic来说,其loss为

                                                                    

Asynchronous Advantage Actor-Critic (A3C)

直接更新策略的方法,其迭代速度都是非常慢的,为了充分利用计算资源,又有了Asynchronous Advantage Actor-Critic 方法,就像我们学习下棋,总是和同一个人下,期望能提高棋艺。这当然没有问题,但是到一定程度就再难提高了,此时最好的方法是另寻高手切磋。

A3C算法利用多线程的方法,同时在多个线程里面分别和环境进行交互学习,每个线程都把学习的成果汇总起来,整理保存在一个公共的地方。并且定期从公共的地方把大家的齐心学习的成果拿回来,指导自己和环境后面的学习交互。

就像名字所说与A2C算法对比,A3C主要是采用了异步训练框架,如下图所示

可以看到,我们有一个主网络,n个worker线程,每个线程里有和公共的神经网络一样的网络结构,也是一个A2C的网络,每个线程会独立的和环境进行交互得到经验数据,这些线程之间互不干扰,独立运行,A3C主要有两个操作,一个是pull,一个是push:
pull:把主网络的参数直接赋予Worker中的网络
push:使用各Worker中的梯度,对主网络的参数进行更新

可见,公共部分的网络模型就是我们要学习的模型,而线程里的网络模型主要是用于和环境交互使用的,这些线程里的模型可以帮助线程更好的和环境交互,拿到高质量的数据帮助模型更快收敛。

由于A3C是异步多线程的,我们这里给出任意一个线程的算法流程,如下图

总结

本篇文章我们介绍了基本版的Actor-Critic算法,再根据算法的缺点,逐步开始介绍A2C、A3C算法,实际上A3C算法最重要的是提供了一种通用的异步的并发的强化学习框架,也就是说,这个并发框架不光可以用于A3C,还可以用于其他的强化学习算法。

针对Actor-Critic算法的缺点,还有一个改进算法是DDPG算法,使用了双Actor神经网络和双Critic神经网络的方法来改善收敛性。下一篇我们将介绍DDPG算法。

Actor-Critic算法github demo地址:https://github.com/demomagic/Actor-Critic

PS: 如果觉得本篇本章对您有所帮助,欢迎关注、评论、赞!如果要转发请注明作者和出处

参考文献:

    [1]刘建平-强化学习(十五) A3C

    [2]李宏毅-Actor-critic

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章