当前位置: 首页 > 资讯

【原创】这是一个会玩街头霸王2的AI,你敢挑战它吗?

机器人之家       2017-10-30

【原创】这是一个会玩街头霸王2的AI,你敢挑战它吗?

编者按:街霸2是卡普空的一款老牌格斗游戏,依靠出色的游戏性和市场表现,它被誉为游戏史上最伟大的电子游戏之一、格斗游戏的先驱。上周,国外团队Gyroscope Software在三星开发者大会(SDK)上展示了他们的最新成果——会玩街霸2的AI,吸引了无数参观者的目光。据介绍,Gyroscope Software的这个AI在面对3星评定对手时胜率超过90%,而且不“偏科”,擅长所有角色。虽然还未正式和职业玩家交手,但团队近日公布了一部分设计细节,并公开邀请其他团队加入竞赛。未来举办街霸2的AI混战、人机大战,前景可期。


【原创】这是一个会玩街头霸王2的AI,你敢挑战它吗?


AI VS AI的4场比赛,以上8个街霸2角色均由AI控制

如上图所示,AI体验的版本是Street Fighter II Turbo,即12人加速版。Gyroscope Software是一个为游戏玩家提供个性化插件、工具的团队,此前他们的AI从未尝试过主机游戏,这次选择街霸2作为实验平台也是一个“临时性”的决定——传统展台广告方式,如发传单、免费T恤不够吸引人。


为了现场直播格斗场面,工作人员自己弄了一个Gyroscope SNES SDK,没有街机,没有红白机,也没有新搭的展台,所有操作都在任天堂SNES模拟器上完成。


如何建立AI


在开始设计前,第一步是给问题定性。Gyroscope Software把“AI玩街霸2”这个问题定性为强化学习,即解决“决策”问题,让机器学会自主决策。在强化学习问题中,人工智能观察环境,选择将要采取的行动,并获得奖励。而它的目标正是通过观察到的信息采取最佳行动,从而把奖励最大化。因此,在训练AI前,工作人员需要定义街霸2的观察结果、动作和奖励。


观察结果(Observations)


观察结果即AI在游戏中“看”到的东西。当一个人在玩街霸2时,他会关注双方各选了哪个人物,包括它们跳、移动、踢等动作,以及血条和时间条。Gyroscope把这些信息提炼为“观察空间”,并将它们转化成AI能“理解”的形式。在强化学习中,划分观察空间有两种考虑方式,其中传统的做法是像人一样抓住问题的几个关键点,现代的做法则是抓取AI环境图像,依靠后台分析确定图中重要元素。通常来说,现代做法这种排除人为干扰因素的做法更优,因为它通用型更强,并且因为对特征做出的假设少,结果更理想。但为了缩短训练时间,Gyroscope选择了传统方法,手动定义了观察空间。


他们把观察空间定义为:


每个角色的X坐标和Y坐标;

每个角色的血量;

角色是否跳跃;

角色是否下蹲;

每个角色的移动ID;

角色间X、Y坐标的绝对差;

游戏时间。

【原创】这是一个会玩街头霸王2的AI,你敢挑战它吗?


游戏观察对象示例

需要注意的是,这个观察空间可以是巨大的,如果有需要,你可以定义上亿个独立的点。


行动(Actions)


一旦AI观察到了环境,它就必须采取行动。搜集动作组合最简单的方法是参考任天堂的手柄设计:上、下、左、右、A、B、X、Y、L、R。一共10个按钮,考虑到有些招式需要组合键,如果假设每种按键组合都有效,那就是210,共计1024种组合方式。玩过街霸2的玩家想必都清楚,比起4个键的拳皇,需要6个键的街霸2多少有些“钢琴手”,但其实游戏中真正使用的组合键远远没有这么多,而且有些技能也只是其他技能基础上的演变。对于AI来说,虽然它最终能学会这些组合,并能判断出哪些组合是有效的,哪些是无效的,但是1024种还是太多了,会加长训练耗时。


【原创】这是一个会玩街头霸王2的AI,你敢挑战它吗?


方向键介绍(任天堂SNES游戏手柄说明书)

【原创】这是一个会玩街头霸王2的AI,你敢挑战它吗?

