这周,机器学习顶级会议 NIPS 2017 的论文评审结果已经通知到各位论文作者了,许多作者都马上发 Facebook/Twitter/Blog/ 朋友圈分享了论文被收录的喜讯。大家的熟人 Facebook 人工智能研究院研究员田渊栋也有一篇论文入选,论文名为「ELF: An Extensive, Lightweight and Flexible Research Platform for Real-time Strategy Games」。这篇论文介绍了他们构建的强化学习研究平台 ELF,为环境设计、高速训练、算法优化等重要任务提供了整套高效易用的解决方案,并且还一并把这个平台开源了。田渊栋本人也在平台开源后发表了一篇知乎专栏,介绍了关键思想和开发中的一些小故事。以下雷锋网 AI 科技评论根据论文对 ELF 平台做一个更详细的介绍。

ELF 总体介绍

ELF 名字的来源是 Extensive, Lightweight, Flexible 的首字母缩写,意指这个平台涵盖的内容广阔、具有轻量化设计、还有高灵活性。这是一个为强化学习研究人员设计的平台,它为游戏提供了多样化的属性、高效率的模拟和高度可定制的环境设置。在这个平台上不仅可以更改游戏的参数,也可以构建新的游戏。强化学习方法的训练也集成在了环境中,深入而且具有高灵活性;对并行发生的事件的模拟尤其进行了优化。基于 ELF,作者们设计了一个即时战略(RTS)游戏引擎,其中包含了三个初始环境,分别为 Mini-RTS、抢旗子和塔防。Mini-RTS 是一个迷你的定制化即时战略游戏,它包含了所有星际游戏中的基本变化(战争迷雾,收集资源,建造部队,用部队攻击和防御等等)。这个 Mini-RTS 游戏在 4 核 MacBook Pro 上的运行速度高达 16.5 万帧 / 秒,这比其它现有环境的速度提高了一个数量级。如此之高的训练速度就让人类首次可以端到端地训练出一个能够完成整场比赛的人工智能,用来对抗游戏内置的基于规则的 bot 玩家。更进一步地,基于 ELF 的人工智能在 6 个 CPU 和 1 个 GPU 上只需要一天的时间就可以完成训练。玩另外两个游戏的人工智能在训练时也有相似甚至更高的训练效率。

许多真实世界的场景和复杂的游戏(比如星际),本质上都是分为不同的层次的。作者们建立的即时战略游戏中的内置 bot 可以掌握所有的游戏数据,而且带有一个内置层次化指令系统;这样的指令系统让任意控制层次上的训练变得可行。 正如在论文中展示出的,层次化的控制系统让作者们得以训练出能够完成整场比赛的人工智能,它不仅能够表现出最高层次的游戏策略,也能用内置的技巧处理低阶的指令。以往的即时战略游戏研究都只关注了低阶的局部战术战役情形。另一方面,对游戏数据的全面掌控也给监督学习训练带来了可能性,只需要小规模的内部数据就可以。

ELF 对用于训练的环境和参与者之间互动关系的变化具有非常高的适应性,这样的表现得益于 EFL 采用的 C++/Python 混合框架。这其中包括了一对一、多对一和一对多映射。现有的强化学习训练环境(比如 OpenAI 的 Gym 和 Universe)都只能在一种 Python 接口上封装一个游戏,这就让切换互动关系变得很麻烦。ELF 的并行部分是用   C++ 编写的,这对加速模拟训练过程至关重要。最后,ELF 可以用来承载任意用 C/C++ 编写的游戏,包括 Atari 系列游戏、棋类游戏和物理引擎,只要写一个简单的适配软件就可以。

在 PyTorch 编写的灵活的强化学习后端支持之下,作者们与众多的基准模型进行了对比,并且讨论了训练中使用到的有效技巧。论文中展示的第一个结果是玩部分信息即时策略游戏的 AI,它送通过端到端的方式训练的。作者们使用了 A3C(Asynchronous Advantages Actor-Critic)模型,探索了帧跳跃、时间视域、网络架构、序列学习等等设计方法。结果表明带有 Leaky ReLU 和 Batch Normaliztion 的网络在长期视界训练和渐进序列训练下,跟内置的基于规则的 AI 进行 Mini-RTS 完整比赛可以取得超过 70% 的胜率。在其它游戏中还取得了更好的结果。

ELF 架构

ELF 使用了经典的生产者 - 消费者模型,生产者玩 N 局游戏,每局游戏都在一个单独的 C 线程中。当游戏中的一组 M 个游戏当前状态就绪的时候,对应的游戏会被锁定,这组状态通过 daemon 送进 Python 一侧。消费者(例如执行器、优化器等等)通过 Python/C++ 界面获得带有历史记录的成组的游戏感知,然后把回复发回给锁定的这组游戏;本来锁定后在等待下一步操作或者下一个值的这组游戏就可以继续运行了。

