姓名:张轩
学号:20011214440
【嵌牛导读】最近在学习和研究中主要在学习强化学习,在强化学习中的一种有效利用计算资源,并且能提升训练效用的算法, Asynchronous Advantage Actor-Critic, 简称 A3C。下面我将对这个算法进行介绍。
【嵌牛鼻子】强化学习,A3C
【嵌牛正文】
最近在学习和研究中主要在学习强化学习,在强化学习中的一种有效利用计算资源,并且能提升训练效用的算法, Asynchronous Advantage Actor-Critic, 简称 A3C。下面我将对这个算法进行介绍。
平行宇宙
![](https://img.haomeiwen.com/i25076474/6efa1941763b494c.png)
我们先说说没什么关系的,大家知道平行宇宙这回事。想像现在有三个平行宇宙,那么就意味着这3个平行宇宙上存在3个你, 而你可能在电脑前呆了很久, 对, 说的就是你! 然后你会被我催促起来做运动~ 接着你和二号你还有三号你,就无奈地在做着不同的运动。不过这3个你 都开始活动胫骨啦。假设3个你都能互相通信, 告诉对方, “我这个动作可以有效缓解我的颈椎病”, “我做那个动作后, 腰就不痛了 “, “我活动了手臂, 肩膀就不痛了”。这样你是不是就同时学到了对身体好的三招。这样是不是感觉特别有效率。让你看看更有效率的,就像小学初中的时候英语老师要求抄写单词或者语文老师要求抄写生字、生词一样。我们很多人会把多根笔绑到一起同时抄写一样,效率很高。如果把这种方法用到强化学习,将会事半功倍。
平行训练
![](https://img.haomeiwen.com/i25076474/058dfb0b9ab8a1fe.png)
这就是传说中的A3C. A3C其实只是这种平行方式的一种而已, 它采用的是我们之前提到的 Actor-Critic 的形式. 为了训练一对 Actor 和 Critic, 我们将它复制多份红色的, 然后同时放在不同的平行宇宙当中, 让他们各自玩各的. 然后每个红色副本都悄悄告诉黑色的 Actor-Critic 自己在那边的世界玩得怎么样, 有哪些经验值得分享. 然后还能从黑色的 Actor-Critic 这边再次获取综合考量所有副本经验后的通关秘籍. 这样一来一回, 形成了一种有效率的强化学习方式.
多核训练
![](https://img.haomeiwen.com/i25076474/4dbf27775b398cd8.png)
我们知道目前的计算机多半是有双核, 4核, 甚至 6核, 8核. 一般的学习方法, 我们只能让机器人在一个核上面玩耍. 但是如果使用 A3C 的方法, 我们可以给他们安排去不同的核, 并行运算. 实验结果就是, 这样的计算方式往往比传统的方式快上好多倍. 那我们也多用用这样的红利吧.
说了这么多背景知识帮助大家理解A3C,下面将用专业的语言来解释A3C
1.A3C的引入
在A3C之前有Actor-Critic算法,但是其实很难收敛,无论怎么调参,最后的CartPole都很难稳定在200分,这是Actor-Critic算法的问题。但是我们还是有办法去有优化这个难以收敛的问题的。
还有一种算法叫DQN算法,为了方便收敛使用了经验回放的技巧。那么我们的Actor-Critic是不是也可以使用经验回放的技巧呢?当然可以!不过A3C更进一步,还克服了一些经验回放的问题。经验回放有什么问题呢? 回放池经验数据相关性太强,用于训练的时候效果很可能不佳。举个例子,我们学习下棋,总是和同一个人下,期望能提高棋艺。这当然没有问题,但是到一定程度就再难提高了,此时最好的方法是另寻高手切磋。
A3C的思路也是如此,它利用多线程的方法,同时在多个线程里面分别和环境进行交互学习,每个线程都把学习的成果汇总起来,整理保存在一个公共的地方。并且,定期从公共的地方把大家的齐心学习的成果拿回来,指导自己和环境后面的学习交互。
通过这种方法,A3C避免了经验回放相关性过强的问题,同时做到了异步并发的学习模型。
2. A3C的算法优化
现在我们来看看相比Actor-Critic,A3C到底做了哪些具体的优化。
相比Actor-Critic,A3C的优化主要有3点,分别是异步训练框架,网络结构优化,Critic评估点的优化。其中异步训练框架是最大的优化。
我们首先来看这个异步训练框架,如下图所示:
![](https://img.haomeiwen.com/i25076474/ebad475301a0d71c.png)
图中上面的Global Network就是上一节说的共享的公共部分,主要是一个公共的神经网络模型,这个神经网络包括Actor网络和Critic网络两部分的功能。下面有n个worker线程,每个线程里有和公共的神经网络一样的网络结构,每个线程会独立的和环境进行交互得到经验数据,这些线程之间互不干扰,独立运行。
每个线程和环境交互到一定量的数据后,就计算在自己线程里的神经网络损失函数的梯度,但是这些梯度却并不更新自己线程里的神经网络,而是去更新公共的神经网络。也就是n个线程会独立的使用累积的梯度分别更新公共部分的神经网络模型参数。每隔一段时间,线程会将自己的神经网络的参数更新为公共神经网络的参数,进而指导后面的环境交互。
可见,公共部分的网络模型就是我们要学习的模型,而线程里的网络模型主要是用于和环境交互使用的,这些线程里的模型可以帮助线程更好的和环境交互,拿到高质量的数据帮助模型更快收敛。
现在我们来看看第二个优化,网络结构的优化。之前在强化学习(十四) Actor-Critic中,我们使用了两个不同的网络Actor和Critic。在A3C这里,我们把两个网络放到了一起,即输入状态S,可以输出状态价值V,和对应的策略π, 当然,我们仍然可以把Actor和Critic看做独立的两块,分别处理,如下图所示:
![](https://img.haomeiwen.com/i25076474/bde24707e0101add.png)
第三个优化点是Critic评估点的优化,在强化学习(十四) Actor-Critic第2节中,我们讨论了不同的Critic评估点的选择,其中d部分讲到了使用优势函数A来做Critic评估点,优势函数A在时刻t不考虑参数的默认表达式为:
Q(S,A)的值一般可以通过单步采样近似估计,即:
这样优势函数去掉动作可以表达为:
其中V(S)的值需要通过Critic网络来学习得到。
在A3C中,采样更进一步,使用了N步采样,以加速收敛。这样A3C中使用的优势函数表达为:
对于Actor和Critic的损失函数部分,和Actor-Critic基本相同。有一个小的优化点就是在Actor-Critic策略函数的损失函数中,加入了策略π的熵项,系数为c, 即策略参数的梯度更新和Actor-Critic相比变成了这样:
以上就是A3C和Actor-Critic相比有优化的部分。下面我们来总结下A3C的算法流程。
3. A3C算法流程
这里我们对A3C算法流程做一个总结,由于A3C是异步多线程的,我们这里给出任意一个线程的算法流程。
输入:公共部分的A3C神经网络结构,对应参数位θ,w,本线程的A3C神经网络结构,对应参数θ′,w′, 全局共享的迭代轮数T,全局最大迭代次数Tmax, 线程内单次迭代时间序列最大长度Tlocal,状态特征维度n, 动作集A, 步长α,β,熵系数c, 衰减因子γ
输入:公共部分的A3C神经网络参数θ,w
1.更新时间序列t=1
2.重置Actor和Critic的梯度更新量:
3.从公共部分的A3C神经网络同步参数到本线程的神经网络:
4. ,初始化状态
5.基于策略选择出动作
6.执行动作得到奖励
和新状态
7.
8.如果是终止状态,或
,则进入步骤9,否则回到步骤5
9.计算最后一个时间序列位置的
![](https://img.haomeiwen.com/i25076474/a08859dcba158d2e.png)
10. for:
1)计算每个时刻的::
2)累计Actor的本地梯度更新:
![](https://img.haomeiwen.com/i25076474/841fdcd2cdc784a1.png)
3)累计Critic的本地梯度更新:
![](https://img.haomeiwen.com/i25076474/6b1b47cc137a90d3.png)
11.更新全局神经网络的模型参数:
12.如果T>Tmax,则算法结束,输出公共部分的A3C神经网络参数θ,w,否则进入步骤3
以上就是A3C算法单个线程的算法流程。
网友评论