当前位置: 首页 > 科技观察

收录三类无模型强化学习算法,BAIR开源RL代码库rlpyt

时间:2023-03-17 11:53:24 科技观察

近日,BAIR开源强化学习研究代码库rlpyt,首次收录三类无模型强化学习算法,并提出了一种新的数据结构。2013年,有研究人员提出用深度强化学习来玩游戏,此后不久,深度强化学习被应用于模拟机器人控制,此后涌现出一大批新算法。其中大部分属于无模型算法,分为三类:深度Q学习(DQN)、策略梯度和Q值策略梯度(QPG)。由于它们依赖于不同的学习机制,解决不同(但重叠)的控制问题,并处理不同属性(离散或连续)的动作集,这三类算法沿着不同的研究路线发展。目前,很少有代码库包含所有这三个类的算法,并且许多原始实现仍未发布。因此,从业者通常需要从不同的起点进行开发,可能需要为每个感兴趣的算法或基线学习新的代码库。强化学习研究人员不得不花时间重新实现算法,这是一种宝贵的个人实践,但同时也导致了社区内大量的重复劳动,甚至成为进入的门槛。这些算法有许多共同的强化学习特征。最近,BAIR发布了rlpyt代码库,它利用三类算法之间的共性,将这三类算法的实现构建在一个共享的优化基础设施上。GitHub地址:https://github.com/astooke/rlpytrlpyt库包含深度学习库Pytorch中用Python语言编写的许多常见深度强化学习算法的模块化实现。在众多现有的实现中,rlpyt是研究人员更全面的开源资源。rlpyt最初旨在为深度强化学习领域的中小型研究提供高吞吐量代码库。本文简要介绍了rlpyt的特性以及它与之前工作的关系。值得注意的是,rlpyt基于论文《Recurrent Experience Replay in Distributed Reinforcement Learning》(R2D2)重现了Atari游戏的近期最佳结果,但它并没有使用分布式计算基础设施来收集训练所需的数十亿游戏视频帧。本文还将介绍一种新的数据结构——namedarraytuple,它在rlpyt中广泛用于处理numpy数组的集合。有关更多技术讨论、实现细节和使用说明,请参阅论文《rlpyt: A Research Code Base for Deep Reinforcement Learning in PyTorch》。论文地址:https://arxiv.org/abs/1909.01500rlpyt库的重要特性和能力包括:以串行模式运行实验(有助于调试);以并行模式运行实验,使用并行采样和/或多个GPU选项进行优化;同步或异步采样优化(异步模式通过重播缓冲区实现);在环境采样中,使用CPU或GPU进行训练和/或批量动作选择;全面支持循环代理;在训练过程中,执行在线或离线评估,以及代理诊断记录;在本地计算机上,启动用于堆叠/排队(stacking/queuing)实验设置的程序;模块化:易于修改和重用现有组件;兼容OpenAIGym环境接口。rlpyt库中实现的算法包括:策略梯度:A2C、PPODQN及其变体:Double、Dueling、Categorical、RainbowminusNoisyNets、Recurrent(R2D2风格)QPG:DDPG、TD3、SACreplay缓冲区(支持DQN和QPG)包含以下可选功能:n步返回、优先重放、序列重放(用于重复)、基于帧的缓冲区(仅存储来自多帧观察的唯一Atari游戏帧)。加速实验的并行计算架构采样无模型强化学习的两个阶段——采样环境交互和训练代理——可以以不同的方式并行执行。例如,rlpyt包括三个基本选项:serial、parallel-CPU、parallel-GPU。串行采样是最简单的,因为整个程序运行在一个Python进程中,有利于调试。但是环境通常是基于CPU和单线程的,因此并行采样器使用工作进程来运行环境实例以加快整体收集速度。CPU采样还在工作进程中运行代理的神经网络以选择操作。GPU采样对所有环境观察进行批处理,然后在master进程中选择动作,这样可以更好地利用GPU。下图详细说明了这些配置。环境互动抽样说明。(左)串行:代理和环境在一个Python进程中执行。(中等)并行CPU:代理和环境在CPU上运行(并行工作进程)。(右)Parallel-GPU:环境运行在CPU上(并行工作进程),agent运行在核心进程上以确保批处理动作选择。此外,还有一个交替GPU采样的选项,它使用两组工作人员:一组执行环境模拟,另一组等待新动作。当动作选择时间略短于批处理环境模拟时间时,加速是可能的。通过PyTorch的DistributedDataParallel模块优化同步多GPU优化。整个采样器-优化器堆栈在每个GPU上的不同进程中被复制,模型在反向传播期间对梯度执行all-reduce,从而实现隐式同步。在反向传播时,DistributedDataParallel工具会自动减少梯度,以便在大型网络上更好地扩展,详情请参见下图。(采样器可以是上述任何串行或并行配置。)同步多进程强化学习。每个Python进程都运行完整示例算法堆栈的副本,??并且在反向传播期间通过PyTorch中的DistributedDataParallel隐式实现“同步”。支持GPU(NCCL后端)和CPU(gloo后端)模式。异步采样优化在目前描述的配置中,采样器和优化器都在同一个Python进程中顺序运行。但是,在某些情况下,异步运行优化和采样可以提高硬件利用率,因为这允许优化和采样连续运行。BAIR复现R2D2时就是这样,也是基于真实机器人学习的相同模式。在异步模式下,两个独立的Python进程运行训练和采样,然后重播缓冲区基于共享内存将两者连接起来。采样不间断地运行,因为数据批次是双缓冲的。而另一个Python进程以writelock的方式将批处理后的数据复制到主缓冲区中,详见下图。优化器和采样器可以独立并行化,它们使用不同数量的GPU来实现最佳的整体利用率和速度。异步采样/优化模式。两个独立的Python进程通过共享内存重放缓冲区运行优化和采样(以读写锁定模式)。内存复制器进程将批量数据写入重放缓冲区,以便采样器可以立即处理批量数据。哪种配置最好?串行模式最容易调试以创建或修改代理、模型、算法和环境。虽然串行程序运行流畅,但可以轻松探索更复杂的基础设施,例如并行采样、多GPU优化和异步采样,因为它们大致构建在相同的接口上。最佳配置取决于具体的学习问题、可用的计算机硬件以及要运行的实验数量。rlpyt中包含的并行模式仅限于单个节点,尽管其组件充当分布式框架的构建块。性能案例研究:R2D2BAIR演示了在Atari域中重现R2D2结果的学习曲线,这种学习曲线以前只能在使用分布式计算时看到。该基准测试包括使用大约100亿个样本(400亿帧)在回放缓冲区上训练的循环代理。R2D1(非分布式R2D2)使用rlpyt中的几个更高级的基础结构组件来实现它,即使用交替GPU采样器的多GPU异步采样模式。下图是复现过程中的学习曲线,有几个超过了之前的算法。我们需要注意的是,这些结果并没有在所有游戏中完美复制,例如Gravitar游戏在相对较低的分数下停滞不前。有关详细信息,请参阅相关论文。在rlpyt中用一台计算机重现R2D2学习曲线。R2D2的初始分布式实现使用256个CPU进行采样,并使用GPU以每秒66,000步的速度进行训练。相比之下,rlpyt仅使用一个具有24个CPU(2个IntelXeonGold6126)和3个Titan-XpGPU的工作站以每秒16000步的速度实现。这足以执行无法使用分布式基础设施的实验。未来研究的一种可能性是使用多GPU优化来提高回放率以加快学习速度。下图显示了3个不同指标的相同学习曲线:环境步数(即1步=4帧)、模型更新和时间。它在不到138小时内完成了80亿步和100万次模型更新。rlpyt使用24个CPU和3个Titan-XpGPU以异步采样模式执行R2D1实现,其学习曲线呈现在不同的横坐标(环境步骤、模型更新和时间)上,如上图所示。新颖的数据结构:namedarraytuplerlpyt提出了一个名为arraytuples的新对象类,它使组织numpy数组或torch张量变得更加容易。namedarraytuple本质上是一个namedtuple,它将索引或切片数组读/写到结构中。尝试编写具有一些共同维度的(可能嵌套的)数组字典:fork,vinsrc.items():ifisinstance(dest[k],dict):..recurse..dest[k][slice_or_indexes]=v替换上面的代码如下:dest[slice_or_indexes]=src重要的是,无论dest和src是不同的numpy数组还是随机结构数组的集合,语法都是相同的(dest和src的结构必须匹配,或者src是适用的单个值到所有领域)。rlpyt广泛使用了这种数据结构:训练数据的不同元素使用相同的矩阵主维度进行组织,从而可以轻松地与所需的时间维度或批次维度进行交互。此外,namedarraytuples自然支持具有多模式动作或观察的环境。这在神经网络的不同层使用不同模式时很有用,因为它允许中间基础结构代码保持不变。RelatedResearchDeepReinforcementLearning新手可以从阅读其他资源开始学习OpenAISpinningUp等强化学习算法。OpenAISpinningUp代码地址:https://github.com/openai/spinningup文档地址:https://spinningup.openai.com/en/latest/rlpyt是accel_rl的修订版,accel_rl使用Theano在尝试扩展Atari领域的强化学习,详见论文《Accelerated Methods for Deep Reinforcement Learning》。有关深度学习和强化学习中批量大小缩放的进一步研究,请参阅OpenAI的报告(https://arxiv.org/abs/1812.06162)。rlpyt和accel_rl最初都受到rllab的启发。其他已发布的研究代码库包括OpenAIBaseline和Dopamine,它们都使用Tensorflow框架,既没有优化到rlpyt的程度,也没有包含三种类型的算法。Rllib建立在Ray之上,采用不同的方法来执行分布式计算,但会使小型实验复杂化。FacebookHorizo??n提供了一组专注于大规模生产级应用程序的算法。简而言之,rlpyt提供了更加模块化的算法实现和并行化的模块化基础设施,这是一个支持广泛研究应用的工具箱。结论在一篇相关的博客文章中,BAIR表示rlpyt可以促进对现有深度强化学习技术的轻松访问,并作为新研究的起点。例如,rlpyt没有明确解决一些更高级的主题,例如元学习、基于模型的强化学习和多代理强化学习,但rlpyt提供的可用代码可能有助于加速这些领域的发展。