N.GAME丨网易互娱AI Lab技术主管曾广俊:让游戏更智能——强化学习在互娱游戏的落地

2022N.GAME网易游戏开发者峰会于「4月18日-4月21日」举办,本届峰会围绕全新主题“未来已来 The Future is Now”,共设置创意趋势场、技术驱动场、艺术打磨场以及价值探索场四个场次,邀请了20位海内外重磅嘉宾共享行业研发经验、前沿研究成果和未来发展趋势。

今天的干货来自技术驱动场的嘉宾曾广俊,他是网易互娱AI Lab的技术主管。

以下是嘉宾分享实录:(部分删减与调整)

大家好。非常高兴来到N.GAME峰会跟大家分享一下强化学习在互娱游戏的落地。

互娱AI Lab成立于2017年底,主要是要将3D、CV、RL、NLP和语音技术落地到游戏当中,解决游戏的痛点问题。今天我们来讲一下强化学习是什么?强化学习可以在游戏里面做些什么?最后展望一下强化学习除了在游戏当中,还能在其他领域做出什么样的应用。

一、强化学习是什么?

假如现在我们要训练一条小狗做出坐下的这样一个动作,我们可能会做出一个指令让它去坐下。如果小狗做对了这个动作,我们就会给一个食物奖励它;如果它没做到那我们就不会给奖励。通过这样的反馈,多次的迭代,我们的小狗最终就会知道要做出坐下这个动作才能获得奖励。

同样,当我们的游戏接入了以后,我们会把当前的状态信息发送给AI,AI根据当前的一些状态去做出动作。由游戏反馈这个动作是否会有奖惩,AI得到反馈之后就会据此调整它的策略。

通过多轮的迭代,它就会知道在某个时刻应该要做什么样的动作才能获得最大的回报。由于我们需要和环境进行大量交互,所以强化实习通常需要很多的时间让机器去做探索,努力缩小探索空间、提高样本的利用率,来提高强化学习的训练效果是一个重要的方向。

二、强化学习可以在游戏里面做些什么?

游戏要接入强化学习时非常简单,只要实现两个接口,一个就是reset接口,一个就step接口。reset接口会从游戏里面返回初始状态;step接口就是从AI里面获取对应的动作。然后,游戏环境返回下一个状态的信息和一些回报的奖励信息,最后把这个游戏打包成动态库或者docker,就可以交给强化学习AI训练。

1、强化学习的主要应用:对战型AI

实际上,强化学习最主要的应用主要还是对战型AI。在互娱游戏中我们落地了NPC的对战AI。先以天下3山海绘为例,天下3山海绘是一个人机对战的卡牌游戏,玩家可以选多个难度,跟机器人进行对战。

策划需要在短时间内完成人机对战AI,这个AI要适应多种难度,且难度要能动态调整,以适应玩家的水平。

如果我们用行为树做山海绘的AI的话,是需要策划用很多的时间去列举每个状态的信息,然后根据状态的节点去做对应的动作,如果我们要做分级难度的话就更需要细致去划分,这样花费的时间将会更加巨大,上线之后每一次卡牌的更新,都需要策划去重新花费大量时间修改行为树去适应新的卡牌。

实际上,这浪费了很多的人力和时间。更关键的是,行为树的AI通常强度都是达不到通常玩家的水平。如果用强化学习去做的话,我们就可以很快速的去生成AI,尤其当新卡更新到新的游戏环境里面,强化学习可以很快速地适应一个新的环境,只需要重新再Finetune一下就可以了。

强化学习训练本身,是在做机器人的自对弈的行为。这样的一个过程中,自然而然地批量生成了大量不同难度的AI。这些AI可以无缝迁移,滿足玩家对于难度选择的需求。最关键的一点是用强化学习去做AI,它最后的强度能够远超玩家的水平。

我们的强化学习训练和一般的强化学习类似,都是主要由采样器,训练器来组成。采样器在CPU上面执行AI的决策,通过与游戏环境进行交互,生成大量的样本。这些样本又可以送到GPU上面的训练器上进行优化,优化出来的模型再放到模型池里面。

模型池可以让AI去选择对战的对手,通过迭代模型池的强度,当前训练的AI也会逐渐的变强。其中,模型池的模型也可以作为不同难度的AI模型让玩家选择。这个AI的难点主要是在动作空间上,刚才提到训练强化学习其实是试错的过程,如果我们可选的动作太多的话,我们需要去找到合适的动作就需要很长的时间。

比如我要出AABCCD这样的一个动作,它有好几张牌,我们第一张牌可能会有几十个选择,第二张牌同样也会有几十张选择。这么多卡牌的选择组合起来,树型的结构会使我们的动作空间成指数级增长。我们的解决方案是把单步决策变成序列决策。

