基于TensorFlow打造强化学习API:TensorForce是怎样炼成的?

本文将围绕一个实际的问题进行介绍:应用强化学习的社区可以如何从对脚本和单个案例的收集更进一步,实现一个强化学习 API——一个用于强化学习的 tf-learn 或 skikit-learn?在讨论 TensorForce 框架之前,我们将谈一谈启发了这个项目的观察和思想。如果你只想了解这个 API,你可以跳过这一部分。我们要强调一下:这篇文章并不包含对深度强化学习本身的介绍,也没有提出什么新模型或谈论最新的最佳算法,因此对于纯研究者来说,这篇文章可能并不会那么有趣。

开发动机

假设你是计算机系统、自然语言处理或其它应用领域的研究者,你一定对强化学习有一些基本的了解,并且有兴趣将深度强化学习(deep RL)用来控制你的系统的某些方面。

对深度强化学习、DQN、vanilla 策略梯度、A3C 等介绍文章已经有很多了,比如 Karpathy 的文章(http://karpathy.github.io/2016/05/31/rl/)对策略梯度方法背后的直观思想就进行了很好的描述。另外,你也能找到很多可以帮助上手的代码,比如 OpenAI 上手智能体(https://github.com/openai/baselines)、rllab(https://github.com/openai/rllab)以及 GitHub 上许多特定的算法。

但是,我们发现在强化学习的研究框架开发和实际应用之间还存在一个巨大的鸿沟。在实际应用时,我们可能会面临如下的问题:

强化学习逻辑与模拟句柄的紧密耦合:模拟环境 API 是非常方便的,比如,它们让我们可以创建一个环境对象然后将其用于一个 for 循环中,同时还能管理其内部的更新逻辑(比如:通过收集输出特征)。如果我们的目标是评估一个强化学习思想,那么这就是合理的,但将强化学习代码和模拟环境分开则要艰难得多。它还涉及到流程控制的问题:当环境就绪后,强化学习代码可以调用它吗?或者当环境需要决策时,它会调用强化学习智能体吗?对于在许多领域中实现的应用强化学习库,我们往往需要后者。 固定的网络架构:大多数实现案例都包含了硬编码的神经网络架构。这通常并不是一个大问题,因为我们可以很直接地按照需求加入或移除不同的网络层。尽管如此,如果有一个强化学习库能够提供声明式接口的功能,而无需修改库代码,那么情况就会好得多。此外,在有的案例中,修改架构(出人意外地)要难得多,比如当需要管理内部状态的时候(见下文)。 不兼容状态/动作接口:很多早期的开源代码都使用了流行的 OpenAI Gym 环境,具有平坦的状态输入的简单接口和单个离散或连续动作输出。但 DeepMind Lab 则使用了一种词典格式,一般具有多个状态和动作。而 OpenAI Universe 则使用的是命名关键事件(named key events)。理想情况下,我们想让强化学习智能体能处理任意数量的状态和动作,并且具有潜在的不同类型和形状。比如说,TensorForce 的一位作者正在 NLP 中使用强化学习并且想要处理多模态输入,其中一个状态在概念上包含两个输入——一张图像和一个对应的描述。 不透明的执行设置和性能问题:写 TensorFlow 代码的时候,我们很自然地会优先关注逻辑。这会带来大量重复/不必要的运算或实现不必要的中间值。此外,分布式/异步/并行强化学习的目标也有点不固定,而分布式 TensorFlow 需要对特定的硬件设置进行一定程度的人工调节。同样,如果最终有一种执行配置只需要声明可用设备或机器,然后就能在内部处理好其它一切就好了,比如两台有不同 IP 的机器可以运行异步 VPG。

明确一下,这些问题并不是要批评研究者写的代码,因为这些代码本来就没打算被用作 API 或用于其它应用。在这里我们介绍的是想要将强化学习应用到不同领域中的研究者的观点。

TensorForce API

TensorForce 提供了一种声明式接口,它是可以使用深度强化学习算法的稳健实现。在想要使用深度强化学习的应用中,它可以作为一个库使用,让用户无需担心所有底层的设计就能实验不同的配置和网络架构。我们完全了解当前的深度强化学习方法往往比较脆弱,而且需要大量的微调,但这并不意味着我们还不能为强化学习解决方案构建通用的软件基础设施。

TensorForce 并不是原始实现结果的集合,因为这不是研究模拟,要将原始实现用在实际环境的应用中还需要大量的工作。任何这样的框架都将不可避免地包含一些结构决策,这会使得非标准的事情变得更加恼人(抽象泄漏(leaky abstractions))。这就是为什么核心强化学习研究者可能更倾向于从头打造他们的模型的原因。使用 TensorForce,我们的目标是获取当前最佳研究的整体方向,包含其中的新兴见解和标准。

项目地址:https://github.com/reinforceio/tensorforce

本文转自机器之心,原文来自reinforce,作者Michael Schaarschmidt、Alexander Kuhnle、Kai Fricke。

Related posts

Leave a Comment