工欲善其事必先利其器——游戏 AI 环境对比

      DeepMind 发表 DQN 算法在 Atari 游戏上超过人类之后,游戏 AI 研究迅速成为了研究热点。游戏 AI 研究火热的一个侧面是游戏 AI 环境推陈出新,层出不穷。OpenAI Gym/Universe、ELF 和 SC2LE 等高水准的游戏 AI 环境相继问世。

1. 游戏 AI 环境简介

      游戏 AI 环境包括游戏和适应 AI 调用的 API 接口。现在的游戏 AI 环境可以分为两类:单一游戏 AI 环境和集成游戏 AI 环境。单一游戏 AI 环境是指针对一个游戏构建的游戏 AI 环境。因为针对星际争霸的实在太有名了,我将之单独作为一类。其中 TorchCraft 是 FaceBook 基于星际争霸 I 的做的,后来阿里在上面加了 Python 接口推出了 TorchCraft-py。SC2LE 则是 DeepMind 和暴雪合作,基于星际争霸 II 推出的。另外 Malmo 是基于 MineCraft,ViDoom 是第一人称射击类,Maze 是一个简单的即时策略游戏 (RTS),TorCS 是赛车模拟游戏。集成游戏 AI
环境则是指游戏 AI 环境拥有多款游戏,比较有名的集成游戏 AI 环境有 OpenAI Gym/Universe 和 ELF。

      
      除了这种划分标准,我们还有一种划分标准——游戏目的。1)大部分游戏 AI 环境是对现有游戏进行改造;这些现有游戏是专业游戏团队建立的,游戏目的是人们的娱乐。2)但是也有少部分研究者认为,现有游戏并不适合做 AI 训练,因此自己设计和实现游戏从而建立游戏 AI 环境;Maze 和 ELF 就是这种思路的代表;游戏目的是研究。

2. OpenAI Gym/Universe

      OpenAI Gym 是 OpenAI 发布的对比测试深度强化学习的框架,其框架是标准强化学习的框架,如下所示。

      
      OpenAI Gym 的用法简单明了。

      
      后来 OpenAI 又发布了一套工具,方便开发人员将世界上的游戏移植到 OpenAI Gym 上,并使用这套工具移植超过 1 千款游戏。这便是 Universe。OpenAI 的官博宣称:Universe 是一个能在世界上所有的游戏、网站和其他应用中,衡量和训练 AI 通用智能的软件平台。这样宣称是基于有了这套工具,就有了将世界上所有游戏移植到 OpenAI Gym 的潜力。。。

      OpenAI Gym/Universe 有一些问题。其中一个就是现有算法能够在大部分 OpenAI Gym/Universe 游戏超过人类。换而言之,OpenAI Gym/Universe 大部分游戏在学术上处于 Solved 状态。这让 OpenAI Gym/Universe 的学术价值没有那么大了。不过,OpenAI Gym/Universe 游戏依然能够为新算法提供测试场景。毕竟新算法在 Solved 的问题上比旧算法高效很多,也很有学术价值。但游戏 AI 研究的两大重镇:DeepMind 和 FaceBook 都自己搞一套,没在 OpenAI Gym/Universe 做实验。

3. ELF

      ELF 是 FaceBook 推出的游戏 AI 环境,包括围棋和 ALF(一个 Atari 游戏集)。除此之外,ELF 还实现了一个 RTS 游戏引擎,在这个引擎的基础上实现了一个夺旗游戏、一个塔防游戏和一个 mini-RTS。围棋和 ALF 是点缀,ELF 的重心是 RTS 游戏引擎上的 mini-RTS。

      

      ELF 用 C++ 将许多并行的游戏线程和每个线程的历史数据封装进去,每次 Python 循环时都可以得到一批次的游戏状态。这样做有两个好处:Python 操作简便,不需要考虑分布式多线程的问题;同时 C ++ 实现的游戏引擎效率高。

      

      在 ELF 的 mini-RTS 中,作者内置了一款基于规则的 AI, 同时实现了基于 A3C 强化学习的算法基线。从下面的对比图,我们可以看出 A3C 的效果要比基于规则的 AI。

      

      ELF 作者关心重点是 ELF 的效率,强调高速的游戏 AI 环境对提升游戏 AI 研究的迭代有重要意义。从下面对比图来看,ELF 的效率非常高,速度比其他游戏 AI 环境高了不少。ELF 为了研究去设计和实现游戏,可以控制游戏复杂,并且做很多框架和实现上的优化,从而实现极高的运行效率。

4. SC2LE

      2017 年 8 月 10 号,DeepMind 联合暴雪发布了星际争霸 II 游戏 AI 环境 SC2LE, 其框架如下所示。

      

