A3C
A3C解决了Actor-Critic难以收敛的问题,同时更重要的是,提供了一种通用的异步的并发的强化学习框架,也就是说,这个并发框架不光可以用于A3C,还可以用于其他的强化学习算法。这是A3C最大的贡献。目前,已经有基于GPU的A3C框架,这样A3C的框架训练速度就更快了。
一、A3C算法
二、A3C算法与AC算法的区别
A3C算法与AC算法相比,主要在3处进行了优化:
1、异步训练框架(最大的优化)
global network是公共的神经网络模型,包含了actor网络和critic网络两部分的功能;下面有n个worker线程,每个线程里有和公共的神经网络一样的网络结构,每个线程会独立的和环境进行交互得到经验数据,这些线程之间互不干扰,独立运行。
n个worker线程和公共神经网络的更新情况:每个线程和环境交互得到一定的数据之后,就计算在自己线程里的神经网络损失函数的梯度,但是这些梯度并不更新自己线程里的神经网络,而是去更新公共的神经网络。
2、网络结构的优化
在AC算法中,使用了两个不同的网络即actor和critic;
在A3C算法中,把两个神经网络放到了一起,即输入状态为s,输出状态为价值v和对应的策略
π
\pi
π 。当然,仍然可以把actor和critic看做独立的两块,分别处理,如下图所示:
3、critic评估点的优化
在AC算法中,使用了Q(s,a)作为critic的评估点;
在A2C算法中,使用了优势函数 A ( s , a ) = Q ( s , a ) − V ( s ) A(s,a)=Q(s,a)-V(s) A(s,a)=Q(s,a)−V(s),其中Q(s)的值一般可以通过单步采样近似估计: Q ( s , a ) = r + γ ∗ V ( s ′ ) Q(s,a)=r+\gamma*V(s') Q(s,a)=r+γ∗V(s′) ,V(s)的值需要通过critic网络学习得到,最终把优势函数 A ( s , a ) = Q ( s , a ) − V ( s ) = r + γ ∗ V ( s ′ ) − V ( s ) A(s,a)=Q(s,a)-V(s)=r+\gamma*V(s')-V(s) A(s,a)=Q(s,a)−V(s)=r+γ∗V(s′)−V(s)作为critic评估点;
在A3C算法中,采样更近一步,使用了N步采样,以加速收敛,此时A3C算法中的优势函数为
A
(
s
0
,
a
)
=
Q
(
s
0
,
a
)
−
V
(
s
0
)
=
r
0
+
γ
r
1
+
.
.
.
.
.
γ
n
−
1
r
n
−
1
+
γ
n
V
(
s
n
)
−
V
(
s
0
)
A(s_{0},a)=Q(s_{0},a)-V(s_{0})=r_{0}+\gamma r_{1}+.....\gamma^{n-1} r_{n-1}+\gamma^n V(s_{n})-V(s_{0})
A(s0,a)=Q(s0,a)−V(s0)=r0+γr1+.....γn−1rn−1+γnV(sn)−V(s0)。对于Actor和Critic的损失函数部分,和Actor-Critic基本相同。还有一点小地方修改就是在actor网络的损失函数地方增加了策略π的熵,最终的损失函数为:
超参数
β
\beta
β 为控制熵正规化的强度。
三、A3C的算法流程
四、A3C算法的优缺点:
优点:
(1)拥有更好的收敛属性;
(2)在高纬度和连续动作孔家更加有效;
(3)可以学习stochastic policy。
缺点:
(1)通常得到的都是局部最优解;
(2)评价策略通常不是非常高效,并且有很高的偏差。
五、额外收获
1、GPU与CPU有什么区别?
当需要大量计算的时候,需要用到GPU;
CPU的内部结构异常复杂,里面除了计算单元外,还有存储单元,控制单元,相比之下计算能力只是CPU很小的一部分功能。
参考链接:CPU和GPU的设计区别
2、多线程是什么意思?
关于理解什么是线程,可以参考下面的链接,我认为这个博主讲的非常浅显易懂,让人明白。
什么是多线程?如何实现多线程?
3、异步(asynchronous)和同步有什么区别?
同步:一个任务执行完成之后才能进行下一个任务。
异步:多个任务可以同时进行。
4、经验回放机制存在的问题
为了缓解传统策略梯度方法与神经网络结合时出现的不稳定性,各类深度策略梯度方法(DQN、DDPG、SVG等)都采用了经验回放机制来消除训练数据间的相关性。
但是经验回放机制存在两个问题:
(1)agent与环境的每次实时交互都需要耗费很多的内存和就计算力。
(2)经验回放机制要求agent采用离策略(off-policy)方法来进行学习,而off-policy方法只能基于就策略生成的数据进行更新。
此外,过往DRL的训练都依赖于计算能力很强的图形处理器(如GPU)。
六、总结
A3C的代码值得多加研究,里面涉及了多进程的代码,而且这次把代码敲两遍之后,感觉是有那么点意思了,但是深究发现代码之间还有好多细节自己也没有弄明白。这里我提一个小的建议就是把先把A3C的伪代码彻底搞明白,明白之后多看几遍莫烦视频讲解,然后把敲敲代码,把代码弄明白。越往后面越难,大家不要放弃啊!
参考链接:
强化学习(十三 )–AC、A2C、A3C算法
A3C的算法原理和算法流程
一文读懂 深度强化学习算法 A3C (Actor-Critic Algorithm)
深度强化学习——A3C