ELF 执行架构

为了结构的简洁性,生产者和消费者目前在同一个进程中进行。不过它们也可以分开在不同的进程中,甚至在不同的机器上。在训练(或者评估)开始之前,不同的消费者可以要求提供不同长度的历史状态。比如一个执行器需要的的状态历史比较短,而一个优化器需要的状态历史就比较长。

如下图是 ELF 的用法示例。

ELF 初始化

ELF 主体循环

根据论文中的介绍,ELF 的架构有如下几个特点:

用 C 语言编写,具有多线程能力。现代强化学习方法经常需要很高的并行训练程度,在多样的情境下获得更丰富的经验。然而多数现有的强化学习环境(Open AI 的 Gym 和 Universe,RLE,Atari,Doom)提供的 Python 接口只能封装一个游戏实例。这样导致的结果就是,应用现代强化学习方法的时候需要在 Python 代码中编写并行计算机制。然而,由于 Python 中全局解释器锁 GIL 的限制,Python 中线程级别的并行化只能发挥出多核 CPU 很小的一部分性能。进程级别的并行化也会给带来进程间额外的数据交换开销,并且增加框架设计难度。相比之下,用 C 线程实现的并行化在多核 CPU 上的拓展性要好得多。

环境与模型之间的灵活配置。ELF 可以支持一个到多个消费者,每一个消费者都可以从收到的一组状态中了解到当前环境的状况;消费者一般就是一个神经网络模型。这些不同的消费者之间可以选择分享一些参数、可以更新权重、可以存在于不同的进程甚至不同的计算机上。这种架构就为游戏环境和模型更换互动关系提供了很高的灵活性。可以为每一个游戏环境各自分配一个模型,就是 " 一对一 " 的,比如 A3C,这种情况下每个智能体都有单独的一个模型副本用来进行预测和更新。类似地,可以把多个环境分配给一个模型,就是 " 多对一 ",比如 BatchA3C 或 GA3C,模型可以进行批量的前向预测,更好地利用 GPU。模型里同样可以包含前向规划的方法,比如蒙特卡洛树搜索(MCTS)和自我对局,同一个环境可能要接收多个模型计算出的多个结果,也就是 " 一对多 "。在 ELF 中,这些训练设定都只需要很小的改动就可以完成。

高度可定制以及统一的接口。在作者们的 RTS 引擎中实现的游戏可以用原始像素数据或者游戏内部的低维数据进行训练。相比感知类的任务,游戏内部的数据对逻辑推理类的研究任务更为重要。值得一提的是,ELF 同样支持基于网格的视觉渲染,便于 debug 时尝试不同情境。

ELF 提供了一个统一的接口,可以承载任何用 C/C++ 编写的现有程序,包括   Atari 系列游戏、棋类游戏和自定义的 RTS 游戏引擎,只需一个简单的适配器即可。这就可以让现有强化学习方法的多线程游戏和训练变得很容易。基于这个 RTS 引擎,作者们一并编写了三个完善的游戏环境,如下图。(结构)

ELF 功能结构。作者们基于 ELF 平台开发了 RTS 引擎,基于引擎实现了三个游戏环境

强化学习后端。作者们提出了一个基于 Python 的强化学习后端软件。它的设计非常灵活易用,便于实现模型中的强化学习方法。其中实现了 A3C、策略梯度、Q-Learning、信任区域策略优化等多个基准方法,基本都不需要很长的 Python 代码就可以。

即时战略游戏(RTS)

研究人员们普遍认为即时战略游戏是象棋和围棋后的下一个人工智能的大挑战。在即时战略游戏中,玩家一般需要收集资源、建造单位(建筑、小兵等等),并且在战争迷雾中探索环境(有限的视野之外的区域是不可见的)进攻敌人或者进行防御,直到分出胜负。即时战略游戏的特点是极高而且一直在变化的行动空间(比如 10 个单位,每个单位有 5 种可能的选择,行为空间就是 510)、微妙的游戏状况以及大幅度延时的回报。典型的职业选手一分钟可以进行 200~300 个操作,而一场游戏通常要进行 20 到 30 分钟。

直接用在研究中的即时战略游戏引擎很少。面向消费者的游戏(比如星际 1、2)都有着复杂的动态变化、单位交互和图像表现,玩这些游戏也长期以来被证明是一件复杂的事情。除此之外,它们并不是开源的,外部程序无法获得游戏内部的状态,没法简单地用在研究中。开源的即时战略游戏有 Spring、OpenRA、Warzone 2100,它们关注的是复杂的图像和特效、简洁的用户界面、稳定的网络连接、灵活的地图编辑器和即插即用的游戏 mod。它们中大多数都采用了基于规则的 AI,没有能够高于实时速度运行的设计、而且也没有提供能够直接用于现代机器学习架构的接口。其它的一些即时战略游戏也有各种各样的限制导致它们不适用于机器学习研究。

