近日,在 QCon北京2017上,来自阿里巴巴认知计算实验室的技术专家龙海涛(花名德衡)发表了题为《星际争霸和AI》的专题演讲。《星际争霸》一直是游戏玩家心目中即时战略类的经典之作,历时十多年而不衰。
而如今它更成为深度强化学习、人工智能算法研究的一个主要平台和工具。因为其蕴含了多智能体协作、多任务学习、宏观策略规划等复杂问题,一旦取得部分突破和进展,对商业和社会发展都会带来极大影响。如国外的 DeepMind、Facebook 等公司相继投入大量人力基于它进行通用人工智能的研究。
在本次演讲中,德衡重点介绍了阿里巴巴如何在《星际争霸》游戏环境中研究人工智能算法,分享阿里在这方面研究尝试中得到的初步成果,并重点阐述多智能体协作在微观战斗场景中的应用,以及未来在这个平台上的进一步的研究方向等。
以下为演讲全文:
大家下午好!我是来自阿里巴巴认知计算实验室的龙海涛,今天主要跟大家聊一下“《星际争霸》与人工智能”的话题。首先我会介绍一下为什么会选择《星际争霸》这个游戏来做人工智能前沿性的研究。
1. 为什么选择《星际争霸》作为人工智能算法研究的环境
首先可能大家有疑问,为什么选择《星际争霸》这个游戏来做我们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 DeepMind,去年11月份他们和暴雪合作,会基于《星际争霸2》去开放一个API,让大家基于《星际争霸2》开发自己的AI算法,另外像Facebook也有一些团队做这方面的研究。
2. 深度强化学习
强化学习是非常接近人类学习的一个学习机制,通过这个Agent跟环境的交互,在交互当中学习。Agent会观察周围的环境,然后环境会给它一些反馈,Agent根据状态和反馈会做出一些动作,这些动作会或多或少的影响这个环境,环境会根据这个动作反馈一些Reward,Reward可能是奖励的也可能是惩罚的,Agent根据这样的试错,不断的去调整。
Agent背后有两个概念非常重要,一个是不停的优化策略,什么样的状况下采用什么样的Action是合理的,另外一个是用价值函数评估当前的状态它的价值是怎么样的。
强化学习跟深度学习结合,就叫深度强化学习。因为深度学习或者神经网络是非常适合去做这种表示学习的,可以表示成一个复杂的函数。policy或者value用神经网络去逼近的话,在工程上或者效率上是非常好的提升。
以AlphaGo的例子来讲,在训练的时候分成三个阶段,第一个阶段,从人类的棋谱里面学习人类的先验的知识,通过监督学习学习一个较好的、胜率较高的policy network;第二个阶段,基于监督学习学习出来的policy network,然后自我对弈,通过policy gradient再去优化policy network,这就比之前学出来的policy network要更好;第三阶段,再用学出来的强化学习版的policy network自我对弈,获得一个最佳。
3. 多智能体协作
其实目前为止所有的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的误差,这其实是一个很好的对应。
4. 实验平台和实际效果
前面是网络架构的设计,为了实现这样一个算法模型,我们搭了一个实验平台,这个实验平台就是基于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一个协作的展现。
5. 关于未来的一些思考
但是《星际争霸》里其实不光是微观战斗,其实更难的是宏观的策略方面,怎么样“宏观+微观”打一整个游戏,这样其实我们也有一些思考,可能不是特别成熟,但是我们可以一起探讨一下。
第一点,要玩一个full-game,如果是简单的单层次的强化学习,可能解决不了问题,因为action space实在太大了,一个比较自然的做法就是做层级式的方式,可能上层是策略规划,下面一层就是它的战斗、经济发展、探路、地图的分析等等,这样的话一层一层的,就是高层给下层设置一个goal,下层再给下面一层设计一个goal,其实这跟人的问题分解是比较类似的。
第二点,我们觉得值得去研究和探讨的是模仿学习,Imitation Learning,刚刚讲的AlphaGo的例子也是Imitation Learning,第一步通过监督学习学习比较好的策略,再把监督学习学好的策略通过自我的对弈去提升,在《星际争霸》里面更需要这种模仿学习,比如说我们两个枪兵打一个小狗的时候,我们认为一个好的策略是一个枪兵吸引小狗在那儿绕圈,然后另外一个枪兵就站在中心附近开枪,把这个小狗消灭,两个枪兵一滴血可以不死。但是这种策略是比较难学习的,所以我们先给它人为的让这个枪兵在里面画圈,画上几步之后枪兵自己学会画圈了,带着小狗,然后另外一个枪兵在后面追着屁股打,这种探索就非常的有效。
第三点,我们叫Continual Learning,如果要迈向通用智能,这是绕不过去的课题。Continual Learning像人一样,我们学会了走路,下一次我们学会了说话,我们在学说话的时候可能就不会把走路这件事情这个本领忘掉,但是在《星际争霸》一些场景的时候,神经网络学到A的时候再去学B,这个时候可能会把A的事情忘掉。
举个例子,一开始我们训练一个枪兵打一个小狗,这个小狗是电脑里边自带的AI,比较弱,这个枪兵学会了边打边撤,肯定能把小狗打死。我们再反过来训练一个小狗,这个小狗去打电脑枪兵,这个小狗学会最佳策略就是说一直追着咬,永远不要犹豫,犹豫就会被消灭掉,所以它是一条恶狗,一直追着枪兵咬。
然后我们把这枪兵和小狗同时训练,让他们同时对弈,这样发现一个平衡态,就是枪兵一直逃,狗一直追,《星际争霸》设计比较好的就是非常平衡。然后这个枪兵就学会了一直跑,我们再把这个枪兵放回到原来的环境,就是再打一个电脑带的小狗,发现它也会一直跑,它不会边打边撤。你发现它学习的时候,学会了A再学会B,A忘了,这个其实是对通用人工智能是非常大的挑战,最近DeepMind也发了一个相关工作的Paper,这也是一个promising的方向,大家有兴趣可以去看一下,他们的算法叫EWC。
最后一点,前面有说到几大挑战,其中有一大挑战就是长期的规划,长期规划里边我们认为一个比较好的做法就是,给这种强化学习里面去引入Memory的机制,这也是目前的一个比较火的方向,像Memory Networks、DNC,要解决的问题就是,我们在学习的过程当中应该记住什么东西,从而使得我们可以达到一个很好的最大的Reward。