基础算法篇(八),异步强化学习方法与A3C

这一篇,我们介绍一种全新的强化学习方法,称为“异步”强化学习方法。首先,这里没有用算法(algorithm)而是用方法(method),是因为这里提供的是一种与前面相关算法相兼容的新的实现思路,而不是本身在算法方面的革新。其次,我们看“异步”这个词,它已经很明确的表示了这个方法的特点,简单来说,其实就是将“并行”的思路代入前面我们提到的各种value-based或policy-based方法中。
具体的细节,请参考DeepMind的论文:Asynchronous Methods for Deep Reinforcement Learning

为什么要引入“异步”方法

在我们前面的介绍中可以看到,对于价值或策略的拟合,采用了深度神经网络,这才有了深度强化学习(DRL),对于深度神经网络的训练,一般都要求数据是“独立同分布”的。但是,现有与环境交互的方法产生的数据,其相关性是很强的。因此,为了解决这一问题,就引入了经验回放等方法。而这一方法会带来以下三个问题:

  • 一是会增加算法的存储和计算开销;
  • 二是使得算法成为off-policy的(关于off-olicy和on-policy的区别,可以参见这篇文章中对SARSA和Q-Learning的分析)。
  • 三是传统“串行”方法,对于空间的探索效率相对较低,算法收敛相对也就会比较慢。

基于上述问题,DeepMind的大牛们参考以前的一些工作(例如Nair等的Massively parallel methods for deep reinforcement learning),就提出了“异步”的强化学习方法。

异步强化学习方法基本思想

这一方法有两个核心思想:

一是采用了异步(并行)的actor-learners的架构。

  • 首先,actor负责与环境的交互;而learner作为服务端,负责更新相关的价值或策略网络。
  • 其次,在具体更新思路中,由actor与环境交互,产生数据,并计算出相应的梯度;然后将梯度传递给learner,后者通过基于SGD等方法进行反向传播来更新其网络参数。更新完毕后,再将更新过参数的网络同步到相应的actor端,继续进行相关交互。

这一思路本身并不是DeepMind提出的,但在传统方式中,采用的是多机并行的方法,DeepMind在这里则利用了多CPU的线程方式来解决,这样就避免了巨大的通信开销。

二是针对每个actor采用了不同的exploration policies

这一方法既能保证对问题空间的快速搜索,同时还能保证传递的梯度独立性更强,使得算法更加快速的收敛。

采用上述两个方法后,不但降低了训练时间,而且传统的on-policy算法同样也可以适用。下面我们就从伪代码角度分析相关具体算法。

具体算法分析

异步Q-Learning算法

DQN是value-based方法中最经典的方法之一,将“异步”思想引入后,算法的伪代码如下所示:
基础算法篇(八),异步强化学习方法与A3C
上面的伪代码,是针对算法中的每个线程的。首先,算法维护了全局变量 θ \theta θ(即为评估网络参数)和 θ − \theta^- θ(即为目标网络参数),以及全局计数器 T T T。具体算法为:

  1. 初始化线程中的计数器 t = 0 t=0 t=0;
  2. 用评估网络的参数来更新目标网络参数;
  3. 将需要计算的网络梯度置为零 d ⁡ θ = 0 \operatorname d\theta=0 dθ=0
  4. 首先拿到初始状态 s s s,然后进入循环:
  5. 使用评估网络,在状态 s s s基础上,输出行为 a a a
  6. 将行为 a a a输入环境中,得到新状态 s ′ s' s和实时收益 r r r
  7. 使用目标网络计算TD目标值;
  8. 根据TD目标值计算累积梯度 d ⁡ θ \operatorname d\theta dθ
  9. 用新状态代替旧状态 s = s ′ s=s' s=s
  10. T T T t t t两个计数器进行累加,并判断,若满足更新目标网络条件(按照 T T T的周期),则将评估网络参数拷贝到目标网络上;若满足梯度更新条件,则用前面计算的累积梯度去对评估网络参数进行更新,更新完毕后清零累积梯度 d ⁡ θ \operatorname d\theta dθ
    10.最后,跳回第5步,直到满足退出条件为止。

由上面的算法可以看出,针对每个线程,都是采用这种维护全局变量的方法,那么在具体实现时,就需要在更新时对全局变量进行锁操作,以避免多线程可能带来的问题。

A3C算法

actor-critic算法框架,是我们前面讲的在传统policy-based方法上的一种优化,具体思路可参见文章基于AC框架的PPO算法。同样,在这里将“异步”思想引入后,就成为了现在影响特别广泛的Asynchronous advantage actor-critic(A3C)方法。具体伪代码如下所示:
基础算法篇(八),异步强化学习方法与A3C
上面的伪代码中,与异步Q-Learning算法一样,也需要维护全局的Actor参数 θ \theta θ和Critic参数 θ v \theta_v θv,以及全局计数器 T T T。同时,这里还需要维护一个线程中单独使用的Actor参数 θ ′ \theta' θ和Critic参数 θ v ′ \theta'_v θv。具体算法为:

  • 1.初始化线程计数器为 t = 1 t=1 t=1;

  • 2.进入大循环;

  • 3.将更新Actor和Critic的梯度清零;

  • 4.用全局参数 θ \theta θ θ v \theta_v θv,更新线程内的参数 θ ′ \theta' θ θ v ′ \theta'_v θv

  • 5.将线程内计数器的值赋给 t s t a r t t_{start} tstart,获取状态 s t s_t st

  • 6.进入小循环

    • 1.通过策略和状态 s t s_t st获得动作 a t a_t at;
    • 2.在环境中执行 a t a_t at,得到新状态 s t + 1 s_{t+1} st+1和实时收益 r r r
    • 3.持续执行直到状态结束或者满足最大执行次数 t − t s t a r t = t m a x t-t_{start}=t_{max} ttstart=tmax
  • 7.利用线程内的Critic计算价值 R R R,采用自举法,从最后一个状态算起;

  • 8.循环计算用来更新Actor和Critic的累积梯度 d ⁡ θ \operatorname d\theta dθ d ⁡ θ v \operatorname d\theta_v dθv

  • 9.使用累积梯度对全局的Actor和Critic相关参数进行更新;

  • 10.最后,跳回第2步,直到满足退出条件为止。

可以看出,与前面的异步Q-Learning算法不同的是,A3C中一次循环的更新是采用执行固定步数的方式,然后在每次大循环前,将已更新的最新全局变量Actor和Critic相关参数拷贝下来。

总结

经过一个多月时间,完成了八章基础算法篇的内容,也基本上将现有强化学习的主流算法思想都进行了介绍。当然,我们已介绍的算法都是局限于单Agent的,对于多Agent的MADDPG等算法,这里还没有涉及;同时,我们的DRL算法都是Modle-free的,用深度神经网络拟合状态转移函数的Model-based相关类别也没有涉及,后面如果有时间我会慢慢补齐相关算法。
接下来,我希望能够结合自己的工作,慢慢介绍在建模仿真中使用DRL的相关情况,还请大家能够持续关注。