为了得到高速、可定制、适合用于强化学习的即时战略游戏环境,作者们自己编写了一个 RTS 游戏引擎。控制单位、移动、攻击、特定技能、对其它单位的影响等等基础设定一应俱全,而且这个引擎设计了具有不同层次的指令集,只要改变可用的指令、可用的单位、特定情况下引发的单位操作三个要素,就可以构建出新的游戏。引擎中也为此提供了易用的工具。引擎中集成的基于规则的 AI 也可以用类似的方法进行拓展。在 ELF 中,作者们一并提供了三个游戏,Mini-RTS、抢旗子和塔防。这三个游戏都具有以下的特点:

足够复杂的游戏性。每个游戏中的单位都是以真实坐标移动的,具有体积和碰撞检测,它们的动作也是需要占用时间的。RTS 引擎是时间触发型的,在每一次触发到时候,游戏中的 bot 会根据观察到的信息做出决定、给单位下达命令。然后这些命令就被执行、游戏状态发生变化,游戏就继续执行。尽管这样的游戏机制算不上简单,Mini-RTS 游戏还是能够在 MacBook Pro 笔记本上跑出每个核心 40K 帧 / 秒的高速度,这个速度比多数现有的环境要高出一个数量级。这样,在单台机器上也只需要一天就能完成 AI 模型的训练。

内置的层次化命令结构。一个智能体可以下达战略型的命令,比如 " 侵略性更强的站位 ",可以下达战术型的指令,比如 "hit and run",微操型的也可以,比如单独拉回一个单位以避免吃到伤害。理想状况下,一个强有力的智能体应当掌握所有级别的命令;不过实际中的常用做法是关注某一个特定级别的指令层级别,然后把其它层次留给硬性的规格处理。为了提供这样的可能性,这个 RTS 引擎使用了一个层次化的指令系统,它能够为游戏提供不同层次的控制能力。高层次的指令衍生出的低层次指令可能会影响到所有的单位;一个低层次的、发给特定单位的持续动作指令需要占用几次出发的时间,这期间每次触发的时候可以给单位发送立即型的指令。

内置的基于规则的 AI。与游戏环境一起,作者们设计了基于规则的 bot。这些内置 bot 可以掌握地图中所有的信息并且按照固定的策略行动(比如造 5 个坦克然后攻击地方基地)。这些 AI 的行动方式就是先发出高层次的指令,然后翻译成低层次的指令并执行。

有了 ELF,研究员们第一次可以在即时战略游戏中训练能够玩整局游戏的 AI,并且取得了比内置的 AI 强得多的表现。相比之下,其它现有的即时战略游戏 AI 要么是基于规则的,要么专注于战术执行。

测试

作者们在 ELF 中的游戏里测试评估了这个平台的可用性。

执行性能

可以看到,随着使用的 CPU 核心数目的增加,每个核心的平均性能表现并没有发生大的变化。ELF 的高效与可拓展性可见一斑。相比之下,OpenAI 的 Gym 要提高性能就困难得多。

A3C 模型训练表现

基于 A3C 的 AI 模型对战内置基于规则的 bot 的胜率

由于训练输入是稀疏且混杂的,作者们尝试构建了带有 Leaky ReLU 和   Batch Normalization 的 CNN 模型。BN 可以通过正态化每个滤波器的输出来稳定训练中的梯度变化,Leaky ReLU 则可以保留带负号的线性响应信号,这在输入特征稀疏的情境中非常重要。可以看到,两种方法结合以后的效果格外地高。

组合训练提高模型表现

作者们在测试中发现,组合训练对 AI 训练非常重要。他们的做法是,在训练 AI 模型的时候,先让内置 AI 玩一定的时间,然后交给要训练的 AI 接着玩。这就降低了游戏初始时的难度,而且给游戏带来了更多的变化,避免掉进局部最小值里。

总结

这样,ELF 不仅用合理的结构设计提供了一个包含一组游戏设计选项的研究平台、一个轻量级的游戏模拟器和一个灵活的实验环境,实际使用中也确实能给强化学习研究人员带来很大的便利。在 ELF 的基础上,前向建模、层次化强化学习、不确定规划、复杂行为空间强化学习等方法也可以在即时战略游戏中得到更高效的研究。引用田渊栋在知乎专栏里的话说:" 如果大家对强化学习和游戏 AI 有兴趣,这个框架会提供很大帮助 "。

论文地址:https://arxiv.org/abs/1707.01067

项目地址:https://github.com/facebookresearch/ELF/