编者按:街霸2是卡普空的一款老牌格斗游戏,依靠出色的游戏性和市场表现,它被誉为游戏史上最伟大的电子游戏之一、格斗游戏的先驱。上周,国外团队Gyroscope Software在三星开发者大会(SDK)上展示了他们的最新成果——会玩街霸2的AI,吸引了无数参观者的目光。据介绍,Gyroscope Software的这个AI在面对3星评定对手时胜率超过90%,而且不“偏科”,擅长所有角色。虽然还未正式和职业玩家交手,但团队近日公布了一部分设计细节,并公开邀请其他团队加入竞赛。未来举办街霸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坐标的绝对差;
游戏时间。
游戏观察对象示例
需要注意的是,这个观察空间可以是巨大的,如果有需要,你可以定义上亿个独立的点。
行动(Actions)
一旦AI观察到了环境,它就必须采取行动。搜集动作组合最简单的方法是参考任天堂的手柄设计:上、下、左、右、A、B、X、Y、L、R。一共10个按钮,考虑到有些招式需要组合键,如果假设每种按键组合都有效,那就是210,共计1024种组合方式。玩过街霸2的玩家想必都清楚,比起4个键的拳皇,需要6个键的街霸2多少有些“钢琴手”,但其实游戏中真正使用的组合键远远没有这么多,而且有些技能也只是其他技能基础上的演变。对于AI来说,虽然它最终能学会这些组合,并能判断出哪些组合是有效的,哪些是无效的,但是1024种还是太多了,会加长训练耗时。
方向键介绍(任天堂SNES游戏手柄说明书)
所以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来说是不利结果,因此它也会把这种事件作为影响行为的要素之一。
达尔锡(游戏角色)训练情况
用AI建立AI
以上只是Gyroscope得出的最终结论,在实际探索过程中,他们还调整了AI系统中的参数。Gyroscope的AI是一种针对算法的算法,它能计算出这个算法适用于哪个问题。随着街霸2数据越来越多,他们选择了DQN作为强化学习方法,并做了一些修改,其中最大的改动之一是取消基于图像的观察空间。DQN的优势在于利用模型预测最佳行动,而不是进行测试,它能预判每个可能发生的行动。
模拟器
在训练AI前,首先得把它连接到游戏。Gyroscope先是在speedrun社区找到了模拟器核心,之后又找到了可以搭配模拟器核心的工具BizHawk:
Lua语言脚本接口,可以逐帧控制游戏;
一套控制台内存监视工具,允许一个人检查游戏内存;
无限速的运行,能最大化游戏帧数;
BizHawk源代码。
就街霸2这款游戏而言,Lua接口允许设置手柄按钮并获得控制信息,同时读取存储位置和模拟器核心,这意味着Gyroscope能获得对手血量多少、动作及其他需要的数据信息。AI在整个训练过程中就是模仿人类玩家做出反击,它的“经验”积累没有突破人类认知范围。
观察运存:在SNES WRAM中查找观察结果
从上文中可知,他们选取的观察空间涉及以下几个点:
角色坐标;
双方血量情况;
角色动作;
剩余时间。
这些数据在SNES RAM中的表现是这样的:
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对原先设定的参数进行了调整。
训练期间的胜率和模型损失
Gyroscope发现,如果AI选择了方向键,那接下来一段时间内游戏的变化会很小;如果选择的是控制键,那框架内的游戏就会发生重大变化。他们由此得出一个结论——两种按键权重不同。例如,出拳需要很多帧,这意味着角色动作可以在后几帧中发生变化。此外,这还涉及按键使用习惯,当人在使用手柄时,他们会频繁按压按键来进行操作(无效操作&攻击时机)。为了适应这个游戏行为,也为了使AI更人性化,Gyroscope让AI在进行下一步操作前先进20帧(将近1/3秒),奖励在这20帧内积累。换句话说,AI采取行动并进行观察的用时是游戏总时间的1/3。
至于为什么没有把赢得比赛作为奖励,其实是因为这是一种延迟奖励,它会使AI训练更困难、更冗长,相较之下,血量差异是一种更直观的判断方法。
AI(达尔锡)80%胜率:注意格挡和特殊动作
刚开始训练时,AI的胜率只有20%,当时它对对手一无所知,但经过一段时间的训练,它的胜率已经达到90%。如果时间更长,AI的胜率会更高。为了防止在AI对战时出现双方“胶着”的尴尬局面,Gyroscope使用了80%胜率时的模型。
Windows批处理效果不太好
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