Asynchronous methods for deep reinforcement learning论文--学习笔记

  1. 提出了异步的Reinforcement Learning的方案,并应用在了多个经典RL算法中。经过实验验证,的确在训练速度和学习效果上更加好。
  2. 相关工作:
    1. RL领域的非深度网络方法中多采用迭代方式,不断更新s,a对应的Q值等环境的反馈评估,可以看作是一个s,a作为维度的Q矩阵值的迭代更新过程。
    2. Deep Q-Learning Network或Double DQN等基于深度学习的算法,都是利用网络去模拟一个估值函数f(s,a),即状态s下执行动作a会得到多少环境反馈。然而如果要模拟出这个函数,就需要非常大量的训练数据。在监督学习场景下,很容易就能获得打了Label的训练数据。而强化学习场景,只有不断给环境动作,然后获得环境的反馈来调整模型,所以不存在大量具有Label的训练数据。为了解决这个问题,DQN和Double DQN都采用了经验回放的方式。即维护一个经验池,里面存储了历史中不同状态下执行不同动作所获得的真实分值(当然大量是0,因为没有获得最终结果之前,环境往往无好的反馈,也无差的反馈)。而为了训练深度网络,就需要利用这些历史数据产生Label。
      1. Label是由当前s状态下执行动作a获得的直接反馈r加上折扣γ后的下一状态s'下执行最佳策略(获得收益最大的动作)选择的动作所能得到的收益。因此,大量样本数据的直接反馈r虽然为0,但是能够通过在下一状态执行最佳策略获得下一步的收益(折扣到本步动作)。然而最优策略虽然被假设存在,但是在网络训练好之前,我们并没有最优策略,只能基于目前获得的策略中选择一个最好的。幸运地是,可以证明,传统非深度网络的算法只要迭代次数够多,一定会收敛到最优策略。而不幸地是,深度网络往往收敛到局部最优解。但是,很多情况下,我们也只要网络对Q值函数的模拟足够好,是一种最优解的近似即可。在传统算法中,Q(s',a')是被存储起来的一个值,并不断被迭代更新。而DQN和Double DQN是采用网络去模拟Q函数,所以Bellman等式的右边Q(s',a')是由当前网络输入s'和a'时输出的预测值
      2. 而Double DQN和DQN的主要区别就在于制作上述Label时,有技术细节上的差别。DQN只有一个网络,所以选择a'和输出Q(s',a')的是同一个网络。这种方案存在的问题是,Max的不断使用,会造成Label的虚高,使得将Label送给网络指导更新时,网络训练效果较差,收敛较慢。而Double DQN则是用online的网络去选择a',然后用offline的网络输出Q(s',a'),最后用制作的Label训练online的网络。由于offline的网络是每隔一段时间才从online网络将网络参数复制过来,所以会比较滞后,因此对Q值得预测会低一些,抑制了Label的虚高问题,使训练效果更好。
      3. 但是不论哪一种基于深度学习的方法,无可避免地都要用到经验回放。这会造成以下问题:
        1. 需要在内存中维护较大的历史数据集,并不断对其补充更新新样本数据。然后从中Sample出minibatch的数据,用于破坏数据之间的关联。
        2. 许多数据是更老的策略产生的,即Label不够准确。因此,收敛可能会更慢。
        3. 文章提出的异步并发的架构,恰恰能够弥补上述两个不足。并发的计算使得每个算法Agent在执行时,都可以从不同的状态出发,执行各自的动作,经历不同的状态,并交替更新共享的网络参数,从而天然破坏了数据样本之间的关联性,而不用维护一个数据池,再采样了。同时,网络的更新更加及时,所以在动作选择上也更准确,在预测输出上也更准确,因此产生的数据样本的质量也更好。而实验也证明了,异步并发方式会训练更高效,效果也更好。因此,本文的贡献对于基于深度网络的强化学习是非常大的。
  3. Asynchronous one-step Q-learning算法:
    1. 核心思路是维护共享变量θ和θ-与独立变量dθ,通过多个线程各自独立与环境交互,更新独立变量,再累加更新共享变量。
    2. 具体地说,就是每个线程从自己的状态开始,按照共享网络参数θ或epsilon概率随机选择动作a,然后按照共享网络参数θ-制作s,a对应的Q值的Label,再用Label值和网络θ产生的输出值的平方误差求导赋值给独立变量dθ。这整个过程都是各线程独立执行的。这部分的计算量较大,多线程并发执行能够显著提高效率。
    3. 各线程的dθ累计到一定的次数t,就会给共享网络参数θ加锁,然后将自己的dθ更新到θ上,最后把自己的dθ清零,再次开始探索环境并累积dθ。而每个线程在每一步dθ更新完后,还会检查一下所有线程执行动作的总步数T是否达到一定程度。如果达到了,则该线程会将θ-加锁,并将θ复制给θ-。由于各个线程交替更新网络参数θ,而且每个线程所探索经历的状态也是分散的,所以天然地不用维护一个经验数据样本池再Sample了。
  4. Asynchronous n-step Q-learning算法:n-step的异步框架与one-step没有什么不同。唯一的区别在于每个线程执行dθ更新时,不再是每一个动作都执行一次了。而是一次执行多个动作,每个动作也都会计算一个dθ,并进行累加,最后在达到一定步数后,一起更新到θ中。Label的制作也是采用延迟的offline网络θ-,但是要格外注意的是,这里每个线程有了一个独立的θ’,这个θ’是来自θ的复制,并在累积dθ的过程中,一直采用θ’替代θ的作用(选择动作)。那么,与one-step相比,在多步动作累积过程中,其动作选择是不受外界其他线程干扰的。也就是如果有线程更新了θ,不会影响到其他线程多步动作执行时对动作的选择。从理论上,我能想到的这么做的好处,就是使网络更加稳定,类似于SGD和BGD的区别,使得网络训练过程中不会过于震荡。从实验结果看,n-step的效果并不比one-step好很多,在部分数据集上可能收敛更快一点。

猜你喜欢

转载自blog.csdn.net/weixin_45647721/article/details/127277905