这是标准的游戏 AI 环境的框架。对于一个复杂的游戏 AI 环境框架来说,三个问题需要得到解决:怎么抽象状态,怎么处理奖励和怎么抽象动作。对于怎么处理状态,SC2LE 使用三个部分的信息,分别是小地图、全地图和非空间信息。所谓非空间信息包括资源拥有量、科技树和建造队列等信息。

      

      SC2LE 有两种奖励函数。一种是依照最终结果(1/胜,0/平,-1/负);另一种是基于暴雪给的 Bllizzard 分(资源采集量、科技树升级、单位、建筑的加权和),通过API可以实时获取。显而易见,第一种奖励和我们的目标一致,但太稀疏了;第二种则反之。

      因为星际争霸的动作实在太多太杂,怎么抽象动作是 SC2LE 的一个重点。SC2LE 将星际争霸的动作空间整理成近 300 个动作函数,每个函数有相应的参数,参数一共有 13 种类型。比如在下图中,圈选一部分单位的函数为 select_rect, 两个整数参数表示选择矩阵的两个坐标点。

      
      游戏 AI 打星际争霸是非常难的任务,因此除了完整 1v1 游戏之外,SC2LE 还很贴心地提供了 7 种迷你游戏,包括指定位置移动、两个机枪兵收集水晶矿碎片、击败小狗、击败小狗和爆虫、收集资源、造机枪兵。虽然这种贴心到最后除了进一步证明了现有算法的渣,并没有什么卵用。。。

      为了验证 SC2LE 的效果并提供基线,SC2LE 提供了三个基于深度强化学习的基线方法。其中两个方法的网络结构分别是 Atari-net 和 FullyConv,第三个方法是 FullyConv 加 LSTM。

      

我们可以看到三种方法都被人打成狗了。。

      

完整游戏打不过人,那试一试迷你游戏模式。从下图可以看出,稍微复杂一点的迷你游戏上,这三种方法被人远远地超越了。图中 DeepMind Human Player 是 DeepMind 的一位员工,而 StarCraft Grand Master 是一名专业选手。

      

      从上面的结果来看,现有算法对于 RTS 无解,RTS 游戏是学术上 Un-Solved 的问题。在这里,我们可以看出 “为了研究设计和实现游戏” 做法的缺陷了:ELF 论文里面有实现基于规则和基于 A3C 的游戏 AI, 并报告了实验对比;但我们还是会困惑现有算法到底达到什么水平,和人类相比怎么样; ELF 中的 mini-RTS 本身比较简单同时没有大量人类玩的经验和技巧,因此无法给我们解答这些困惑。但 SC2LE 不一样,星际争霸 II 是被广泛接受,并有大量人类体验的实际游戏。在星际争霸上,算法和人类对弈,人们对算法的水平立马就有一个直观的感知。

5. 总结

      游戏 AI 环境推陈出新,层出不穷,得利于如火如荼的游戏 AI 研究。现在游戏 AI 环境极大丰富,就看游戏 AI 算法是在短期突破,还是长久守望了。

      最后有一点私货:目前我在和小伙伴们开发非完美信息游戏 AI 环境:RoomAI。RoomAI 的目标是提供一些非完美信息游戏环境和一些基线模型算法,方便 AI 开发人员快速地构建、测试和对比自己的非完美信息游戏 AI 算法。目前 RoomAI 已经支持德州、梭哈和七鬼,基本流程如下所示:玩家 AI 获得游戏环境给出的信息,当前玩家 AI 选择合适的动作,游戏环境根据该动作推进游戏逻辑;重复上述过程,直到分出胜负。

      RoomAI 的用法也是简单明了,下面是一个随机玩家的示例。


from roomai.kuhn import *;
import roomai.common
import random

#### Define your player Bot ####
class KuhnPokerExamplePlayer(roomai.common.AbstractPlayer):
    def receive_info(self, info):
        if info.person_state.available_actions is not None:
            self.actions = info.person_state.available_actions
           
    def take_action(self):
        idx = int(random.random() * len(self.actions))
        return self.available_actions.values()[idx]
        
    def reset(self):
        pass

if __name__ == "__main__":
    #### init ####
    env     = KuhnPokerEnv()
    players = [KuhnPokerExamplePlayer() for i in range(2)]

    #### playing ####
    scores = KuhnPokerEnv.compete(env, players) 
    print (scores)      

       如果对 RoomAI 项目有兴趣,欢迎同学们关注并 Star。

       欢迎关注 AlgorithmDog 公众号,每两周的更新会有推送哦。

weixin_saomiao

      

此条目发表在算法荟萃, 编程开发分类目录,贴了, , , , , 标签。将固定链接加入收藏夹。

工欲善其事必先利其器——游戏 AI 环境对比》有 1 条评论

  1. 饶尧绫说:

    你好,我是短信供应商,有需要可以联系我了解一下,微信NX94CG

发表评论

电子邮件地址不会被公开。