也就是说,我们从游戏环境里面得到的状态,AI决策第一张牌应该要出什么,再把第一张出的牌和环境的状态再输进去AI,再做一次决策。第二张牌再以同样的模式,再输出到下一轮的决策里面。

最后,我们就可以输出一个持续的决策,AABCCD再统一返回到给我们的游戏环境中。这样就可以把一步的决策化为多步的决策,把游戏空间从指数级降到一个常数的级别。

我们对比一下强化学习跟行为树的AI。在加入新的卡牌之后,强化学习明显需要的时间会比行为树少很多。它相比于行为树,只有3-5个等级,具有的100多个难度等级也比较平滑。另外,它还可能会存在着比较大的难度跳跃。而强化学习,它能做到远高于玩家的水平,这是行为树不能做到的。

我们也挑战了更难的游戏,参加了NeurIPS举办的MineRL Diamond比赛,这个比赛已经举办第三届,每一次都吸引了大量工业界和学术界的强队参加。这个比赛的目的就是在MineCraft的环境中,从一开始用一把斧头开始采集木头资源,再通过木头资源去做下一步的工具,最后,要挖掘到钻石。这个比赛举办以来,基本上没有队伍能在这种环境里面从中挖到了钻石。比赛有很多方案,大多数队伍都选择了基于玩家数据去进行训练,如基于玩家数据进行模仿学习,或者在模仿学习组上再进行强化学习。

但官方提供的数据其实不多,玩家的水平也是参差不齐,其中也有很多无效的操作。我们也尝试过使用官方的数据集进行训练,实际上效果也并不好。那我们能不能直接用强化学习,从零开始训练呢?可以,但我们要解决几个难点。环境输出的是以图像信息为主的,由于图像信息,它是一个3x64x64的一个图片,它的信息维度是非常大的。要AI去遍历这么一个大空间的数据其实非常困难,因此,我们就采用了CNN网络,尽量去降低它的一个复杂度,提出它的一些关键特征。

另外,对于这个比赛需要AI有长期的规划能力。比如它需要先从产木头开始,产够了足够的木头才能去做木镐,用木镐才能去更好地去挖石头,挖到石头后制造石搞去挖铁,这样一环扣一环的操作才能有机会挖到钻石,这就需要AI在每个时刻都能知道自己的策略是要干什么,自己下一步需要干什么。而这么长的一段时间里面,让AI去盲目地去探索也是使用强化学习直接训练所需要面临巨大挑战。我们做的主要工作就是从缩减它的探索空间。

首先是动作编码,我们会把动作精简到只有20个动作,而且根据当前的局面去屏蔽一些不需要的动作。这样的话,实际上我们AI每一次可以选择动作非常少,这样可以压缩探索的空间。跳帧也是一个关键点。

通过跳帧我们可以把本来很长的游戏压缩成比较短的游戏过程,AI需要做的决策数目也大大缩小了,这些策略都能进一步缩减我们的探索空间。缩减了探索空间,我们就能在比较短的时间里面训出比较好的效果。更重要的是,有一个合理的奖励。比如我们去寻宝,需要一个藏宝图,用藏宝图去指引我们下一步的目标在哪里,通过达到一个目标获取下一条线索,才能更容易找到目标。

如果用原生的原始奖励,要不就是第一次资源就获得奖励之后再不能获得奖励。这样的话,我们的AI可能就学不到,应该要重复收集足够的资源才能去做工具。如果每一次都有奖励,AI又可能会学到刷分这样的一个行为。所以我们就细致的调整了它实际的一个奖励,去更好地引导AI的训练。

比如木头的话,它是一开始需要比较多,后面没有用。所以,我们一开始会给它重复的奖励,到了一定程度就不会再给奖励。另外,挖钻石的行为,其实跟挖矿、挖石头上的一个操作是类似的,都是要不断挖掘。我们需要去鼓励它进行这样的操作,所以挖石头,挖铁矿我们都是给它无限的奖励。最后,我们通过这样的策略非常有效的将AI训练出来。可以看到,随着AI的迭代,它的累积回报跟挖到钻石的概率都是飞快的上升。最后,我们也是以历史最高分获得了冠军,也是这比赛举办以来第一次有队伍挖到钻石了。

2、用强化学习进行辅助游戏设计

我们还探索用强化学习去做辅助游戏设计的工作。比如有一个竞速游戏,需要测试赛车的圈速、赛车的漂移性能、赛道的通过性、弯道的难度;如果用人工验证的话,要花费很多的时间。比如,我们需要若干天让它去熟悉游戏、掌握游戏的技巧,将游戏技术提高到一个比较高的水平,让测试才相对准确一点。还要去做验证赛车和赛道的组合,把每一个赛车和赛道的组合都跑一遍,这也需要耗費很多时间。