所以Gyroscope又想到了另一种朴素的方法:列出每个角色可用的招数集,如春丽的气功拳 : ←↙↓↘→ + P。战斗中,AI先选择一个出招,由后台把这个动作转换成按钮顺序。比起1024种组合变化,这种方法大大减少了AI做的无用功,但也不是一个速成的选择。为了让AI适应每个角色的出招,它需要面对的是上百种组合方式,这需要大量数据,训练周期也不短。因此,又一次的,出于节约时间的考虑,Gyroscope将动作简化为两个键——一个方向按键、一个控制按键(如Up+A或L),并假定每种组合方式都是有效的。在这个方案中,AI要训练的动作只有35种。


值得注意的一点是,虽然Gyroscope这个版本AI在打斗招数上缺陷明显,但这并不意味着它无法学习更高级的组合动作,只要给予充足时间,这些问题都会得到解决。


奖励(Rewards)


最后,一旦采取行动,AI就会获得相应的奖励值。当人们在玩街霸2时,他们依靠伤害和血量评判自己的战斗表现。AI需要把这种感知换算成数字,并使之最大化。Gyroscope把角色间的血量差作为奖励,在比赛中,AI获得的奖励和血量差相当。举个例子,在第一轮观察中,如果AI通过“踢”连续对对方造成了10次伤害,那奖励值就是10;如果在那之后,AI没有继续发动攻击,而是在第二轮观察中“无所事事”,那它获得的奖励值还是10。为什么?因为它保持了血量差距。


事实上,如果这时对方发起进攻而AI没能防御,双方血量差会减少,这对AI来说是不利结果,因此它也会把这种事件作为影响行为的要素之一。


【原创】这是一个会玩街头霸王2的AI,你敢挑战它吗?


达尔锡(游戏角色)训练情况

用AI建立AI


以上只是Gyroscope得出的最终结论,在实际探索过程中,他们还调整了AI系统中的参数。Gyroscope的AI是一种针对算法的算法,它能计算出这个算法适用于哪个问题。随着街霸2数据越来越多,他们选择了DQN作为强化学习方法,并做了一些修改,其中最大的改动之一是取消基于图像的观察空间。DQN的优势在于利用模型预测最佳行动,而不是进行测试,它能预判每个可能发生的行动。


模拟器


在训练AI前,首先得把它连接到游戏。Gyroscope先是在speedrun社区找到了模拟器核心,之后又找到了可以搭配模拟器核心的工具BizHawk:


Lua语言脚本接口,可以逐帧控制游戏;

一套控制台内存监视工具,允许一个人检查游戏内存;

无限速的运行,能最大化游戏帧数;

BizHawk源代码。

就街霸2这款游戏而言,Lua接口允许设置手柄按钮并获得控制信息,同时读取存储位置和模拟器核心,这意味着Gyroscope能获得对手血量多少、动作及其他需要的数据信息。AI在整个训练过程中就是模仿人类玩家做出反击,它的“经验”积累没有突破人类认知范围。


观察运存:在SNES WRAM中查找观察结果


从上文中可知,他们选取的观察空间涉及以下几个点:


角色坐标;

双方血量情况;

角色动作;

剩余时间。

这些数据在SNES RAM中的表现是这样的:


【原创】这是一个会玩街头霸王2的AI,你敢挑战它吗?


BizHawk RAM inspector

可以发现,SNES的内存分布被很好地记录了下来,在这个基础上,辅以BizHawk其他工具来监视每一帧之间RAM值的变化,Gyroscope轻松找到了战斗中的“空隙”,并选择更理想的出招。创建RAM映射的方法是:


public int get_p1_health()

{

   return _currentDomain.PeekByte(0x000530);

}

public int get_p2_health()

{

   return _currentDomain.PeekByte(0x000730);

}

这些代码能逐帧读取这些值,并构建整个游戏的观察数据结构。


从Lua到C


BizHawk在应用程序中嵌入了一个Lua脚本引擎,并向该引擎公开了一些模拟器函数,所以Gyroscope尝试的第一件事是在Lua上写Gyroscope SDK。他们写了一个Lua库,用于访问所有的内存位置,这些位置随后被转换为观察结果,并向模拟器发送手柄按键信息。


Lua接口不支持任何网络I/O!只支持文件I/O和SQL I/O. Gyroscope的服务跑在云端,所以这可是一个大问题。于是Gyroscope用python写了一个接口EmulatorController,希望能把文件从云同步到本地,但事实证明,同步的速度太慢了。于是他们把SDK代码转移到了本地,并开始使用BizHawk提供的C#工具。


