【新智元导读】 AlphaStar再次展现了DeepMind对研究方向的精准把控和卓越的工程实力。本文根据DeepMind博文及相关资料做了推演,试图在研究论文公布前复现AlphaStar的训练过程。沿用这套方法,你也 创建自己的星际2训练环境!
自AlphaGo解决围棋问题之后,《星际争霸2》就成了DeepMind公司的新目标。在2018年6月,DeepMind发表了一篇论文,展示如何运用深度强化学习,解决诸如采矿最大化这样的小游戏。
没想到仅6个月后, 他们的AI就已经可以和职业选手过招了 。AlphaStar在Catalyst LE地图上打神族内战(PvP),以 5:0 战胜了职业选手TLO与MaNa,只是到了现场比赛时,被MaNa找到了一个无法应对棱镜骚扰的Bug致败。DeepMind公司那批机器学习天才们,研究方向掌握之精准,工程控制能力之强大,令人印象深刻。
这样的表演赛是DeepMind常见的预热,相信不久后它就会对Serra l 和Maru这样的顶级职业选手提出挑战。后者假如迎战,大概率菊花不保。
不过,与围棋不同的是,星际争霸这类即时战略游戏还有操作技能这一环。AlphaStar有不切屏看大地图的功能,以及偶尔爆出超越人类极限的有效手速(eAPM),都被指责为不够公平。相信DeepMind在正式邀战时会解决这些问题。
很多人最关心的一个问题是, AlphaStar究竟是如何训练出来的呢? 我们尝试在正式论文尚未放出之前,通过DeepMind的博客文章作一些分析解读。
玩星际争霸的AI面对的问题
星际争霸2是一个困难的即时战略游戏。玩家必须实时地在成百上千个可行的操作中作出决断。
与人类相仿,AI的控制流同样由一轮轮操作组成。在每一轮中,AI先获取当前游戏状态,据此衡量并选择一次操作,然后提交给星际争霸2环境。
AI经由Blizzard和DeepMind联合创建的PySC2接口,与星际争霸2的游戏核心进行交互。每一步中,AI能够获取的游戏信息是一个矩形网格,网格的每个位置代表地图上的一个位置。每个位置上都有若干数值,代表此地的有效信息。
另一种理解方式是,游戏信息被组织成若干个网格,每份网格代表某一项特定信息(见上图右侧)。比如说“fog-of-war”网格代表是否存在战争迷雾;“height-map”网格代表地形高度;“unit-type”网格代表建筑或者作战单位。详细说明可参考报告论文[1]的第3.2节。
在操作方面, AI定义了300多个“宏操作” ,在每一轮中,AI从这个集合内选取某个宏操作执行。宏操作由一系列基本操作组成。例如,“把当前选中的单位移到A处”,可以分成三步:1) 决定移动,2) 决定是否把操作排队,3) 点击某个地图位置。而上述操作又可以进一步分解为“按m键;松开m键;决定是否按shift键;地图A处按下鼠标左键;松开鼠标左键”。
不同粒度的操作分解,会将问题焦点分配到不同抽象层面。如果操作种类特别基本,到了按键盘鼠标的程度,单个操作的意义就非常小,探索有意义的策略就很难。反之,如果宏操作非常复杂,虽然意义显著,但每一步的选择空间又变得过于宽广,选中合适的策略也很难。 PySC2取了一个平衡点,每个宏操作的意义,与人类逻辑层面上感知的操作接近 ,比如上面移动单位的例子,它就给了一个专门的操作。
AI一旦从决策空间选定了宏操作之后,就会生成一条 (a0, a1, a2, a3, a4, ...) 形式的指令,其中“a0”指定了300多个基本操作之一,而“a1, a2…”是操 作参数,比如给需要移动单位指定目的地。直观图示如下:
为什么都说星际争霸2问题难?
因为需要探索的空间太大。
根据DeepMind的报告,考虑操作和参数的各种组合,在典型对战环境中,决策空间的大小约有10^26 (简短的介绍可参见报告论文[1]第3.3节)。如果把星际争霸想像成一盘棋局,那么
棋局的状态就是战场的全部信息,但由于战争迷雾的存在,星际2中一位弈者相当于遮挡住部分棋盘来对局;
每一步可以落子的位置对应于此步可以进行的操作,其可能性的数量级大致相当于一大瓶可乐里水分子的数量。
注意以上讨论的仅仅是AI决定单步操作时需要面对的挑战,在对战中每一步对应一个的时间节点,如果按照职业玩家的操作频率来计算, 每分钟需要行棋数百步 ,每步都在前一步的基础上以乘数拓展一个状态空间!
学习一步的操作固然困难,但尚可算入当前最成熟的统计学习方法—— 监督学习 ——可实际解决的问题的范畴。即给机器提供大量可观测的输入,即学习样本,并提供期望产生的输出。AI从这些配对样本中,学到输入与输出的变量应该怎样对应。
监督学习方便简单,而且从工程实现的意义来说,其实是我们唯一可以成熟使用的范式。但实际应用到 学习对战 这种任务上立即就会呈现出局限性 。
我们想象一个最简单例子,监督学习范式可以方便地运用到单个人脸识别,单个数字识别,单个物体识别这样的任务中。但如果不是“ 单个 ”数字识别,而是识别“ 一串 ”手写数字,那么我们应当如何构建监督学习呢?
1) 可观测的输入:整个图像;期望产生的输出:类似于“02971736”这样的数字串。
假设输出的数字有个固定的长度上限,比如5位数字。那么对一副图像就可能有高达10^5种可能的输出。想训练好一个“5位数字串”识别器,就需要对每一种可能的字串,提供与其对应的图像例子,比如10000张不同的“01234”图像。那么,对所有的类别,“34567”,“34555”,“23588”…都提供10,000张用于训练的例子,其耗费将不可忍受。而每种类别10,000个例子的数量还是十分保守的估计,在典型的数字图像数据集,比如MNIST中,每个单个数字“0”,“1”,……的例子就有此数。
2) 可观测的输入:矩形图像块;期望产生的输出:“0”,……,“9”这类单个数字