策划重新设计的赛车或者赛道后,需要人工去重新适应新的赛车赛道的特性,这需要花费很多时间去重新适应。另外用人工验证的话,还会存在一些偏差。因为人工验证不可能保证每一次测试都是人类地最高水平,所以他可能需要重复测试验证。另外人固有的操作习惯也会影响他评测新的赛车,在旧的赛车赛道,他已经很熟悉,遇到新的赛车之后,他可能就会沿用旧赛车的一些操作,这样新赛车的特性可能就不一定能发挥出来。

强化学习的一个重点就是要加速AI的训练。因为只有加速了AI的训练,我们才能更好的适应策划的新的配置,能在更短的时间里面完成一个跑测。因此,我们的主要工作就是把一些不合理的动作屏蔽掉,减少它的探索空间,动态的提前结束游戏。

相似的赛道同时训练也有助于AI去学习它们之间的联系,加速它的收敛过程。AI在CPU机器上也可以快速输出结果。即便是在CPU机器 上进行训练,我们也可以缩短90%的测试时间。利用AI可以在同一个赛道同时输出多辆赛车,观察在每一个时刻,它的位置、速度、档位、还有赛车的引擎的信息,方便策划去调试。

3、用强化学习进行游戏的平衡性分析

除了进行竞速游戏的验证以外,我们还可以做一些游戏的平衡性分析。比如在策略游戏里面,新的英雄上线了可能会有玩家吐槽,这个英雄太强了,跟什么英雄搭配都是无解的存在。那下一个版本策划可能就会修改,把它削弱一点。实际上,上线玩家又可能会发现这英雄被削的太多了,之前充的钱可能又白花了。这样的话就会给游戏的口碑带来极大的影响,同时也会非常影响游戏玩家的体验。

我们尝试可以用事前分析去解决,比如可以用人工去评估,可以用程序去模拟所有的组合对战结果。当然,我们也可以用强化学习去进行探索,用人工的话,就像刚才那样可能就会出现,人工的遗漏。有一些情况没有考虑到,上线之后就会被玩家发现有一些特别强的组合。这样的话,它的准确率实际上是比较低的。

如果用程序去模拟所有组合的结果会非常准确,但因为它的组合数非常多,要通常需要数个月的时间,甚至不可接受的时间。如果用强化学习的话,就相当于在两者时间取了个折中。通过强化学习,我们启发式去进行搜索,并不需要进行所有的组合的枚举。我们可以通过启发式的搜索找到一些可能比较强的组合。我们并不需要把所有的组合都遍历一遍,就可以得出一个比较精准的结果,因为AI并没有人所拥有的先验知识的一些偏见,所以相对人的经验AI的结果会更准确。

强化学习的训练都离不开一个环境,在这一个游戏平衡性分析的场景里面,搭建一个合适的环境来表述这个问题是非常重要的。我们用模型池跟游戏模拟器组成这一个游戏环境,每一次,AI从游戏环境里面获取到当前要对战的阵容,然后它所需要的角色就是要击败这个阵容所需要的组合。输出的动作返回到战斗模拟器去进行模拟对战,最后把赛果返回到我们的AI里面。

AI通过这样的反馈就能获取这一个阵容是否合理,多轮的迭代之后AI就会学会如何搭配阵容才能打败对面的组合,而这样的一个强的组合也会逐渐加入到我们的阵容池里面进行淘汰,把差的阵容淘汰,留下强的阵容。通过迭代,阵容池里面就可以留下一大批可能潜在过强的英雄组合,我们把这样的一个流程搭成一个自助跑测平台,策划只需要上传更新好的游戏属性文件,然后点一下运行就可以直接跑出来所需要的结果。包括每一个阵容它的实际对战的结果。每一个英雄的实际强度跟其他英雄的对比,还有阵容的阵容之中每个英雄的出场率,都可以验证这个英雄的强度是否符合策划预先设计的预期。

三、强化学习在其他领域的应用

前面说了很多强化学习在互娱游戏里面的落地,我们也可以观察到强化学习,不止在游戏里面有应用,我们还可以看到在国外,有一些公司用强化学习和对抗学习做游戏关卡的生成。有自动驾驶和机器人的控制都大量用到了强化学习的技术。

最近,Deepmind还提出了用强化学习去控制核聚变的反应堆。我相信这样的一个技术可以促进最终核聚变的应用。

我的演讲到此结束,非常感谢大家。

2022N.GAME网易游戏开发者峰会4月18日-4月21日每天下午15点直播,戳链接可直达峰会官网:https://game.academy.163.com/event/nGame

关注微信