使用C#, 意味着可以使用所有的.NET库,因此Gyroscop很快实现了连接到EmulatorController的套接字。但放弃了Lua就意味着无法逐帧提取观察结果。Gyroscope采取的替代方法是将每一帧的观察结果发送到EmulatorController,随后控制器查询Gyroscope AI,并将模拟结论发送到下一帧。


利用这种方法,Gyroscope的街霸2模拟器可以和主机同步,训练正式开始。


训练开始时,AI(达尔锡)在随机挑选按钮

为了最大限度地提升奖励、获得更高的胜率,Gyroscope为每个角色安排了8小时的训练时间或3000场比赛。


训练进行到1400局,AI(达尔锡)胜率达到50%

在训练数据基础上,Gyroscope对原先设定的参数进行了调整。


【原创】这是一个会玩街头霸王2的AI,你敢挑战它吗?


训练期间的胜率和模型损失

Gyroscope发现,如果AI选择了方向键,那接下来一段时间内游戏的变化会很小;如果选择的是控制键,那框架内的游戏就会发生重大变化。他们由此得出一个结论——两种按键权重不同。例如,出拳需要很多帧,这意味着角色动作可以在后几帧中发生变化。此外,这还涉及按键使用习惯,当人在使用手柄时,他们会频繁按压按键来进行操作(无效操作&攻击时机)。为了适应这个游戏行为,也为了使AI更人性化,Gyroscope让AI在进行下一步操作前先进20帧(将近1/3秒),奖励在这20帧内积累。换句话说,AI采取行动并进行观察的用时是游戏总时间的1/3。


至于为什么没有把赢得比赛作为奖励,其实是因为这是一种延迟奖励,它会使AI训练更困难、更冗长,相较之下,血量差异是一种更直观的判断方法。


AI(达尔锡)80%胜率:注意格挡和特殊动作

刚开始训练时,AI的胜率只有20%,当时它对对手一无所知,但经过一段时间的训练,它的胜率已经达到90%。如果时间更长,AI的胜率会更高。为了防止在AI对战时出现双方“胶着”的尴尬局面,Gyroscope使用了80%胜率时的模型。


【原创】这是一个会玩街头霸王2的AI,你敢挑战它吗?


Windows批处理效果不太好

AI间的真正较量


【原创】这是一个会玩街头霸王2的AI,你敢挑战它吗?


四分之一决赛:M. Bison赢得胜利


古烈VS维加:古烈败。AI版维加在走位上更灵活,更快学会近身暴击。

布兰卡VS M. Bison:布兰卡败。M. Bison的特殊技无法被规避。

春丽VS沙加特:沙加特败。春丽的速度和低攻击在战斗中优势更大。

巴洛克VS达尔锡:巴洛克败。比赛中,巴洛克几乎一直在被踢。

半决赛


维加VS M. Bison:M. Bison胜,晋级决赛。

春丽VS达尔锡:达尔锡空踢太猛,胜。

决赛


达尔锡VS M. Bison。M. Bison非常积极,毫无悬念地赢得了胜利。

以上比赛发生在三星开发者大会期间,第二天,Gyroscope又举办了一场AI大战,这次他们把M. Bison换成了本田。这一次取得胜利的是前一天惨遭春丽淘汰的沙加特,新选手本田进入了决赛,但难逃落败命运。事实上,之后Gyroscope专为他们俩加赛了100场,而本田获胜的次数只有可怜的11次。


下一步是什么?一起来玩AI!


文章最后,Gyroscope向社会公开招募竞争者,他们准备举办一个街霸2的AI-bot竞标塞,胜者的奖品是SNES Classic(迷你超级任天堂主机)。如果你有兴趣加入,请发邮件至info@gyroscope.cc,或进行注册。


Gyroscope已经公开了他们的模拟器,有需要的读者可以前往他们的github下载,地址是github.com/GyroscopeHQ/BizHawk。


目前他们已经收到了很多对战要求,当然其中也不乏街霸2玩家。但是由于精力有限,目前Gyroscope还没有举办人机大战的计划,但他们也开放了申请,如果你是一名优秀的街霸2玩家,并且希望挑战他们的AI,你可以联系他们,并在他们的实验室与机器人一较高下。他们公司的地址是美国加利福尼亚州旧金山市。


机器人网原创文章,未经授权禁止转载。详情见转载须知

本文来自机器人网,如若转载,请注明出处:https://www.jqr.com/news/008316