《星际争霸》一直是游戏玩家心目中即时战略类的经典之作,历时十多年而不衰。而如今它更成为深度强化学习、人工智能算法研究的一个主要平台和工具。因为其蕴含了多智能体协作、多任务学习、宏观策略规划等复杂问题,一旦取得部分突破和进展,对商业和社会发展都会带来极大影响。如国外的 DeepMind、Facebook 等公司相继投入大量人力基于它进行通用人工智能的研究。在本次演讲中,我们将介绍阿里巴巴如何在《星际争霸》游戏环境中研究人工智能算法,并重点阐述多智能体协作在微观战斗场景中的应用。
大家下午好!我是来自阿里巴巴认知计算实验室的龙海涛,今天主要跟大家聊一下“《星际争霸》与人工智能”的话题。首先我会介绍一下为什么我们会选择《星际争霸》这个游戏来做人工智能前沿性的研究,然后是我们在这方面初步的尝试和成果,最后我会跟大家探讨一下,未来我们在《星际争霸》这个游戏里面还可以继续去研究的一些课题。
为什么选择《星际争霸》作为人工智能算法研究的环境
首先可能大家有疑问,为什么选择《星际争霸》这个游戏来做我们 AI 研究的一个平台。我们这个认知计算实验室目前是挂靠在搜索事业部下面,我们团队的成员基本都是做搜索、广告、推荐、算法这样的背景,之前我们主要做的是 CTR 预估的优化,还有 CVR 转化率的一些优化,从去年“双 11”之后,我们想在认知智能方面做一些前沿性的探索,我们一致认为游戏是一个研究 AI 算法的绝佳平台,首先它是非常干净的平台,可以源源不断的去产生数据,而且迭代非常快,就是说它的智能是可以观测到的。另外,它离真实的场景和应用是比较近的,并且《星际争霸》十多年来就是一个非常好的受大家欢迎的游戏,积累了非常非常多的数据,这样我们可以从之前的经验去学习,这也是我们考虑的一个方面。最重要的,它对 AI 来讲存在着非常大的挑战,非常复杂,主要有以下六点:
第一点,它是一个不完全信息下的环境
比起像围棋或者象棋这种大家都可能看得见的、完全信息下的博弈,《星际争霸》是有战争迷雾的,所以必须去探路、侦查、了解对手的信息,从而在不确定的情况下去做智能的决策,这个是相对其他游戏来讲非常不同或者挑战更大的一个方面。
第二点,它有非常巨大的搜索空间
围棋的搜索空间大概在 10^170,《星际争霸》在 128×128 的地图上并且人口上限是 400 个 unit 的情况下,它的搜索空间大概在 10^1685,比围棋高 10 个数量级,这还是在没有算上其他状态(比如说血量等等)的情况下。所以现有的任意一个单一的算法是根本不可能解决《星际争霸》里面所有的问题的。
第三点,它是一个即时对抗类的游戏
下围棋可以有一分钟或者两分钟的思考时间,但是在《星际争霸》里,如果说正常游戏大概是 1 秒钟 24 帧,那么你必须在 42 毫秒之内做出迅速的反应,而且这个反应不是一个 action,而是一系列的 action,每个 unit 都会采取行动,这对我们算法的性能、效率、工程上的考虑都是非常大的挑战。
第四点,它需要智能体有一个长期的规划
不是一个下意识的动作,是需要有记忆,需要考虑这场战争应该采取什么样的策略,中盘应该怎么考虑,发展到后期又应该采取什么样的策略,而且这个策略的计划是根据侦查到的所有的信息动态去调整,这对人工智能的挑战是非常非常大的。
第五点,时间、空间上的推理
在《星际争霸》里面要玩好的话,必须基于时序上、空间上去做推理,比如说地理位置的优势,坦克如果架在哪里可能会比较好,如果开分机在哪个位置去开会比较有利,甚至于军营造在什么地方,这些对于 AI 来说都需要进行一个空间上的推理。
第六点,多个智能体协作
《星际争霸》最高有 400 个 unit,所以其实是需要多个智能体协作的,需要多个兵种去配合,这也是对 AI 来讲一个很大的挑战。
《星际争霸》里面 AI 的研究或者竞赛不是最近才出现的,其实在 2010 年的时候已经有大量的研究人员在研究《星际争霸》里面的 AI,主要是以 ALBERTA 大学为主的研究力量,包括一些老师和学生,而且有三个固定的竞赛和一些循环赛,大家在上面 PK。这一类 AI 的话是 Classic AI,也就是没有学习能力、没有模型、也不需要训练,而是基于预编程的规则,所以不是非常灵活,这种算法下的 AI 其实离真正超过人类或者打败人类目标还是非常非常远的,它们可以打败内置的 AI,但是还远远比不上人类的专业选手,甚至连普通选手基本上也打不过。
另外一类是 Modern AI,也就是以智能体自主学习为主的算法,从去年开始这个领域火起来了,一方面就是,阿里巴巴还有伦敦大学学院,最近我们在合作的基于《星际争霸 1》里面做一些新的 AI 的尝试。
另外就是 Google Deep Mind,去年 11 月份他们和暴雪合作,会基于《星际争霸 2》去开放一个 API,让大家基于《星际争霸 2》上开发自己的 AI 算法,另外像 Facebook 他们也有一些团队做这方面的研究。
深度强化学习
强化学习是非常接近人类学习的一个学习机制,通过这个 Agent 跟环境的交互,在交互当中学习。Agent 会观察周围的环境,然后环境会给它一些反馈,Agent 根据状态和反馈会做出一些动作,这些动作会或多或少的影响这个环境,环境会根据这个动作反馈一些 Reward,Reward 可能是奖励的也可能是惩罚的,Agent 根据这样的试错,不断的去调整。Agent 背后有两个概念非常重要,一个是不停的优化策略,什么样的状况下采用什么样的 Action 是合理的,另外一个是用价值函数评估当前的状态它的价值是怎么样的。
强化学习跟深度学习结合,就叫深度强化学习。因为深度学习或者神经网络是非常适合去做这种表示学习的,可以表示成一个复杂的函数。policy 或者 value 用神经网络去逼近的话,在工程上或者效率上是非常好的提升。以 AlphaGo 的例子来讲,在训练的时候分成三个阶段,第一个阶段,从人类的棋谱里面学习人类的先验的知识,通过监督学习学习一个还好的、胜率比较高的 policy network,第二个阶段,基于监督学习学习出来的 policy network,然后自我对弈,通过 policy gradient 再去优化 policy network,这就比之前学出来的 policy network 要更好。第三阶段,再用学出来的强化学习版的 policy network 自我对弈,得到一个最佳的。
多智能体协作
其实目前为止所有的 AI 的智能体比较成功的一些应用基本都是这种单个的 Agent,其实对于人类来讲,协作智能是智能体的一个非常大的方面,我们的祖先智人为什么可以统治地球,其中一个很大的原因就是,他们学会了大规模的协作,而且是非常灵活的协作。可以想象一下,未来全部都是这种 AI 的智能体,它们能不能自我学习到人类水平协作的一个智能呢?
我们用了一个词 Artificial Collective Intelligence,这对现实和未来都有非常大的意义。比如手机淘宝,现在绝大部分流量背后都是一个算法推荐出来的,不管广告还是搜索其背后都是 AI 的智能体在做,目前这些智能体都是各出各的优化,或者推出自己的商品。
其实我们在考虑的是,比如手机淘宝首页里边有爱逛街、猜你喜欢这种位置,那么他们能不能够协同地去推出一些这样的商品,从而可以让用户的体验最好,让平台的价值最大化。其实以后可能都是算法经济、AI 经济,都是这种 AI 的 Agent,比如满大街可能都是自动驾驶的无人车,他们之间是不是也需要一些协作,让交通出行效率能够达到最大化。
最近我们在《星际争霸》里的微观战斗场景下,提出来一个多智能体双向协作网络,关于这个网络的详细内容大家感兴趣可以下载我们的 paper 看一下,这个工作是我们跟 UCL 一起合作完成的,用来探索或者解决多智能体协作的问题。
这是我们提出来的 BiCNet(Multiagent Bidirectionally-Coordinated Net) 的网络结构,它其实也是比较经典的结构,分成两部分,左边这部分是一个 policy 的网络,就是说从下往上会把《星际争霸》的环境进行一些抽象,包括地图的信息、敌方单位的血量、攻击力,还有我方 unit 的信息,抽象出来形成一个共享的 State,经过一个双向的 RNN 这样的网络,进行充分的双向的沟通,再往上每个 Agent 去得出自己的 Action,比如我到某一个地方去攻击谁。左边这个 policy network 就是对于当前的状态应该采取什么行动,右边就是一个 value 的 network,根据前面 policy 得出来的 Action,还有抽象出来的 State 进行评估,Q 值大概是多少,做出一个预判。当采取这些行动以后,这个环境就会给出相应的反馈,一些 Reward 来说明这步打的好还是不好,然后会通过一个 Reword 从右边这个网络下来,去反向传播更新里面的参数。
这个网络有几点比较好的设计:
第一,它的 scalability 比较好,《星际争霸》里面打仗的时候随时可能会有伤亡,这个 Agent 死掉以后这个网络不是还可以正常的工作,包括源源不断涌现的新的 Agent 进来,是不是也是可以工作。我们看到双向网络参数是共享的,所以是不会有影响的。
第二,我们在中间用了这样一个双向网络以后,其实是在一个效率和性能之间做了比较好的平衡,如果用全连接网络的话,计算量会过大。但是我们用一个双向网络,前面告诉你大概要做什么样的 Action,回来再告诉前面的人他们采取了什么样的 Action,一结合,最后算出来应该追加的策略是什么样子,从实际来看效果也是非常好的。
其实我们认知计算实验室在设计一些算法或者模型的时候会参考神经科学里边目前的一些研究成果,我们认为研究认知心理学、大脑、类脑的研究或者神经科学,对于做人工智能应该有两个好处。
第一个好处就是,神经科学具有启发性,就是当你在一些具体的问题或者场景里面去思考的时候,会遇到一些问题,这些问题可能是从来没有人解过的,如果神经科学、交叉科学里有类似的这种结构或者算法,这些可能会很好的解决你的问题,带来算法上的一些启发。
反过来另外一点,神经科学也可以帮你做验证,你设计一个算法以后,如果神经科学里面有类似的结构,那么很大概率这个算法是可以工作的。
其实我们的 Actor-Critic 网络在人脑里面也是有相应的对应,左边就是 Actor-Critic 这个网络,右边是我们的大脑,大脑里边纹状体就是负责 Actor、Critic 两部分,这个纹状体腹部是负责 Critic 这部分,背部是负责 Actor 这部分,Reward 下来以后我们大脑会计算,这与预期的 Reward 有什么差距,这个差距就会以多巴胺的形式影响到 Actor,下一次你就要按照这个去调节,让下一次 Action 做的更好一点。
其实多巴胺体现在我们的算法里面就是 TD error,也就是我们算的 Reward 的误差,这其实是一个很好的对应。
实验平台和实际效果
前面是网络架构的设计,为了实现这样一个算法模型,我们搭了一个实验平台,这个实验平台就是基于 Facebook 的 TorchCraft,它是把《星际争霸 1》和 Torch 封装在一起,但是我们比较习惯于 TensorFlow 和 Python,所以在上面做了一个封装,再把这套架构放在这个 OpenAI 标准接口里边,大家有兴趣可以试一下。
这个架构主要分成两部分,对应刚才说的强化学习:
左边是 Environment,其实就是《星际争霸》这个游戏,包括引擎,还有里面的 DLL,DLL 基于 BWEnv,这是一个官方认可的 DLL。基于这个 BWEnv DLL 把内部的状态、指令封装起来,其实这就是一个 Server;
右边就是 Agent,是一个 Client,这样你可以连上很多的 Agent 玩这个游戏。中间是传递的信息,Environment 会把它每一帧的数据吐给 Agent,Agent 会把每一帧的数据抽象成状态,然后再把这个 State 送到 model 里面去学习或者做预测,反过来会预测出来一些 Action,这些 Action 会封装成指令,再发回给《星际争霸》的 Environment,比如说开枪或者逃跑,这个是我们搭的这样一个《星际争霸》的实验平台。
下面是我们这个实验平台做到的一些效果,总结起来有五种可观测的智能。
第一种,可以配合走位。
这个例子就是三个枪兵打一个 Super 的小狗,这个小狗是我们编辑过的,血量非常大,一下子打不死。三个枪兵打一个小狗,a/b 这两个图,在训练的早期其实是没有学会太多的配合意识,所以他们走位的时候经常会发生碰撞,经过可能几万轮的训练以后,他们慢慢学会了配合队友的走位,这样大家撞不到一起。
第二个场景,边打边撤
这个配合就是边打边撤,Hit and Run 这样的技能,这个例子就是三个枪兵打一个狂徒,利用远程攻击的优势来消灭敌人。
第三种,掩护攻击
刚才三个枪兵打一个狂徒的时候是同时撤退,但是在这个场景下有些枪兵可能会去吸引这个小狗或者去阻挡一下,让另外两个枪兵抓住这个时间空隙来消灭这个小狗。非常有意思的一点就是,这种协作不是在任何情况下都会出现的,如果你的环境不是那么的有挑战性,可能它就是简单的 Hit and Run 就足够了,如果我们的环境更严苛一点,比如这个小狗血量调高,攻击力从 3 调到 4,或者血量从 210 调到 270,发现它又学会了另一种更高级的掩护攻击的协作,这就非常有意思了。
第四种,分组的集火攻击
这个例子是 15 个枪兵打 16 个枪兵,大家想想应该怎么取胜?策略可能 3 个枪兵或者 4 个枪兵自动组成一组,这 3 个枪兵先干掉一个、再干掉一个,就是把火力集中,但又不是 15 个枪兵打 1 个,而把火力分散一点,最后可能我们这方还剩 6 个枪兵,对方可能全部消灭掉了,这个都是通过很多轮次的学习之后他们自动去学到的这样一个配合。
第五种,不光是枪兵之间学会配合,还可以多兵种配合,异构的 Agent 的配合。
这个例子就是,两个运输机,每个运输机带一个坦克去打一头大象,正常来讲,两个坦克打一个大象肯定是打不过的,加上运输机的配合以后,大象攻击某一个坦克的时候,运输机会及时的把这个坦克收起来,让大象扑空,同时另外一个运输机赶紧把它的坦克放下去,去攻击大象,这样一来一回可能大象一点便宜占不到就被消灭了,这个是基于我们之前的做出 BiCNet 一个协作的展现。
关于未来的一些思考
但是《星际争霸》里其实不光是微观战斗,其实更难的是宏观的策略方面,怎么样“宏观 + 微观”打一整个游戏,这样其实我们也有一些思考,可能不是特别成熟,但是我们可以一起探讨一下。
每一个层级设定一个 Goal
要玩一个 full-game,如果是简单的单层次的强化学习,可能解决不了问题,因为 action space 实在太大了,一个比较自然的做法就是做层级式的方式,可能上层是策略规划,下面一层就是它的战斗、经济发展、探路、地图的分析等等,这样的话一层一层的,就是高层给下层设置一个 goal,下层再给下面一层设计一个 goal,其实这跟人的问题分解是比较类似的。
模仿学习(Imitation Learning)
我们觉得值得去研究和探讨的是模仿学习,Imitation Learning,刚刚讲的 AlphaGo 的例子也是 Imitation Learning,第一步通过监督学习学习比较好的策略,再把监督学习学好的策略通过自我的对弈去提升,在《星际争霸》里面更需要这种模仿学习,比如说我们两个枪兵打一个小狗的时候,我们认为一个好的策略是一个枪兵吸引小狗在那儿绕圈,然后另外一个枪兵就站在中心附近开枪,把这个小狗消灭,两个枪兵一滴血可以不死。但是这种策略是比较难学习的,所以我们先给它人为的让这个枪兵在里面画圈,画上几步之后枪兵自己学会画圈了,带着小狗,然后另外一个枪兵在后面追着屁股打,这种探索就非常的有效。
持续学习(Continual Learning)
Continual Learning,如果要迈向通用智能,这是绕不过去的课题。
Continual Learning 像人一样,我们学会了走路,下一次我们学会了说话,我们在学说话的时候可能就不会把走路这件事情这个本领忘掉,但是在《星际争霸》一些场景的时候,神经网络学到 A 的时候再去学 B,这个时候可能会把 A 的事情忘掉。
举个例子,一开始我们训练一个枪兵打一个小狗,这个小狗是电脑里边自带的 AI,比较弱,这个枪兵学会了边打边撤,肯定能把小狗打死。我们再反过来训练一个小狗,这个小狗去打电脑枪兵,这个小狗学会最佳策略就是说一直追着咬,永远不要犹豫,犹豫就会被消灭掉,所以它是一条恶狗,一直追着枪兵咬。然后我们把这枪兵和小狗同时训练,让他们同时对弈,这样发现一个平衡态,就是枪兵一直逃,狗一直追,《星际争霸》设计比较好的就是非常平衡。然后这个枪兵就学会了一直跑,我们再把这个枪兵放回到原来的环境,就是再打一个电脑带的小狗,发现它也会一直跑,它不会边打边撤。
你发现它学习的时候,学会了 A 再学会 B,A 忘了,这个其实是对通用人工智能是非常大的挑战,最近 DeepMind 也发了一个相关工作的 paper,这也是一个 promising 的方向,大家有兴趣可以去看一下,他们的算法叫 EWC。
引入 Memory 机制
最后一点,前面有说到几大挑战,其中有一大挑战就是长期的规划,长期规划里边我们认为一个比较好的做法就是,给这种强化学习里面去引入 Memory 的机制,这也是目前的一个比较火的方向,像 Memory Networks、DNC,要解决的问题就是,我们在学习的过程当中应该记住什么东西,从而使得我们可以达到一个很好的最大的 Reward。
所以今天跟大家交流的主要就是说,其实在《星际争霸》里面是蕴含了非常非常丰富的研究通用人工智能或者研究认知智能的场景,这个里面可以有很多非常有意思的课题。我只是列举了四个方向,其实还有很多很多方向可以去研究。
欢迎有兴趣的同学跟我们一起来认真的玩游戏。谢谢大家!
讲师介绍
龙海涛(花名德衡),2013 年加入阿里巴巴,现任认知计算实验室技术专家,目前主要关注深度学习、强化学习、神经科学等方面的科学和技术创新。在阿里巴巴任职期间,还负责过搜索直通车业务的架构设计,包括新一代的离线系统、在线引擎和索引内核。
感谢杜小芳对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ , @丁晓昀),微信(微信号: InfoQChina )关注我们。
评论