TensorForce是怎么炼成的?
本文将介绍一个实际问题:应用强化学习的社区如何从收集脚本和个体案例更进一步实现强化学习?API——强化学习的工具?tf-learn?还是?skikit-learn?讨论?TensorForce?在框架之前,我们将谈论启发这个项目的观察和想法。如果这就是你想知道的?API,可以跳过这部分。我们要强调的是,这篇文章并不包含深度强化学习本身的介绍,也没有提出任何新的模型或者谈论最新最好的算法,所以对于纯研究者来说,这篇文章可能没那么有趣。
发展动力
假设你是计算机系统、自然语言处理或者其他应用领域的研究人员,你一定对强化学习有一些基本的了解,你对深度强化学习(deep?RL)用于控制系统的某些方面。
深度强化学习,DQN,香草?战略梯度,A3C?已经有很多介绍文章了,比如?卡帕西?文章(/openai/baselines)、rllab(/openai/rllab)和?GitHub?世界上很多特定的算法。
然而,我们发现,强化学习的研究框架的发展与其实际应用之间仍然存在巨大的差距。在实际应用中,我们可能会面临以下问题:
加强学习逻辑与模拟手柄的紧密耦合:模拟环境?API?非常方便,例如,它们允许我们创建一个环境对象,然后在。为了什么?在循环中,它还可以管理其内部更新逻辑(例如,通过收集输出特征)。如果我们的目标是评估一个强化学习的想法,那么这是合理的,但是将强化学习代码从模拟环境中分离出来要困难得多。还涉及到过程控制的问题:当环境准备好了,强化学习代码能调用它吗?或者当环境需要做决策时,会调用强化学习代理吗?对于很多领域实现的应用强化学习库,我们往往需要后者。
固定网络架构:大多数实现案例包括硬编码的神经网络架构。这通常不是一个大问题,因为我们可以根据需要直接添加或删除不同的网络层。尽管如此,如果有一个强化学习库,可以在不修改库代码的情况下提供声明式接口的功能,那就好得多了。此外,在某些情况下,(令人惊讶地)修改架构要困难得多,比如需要管理内部状态时(见下文)。
不兼容的状态/动作接口:很多早期开源代码用的流行?OpenAI?健身房?环境,具有平坦状态输入和单个离散或连续动作输出的简单接口。但是呢?DeepMind?实验室?然后使用字典格式,它通常有多个状态和动作。然后呢。OpenAI?宇宙?命名键事件(命名?钥匙?事件).理想情况下,我们希望强化学习智能能够处理任何数量的具有潜在不同类型和形状的状态和动作。比如TensorForce?作者之一在工作?NLP?我使用强化学习,并希望处理多模态输入,其中一个状态在概念上包含两个输入——一个图像和一个相应的描述。
不透明的执行设置和性能问题:写?TensorFlow?编码时,我们自然优先考虑逻辑。这样会带来很多重复/不必要的操作或者实现不必要的中间值。另外,分布式/异步/并行强化学习的目标有点不确定,分布式?TensorFlow?某些硬件设置需要手动调整到一定程度。同样,如果最后有一个执行配置只需要声明可用的设备或机器,然后其他的都可以内部处理,比如两者的区别?IP?机器可以异步运行吗?VPG .
需要明确的是,这些问题并不是为了批评研究人员编写的代码,因为这些代码并不是为了用作?API?或者用于其他应用。这里我们介绍想把强化学习应用到不同领域的研究人员的观点。
TensorForce?应用程序接口
TensorForce?提供了一个声明性接口,这是一个可以使用深度强化学习算法的健壮实现。在希望使用深度强化学习的应用程序中,它可以用作一个库,允许用户试验不同的配置和网络架构,而不用担心所有的底层设计。我们完全理解当前的深度强化学习方法往往很脆弱,需要大量的微调,但这并不意味着我们不能为强化学习解决方案建立一个通用的软件基础设施。
TensorForce?它不是原始实现结果的集合,因为这不是一个研究模拟,需要做大量的工作才能将原始实现应用到实际环境中。任何这样的框架都不可避免地包含一些结构性的决定,这些决定会让不标准的东西更加讨厌(抽象漏?抽象).这就是为什么核心强化学习研究人员可能更喜欢从零开始构建他们的模型。使用?TensorForce,我们的目标是获得目前最好的研究的总体方向,包括正在出现的观点和标准。
接下来,我们将深入探讨?TensorForce?API?的基本方面,并讨论我们的设计方案。
创建和配置代理
这个例子中的状态和动作是更一般的状态/动作的简短形式。例如,由图像和描述组成多模式输入定义如下。类似地,也可以定义多输出动作。请注意,在整个代码中,单个状态/动作的简短形式必须持续用于与代理的通信。
states = dict(
image=dict(shape=(64,64,3),type='float '),
caption=dict(shape=(20,),type='int ')
)
配置参数取决于使用的基本代理和型号。每个代理的完整参数列表可以在以下示例配置中找到:/reinforcio/tensor force/tree/master/examples/configs。
TensorForce?目前,提供了以下强化学习算法:
随机代理
用什么?一般化?优势?估计?什么事?香草?政策梯度(VPGAgent)
信任区域策略优化(TRPOAgent)
深度?q?学习/双重深度?q?学习(dq管理)
标准化优势函数
给专家演示的深度?q?学习(DQFDAgent)
异步?优势?演员-评论家(A3C (A3c)(可以隐式传递?分布式?使用)
最后一项是否意味着没有?A3CAgent?类似这样的,因为?A3C?事实上,它描述的是异步更新机制,而不是特定的代理。所以,用分布式?TensorFlow?异步更新机制通用吗?模特?所有代理从中派生的基类的一部分。就像论文《异步?方法?为了什么?深?强化?如《学习》中所述,A3C?结束了吗?VPGAgent?设置?分布式?旗帜?并且含蓄的实现了。需要指出的是,A3C?它并不是每个模型的最优分布式更新策略(甚至对某些模型毫无意义)。在本文的最后,我们将讨论如何实现其他方法(如?PAAC).从概念上区分代理和更新语义的问题与执行语义的问题是很重要的。
我们还想谈谈模型和代理的区别。特工?类将强化学习定义为。API?使用的界面可以管理传入的观测数据、预处理、勘探等工作。两个关键方法是什么?agent.act(state)?然后呢。agent.observe(奖励,终端).agent.act(state)?回复一个动作,然后呢?agent.observe(奖励,终端)?该模型将根据代理的机制进行更新,例如非策略记忆代理或策略批处理代理。请注意,必须交替调用这些函数,代理的内部机制才能正常工作。模特?类实现核心强化学习算法并通过。get_action?然后呢。更新?方法提供了代理可以在相关点内部调用的必要接口。比如DQNAgent?这是一个有。DQNModel?和一个额外的行(用于目标网络更新)?MemoryAgent?代理人
神经网络配置
强化学习的一个关键问题是设计一个有效的价值函数。在概念上,我们将模型视为更新机制的描述,这不同于现实中较新的东西——在深度强化学习的情况下,它指的是一个(或多个)神经网络。因此,模型中没有硬编码的网络,而是根据配置进行不同的实例化。
在上面的例子中,我们通过编程创建了一个网络配置,作为描述每一层的字典列表。这样的配置也能通过?JSON?给,然后用一个效用函数把它变成一个网络建设者(网络?构造器).
什么是默认激活层?Relu,但是还有其他激活功能可用(目前?埃鲁、卢瑟、softmax、tanh?然后呢。乙状结肠).此外,还可以修改层的其他属性。
我们选择不使用现有的层实现(比如从?Tf.layers),以便对内部操作进行清晰的控制,并确保它们可以与?TensorForce?的其余部分已正确集成。我们要避免动态?包装纸?库,所以只依赖下层?TensorFlow?操作。
我们的?层?目前,该库只提供了非常少的基本图层类型,但将来会进行扩展。
到目前为止,我们已经付出了多少?TensorForce?创建层次网络的功能,也就是单个输入状态张量的网络,有一个层的序列,可以得到一个输出张量。然而,在某些情况下,偏离这种层堆叠结构可能是必要的或更合适的。最明显的情况是,当要处理多个输入状态时,这是必要的,并且这个任务不能通过使用单个处理层序列自然地完成。
目前,我们还没有提供更高级别的配置接口来自动创建相应的网络构建器。因此,对于这种情况,您必须通过编程定义其网络构建器功能,并像前面一样将其添加到代理配置中。
内部状态和?插曲?经营
不同于经典的监督学习设置(其中实例和神经网络调用被认为是独立的),强化学习是一种?插曲?中的时间步长取决于前一个动作,也会影响后续状态。因此,除了它在每个时间步的状态输入和动作输出之外,可以想象神经网络可能具有内部状态。插曲?对应于中每个时间步长的输入/输出。下图显示了该网络如何随着时间的推移而运行:
这些内部状态的管理(即在时间步长之间向前传播并开始新的状态?插曲?重置它们时)可以完全由?TensorForce?什么事?特工?然后呢。模特?类处理。注意,这可以处理所有相关的用例(在?批量?一个以内?插曲,你在吗?批量?不止一个?插曲,你在吗?批量?内部没有终端?插曲).
在这个示例架构中,密集层的输出被发送到?LSTM?单元格,然后它就到了这个时间步的最终输出。往前走的时候?LSTM?在一个步骤中,它的内部状态将被更新,并给出这里的内部状态输出。对于下一个时间步骤,网络将获得新的状态输入和这个内部状态,然后发送?LSTM?进一步推送输出实际输出和新内部?LSTM?州,等等...
对于具有内部状态的层的自定义实现,该函数不仅要返回该层的输出,还要返回一个内部状态输入占位符列表、对应的内部状态输出张量和一个内部状态初始化张量列表(都是相同长度,按此顺序)。
预处理状态
我们可以定义应用于这些状态(或者多个状态,如果指定了列表的字典)的预处理步骤。
这个?栈?中的每个预处理器都有一个类型和可选的?args?列表和/或?夸尔斯?字典。比如什么?序列?预处理器将取最后四个状态(即帧)并堆叠它们以模拟马尔可夫属性。顺便说一句:在用,比如前面提到的?LSTM?层,这显然没有必要因为?LSTM?各层可以通过内部状态对时间依赖性进行建模和通信。
探索
探索可以在?配置?对象,可以由代理应用于其模型决定的动作(为了处理多个动作,同样,会给出一个规范的字典)。比如,供使用?奥恩斯坦-乌伦贝克?探索以获得连续的动作输出,以下规范将被添加到配置中。
使用?跑步者?效用函数使用代理。
让我们使用代理。这段代码是在我们的测试环境中运行的一个agent:/feedback IO/tensor force/BLOB/Master/tensor force/Environments/Minimum _ test . py .我们用它来进行持续集成——一个最小的环境来验证给定agent/模型的工作模式的动作、观察和更新的机制。关注我们所有的环境实现(OpenAI?健身房、公开赛?宇宙、DeepMind?实验室)都使用相同的接口,因此您可以直接在另一个环境中运行测试。
跑步者?效用函数可以促进环境中代理的运行过程。给定任何代理和环境实例,它能管理什么?插曲?每个的数量?插曲?最大长度、终止条件等。跑步者?可以接受吗?cluster_spec?参数,如果有这个参数,可以管理分布式执行(TensorFlow?主管/会议/等。).通过可选?插曲_完结?参数,还可以定期报告结果,还可以给出最大值?插曲?在数字前停止执行的指针。
如介绍中所述,在给定的应用场景中使用?跑步者?类依赖于过程控制。如果我们使用强化学习,我们可以合理地?TensorForce?查询状态信息(比如通过一个队列或一个网络服务)并返回一个动作(到另一个队列或服务),那么它就可以用来实现环境接口,从而可以使用(或扩展)runner?效用函数。
更常见的情况可能是把?TensorForce?它用作驱动程序控制的外部应用程序库,因此不能提供环境句柄。对于研究人员来说,这可能微不足道,但在计算机系统等领域,这是一个典型的部署问题,这也是大多数研究脚本只能用于仿真,而不能用于实际应用的根本原因。
还有一点值得一提的是,声明式中央配置对象使我们能够直接为强化学习模型的所有组件配置接口,尤其是网络架构。
进一步思考
我们希望你能发现?TensorForce?非常有用。到目前为止,我们的重点是首先将架构放置到位。我们认为这将使我们能够更加一致地实现不同的强化学习概念和新方法,并避免在新领域探索深度强化学习用例的不便。
在这样一个快速发展的领域中,很难决定在实际的库中包含哪些函数。现在有很多算法和概念,而且好像?街机?学习?环境?(ALE)?在环境的一个子集上,新的想法每周都会得到更好的结果。但也有一个问题:很多想法只是容易并行化或者具体化?插曲?结构环境是有效的——我们对环境属性以及它们与不同方法的关系没有一个准确的概念。然而,我们可以看到一些明显的趋势:
战略梯度总和?q?混合学习方法提高样本效率(PGQ,Q-Prop?这是符合逻辑的事情。虽然我们不知道哪种混合策略会占上风,但我们认为它将是下一个“标准方法”。我们非常有兴趣了解这些方法在不同应用领域(丰富/稀疏数据)的实用性。我们的一个非常主观的观点是,大多数应用研究人员倾向于使用?香草?策略梯度的变体,因为它们易于理解和实现,更重要的是,它们比新算法更健壮,新算法可能需要大量的微调来处理潜在的数值不稳定性(数值?不稳定性).一种不同的观点是,非强化学习研究者可能只是不知道新方法,或者他们不愿意努力实现它们。这是动机吗?TensorForce?的发展。最后,值得考虑的是,应用域的更新机制往往没有建模状态、动作和返回以及网络架构重要。
更好的利用it GPU?以及其他设备(PAAC,GA3C?):这个领域中的方法的一个问题是关于收集数据和更新它们所花费的时间的隐含假设。在非模拟领域,这些假设可能不成立,需要更多的研究来了解环境属性将如何影响设备执行语义。我们还在用吗?Feed_dicts,同时也在考虑提高输入处理的性能。
探测模式(例如,基于计数的探测、参数空间噪声等。)
大规模离散动作空间、层次模型和子目标的分解。比如什么?杜拉克-阿诺德?以及其他人■纸深?强化?学习?在?大号的?离散?行动?Spaces》.复杂的离散空间(比如很多状态依赖的子选项)在应用领域高度相关,但还是很难通过?API?使用。我们期待在未来几年取得许多成就。
用于状态预测的内部模块和基于全新模型的方法:例如,论文“The?前置放大器:?端到端?学习?然后呢。规划》.
贝叶斯深度强化学习与不确定性推理
一般来说,我们正在跟踪这些发展,并将包括我们之前错过的现有技术(应该有很多);一旦我们相信一个新的想法有可能成为一个强大的标准方法,我们也会把它包括进来。从这个意义上说,我们并没有与研究框架进行明确的竞争,而是具有更高的覆盖度。
最后,我们有一个内部版本来实现这些想法,看看我们如何将最新的先进方法转化为有用的库函数。一旦我们对一个项目感到满意,我们将考虑开放它。那又怎样?GitHub?世界很久没有更新了,这很可能是因为我们还在努力做内部开发(或者我们的博士生太忙了),但并不是因为我们放弃了这个项目。如果您对开发有趣的应用案例感兴趣,请联系我们。