Facebook 人工智能游戏测试平台 ELF 开源了

昨天晚上折腾到北京时间凌晨1点,终于完成了ELF开源的任务。这次开源获得了公司的支持,和代码一起公布的还有arXiv文章及公司的官方博客。国内的媒体真是快,我还没来得及写专栏,第二天早晨就看到机器之心的翻译了。

代码见:facebookresearch/ELF

文章见:An Extensive, Lightweight and Flexible Research Platform for Real-time Strategy Games

官方博客见:code.facebook.com/posts

这个框架前前后后做了半年左右,核心设计改了挺多次,最后收敛到现在这个版本。ELF的核心思想是“让大家都能做得起深度强化学习的研究”,它给了一个从模拟器到优化算法的一篮子解决方案。通过一些工程上的技巧以降低计算资源的需求,增加程序的可读性,并且提供一个短小精悍的即时战略引擎用来给大家研究。框架的设计和代码,即时战略游戏引擎及文章的撰写由我完成;前端可视化代码,及夺旗和塔防两个游戏的设计和训练由龚渠成(Qucheng Gong)完成;吴育昕@(Yuxin Wu)把Atari模拟器接入了ELF,并且进行了速度测试;商文龄(Wenling Shang)改进了神经网络结构,加入了LeakyReLU和Batch Normalization并提高了性能;最后Larry对这个项目提出了很多建议,并且帮忙修改了文章。

总的来说我对ELF这个框架的设计还是比较满意的,用C++将许多并行的游戏线程和每个线程的历史数据封装进去,使得每次Python循环时都可以得到一批次的游戏状态,而不是某一个线程单独的游戏状态。这样接强化学习算法时,可以直接调用神经网络的前向/后向传递,而不需要手工在Python里面写多线程或者多进程的代码,这样就使得Python代码清晰可读并享有较高性能。ELF的训练用了PyTorch作为平台,使得框架易读,且扩展性好。这样写还有一个好处,就是可以根据每个游戏线程的序号及其当前状态来采用不同的模型,这样就把蒙特卡罗树搜索(Monte-Carlo Tree Search),自我对弈(Self-Play)等等涉及到游戏状态和神经网络之间复杂互动关系的方法,统一在一起了。如果大家看过围棋引擎DarkForest的代码,可能会觉得分成两个独立程序来运行DF非常不方便,需要先打开一个程序用CPU来做树搜索,同时再打开一个程序用GPU来运行策略及值网络。现在在ELF框架下不需要了。这一部分的代码过一阵子也会开源。另外这个框架其实不仅仅限于游戏,任何一个虚拟环境,比如说物理引擎,比如说连续或者离散控制系统,只要有C/C++的源码,都可以整合进去,ELF会自动处理多线程同步的并返回一批次的内部状态——当然,即便没有源码,只要存在某种形式的接口,也是可以的。

在这个框架下面,我们实现了一个小巧的即时战略引擎,并写了一个简化版的一对一即时战略游戏(MiniRTS),还有夺旗和塔防两个扩展。MiniRTS虽然小,但是基本的采矿、造兵、造建筑、战争迷雾等游戏机制都有,各单位可以在地图上连续移动,并且每个单位有基本的避障寻路功能。因为这个引擎是从头开始设计的,很多细节可以专为深度学习和强化学习的训练定制。在游戏的复杂性方面,仅仅花两周写出来的MiniRTS当然远不如大型团队开发几个月做出来的商业游戏,不过它胜在速度快占用资源少,并且可以扩展,对于测试一些新的研究思路会比较有帮助。速度是MiniRTS的强项,比如说在一台4核的Mac的笔记本上,运行游戏可以跑到每个核4万帧每秒。用12个CPU和1个GPU去测试训练出来的模型,跑一万局游戏仅需一分半钟。我们也提供了一个网页版的可视化工具,可以拿来看Replay,甚至和电脑AI玩一局。相比之下若是用星际等商业化游戏做强化学习研究,往往需要动用大量资源,而且很多功能无法自行拓展。

在MiniRTS及夺旗和塔防三个游戏上,我们进一步做了强化学习的训练实验,用的是流行的Actor-Critic模型,但加了些off-policy的拓展。我们在训练时没有加辅助奖励(比如说鼓励造坦克鼓励采矿等),而只告诉算法这一局结束后是赢是输。即时战略游戏的行动空间(action space)是非常广阔的,用现有的框架不太容易找到好的策略,所以这次先做比较简单的方法,把行动空间离散化为一些高层策略,比如说造农民,造兵,全军进攻及防守,等等。这样现有的强化学习方法就可以使用,并且得到了一些比较有趣的结果,能够以70%的胜率战胜我们自己写的基于规则的AI。

如果大家对强化学习和游戏AI有兴趣,这个框架会提供很大帮助,我这里就毫不谦虚地自卖自夸。希望大家喜欢。

来源:知乎