2.3 强化学习在格斗类游戏中的应用

格斗类游戏(Fighting Game)是电子游戏的类型之一,一般由玩家控制屏幕上的己方角色来和敌方角色进行近身格斗,玩家需要熟悉防御、反击、进行连招等操作技巧。格斗类游戏通常以一对一或二对二等双方同等人数呈现。需要双方在某个场景中通过数个回合的肉搏等对抗行为来决出胜负(在一些格斗类游戏中会使用近战武器)。这是一种角色与角色直接进行对抗的游戏,也称为PVP(Player Versus Player)游戏。

一般而言,格斗类游戏对双方动作的对应和判断比大多数的其他类型游戏要高,玩家需要综合利用招式相杀、攻击招式预判、霸体、防御、投技、格反等技巧来取得胜利。

格斗类游戏在自身设计上的特性使得玩家进入这样一种类型的游戏后,通常会遭遇以下几种很不好的体验。

● 门槛高,入门困难。很多格斗类游戏的出招表对于出招持续的帧数和出招转换的时机有严格的要求,这会导致新手刚接触时会有很长时间不知所措,难以入门。

● 上升空间狭窄。学习基本的招式后,玩家一般会进行连招学习和连招确认,此时一般会遭遇每套连招对不同角色打击效果不同,哪招打中谁可以接哪一套连招,打不中怎么规避风险等种种问题和挑战。

● 水平差异巨大,碾压或被碾压。由于格斗类游戏的自身特性,很多玩家(尤其是新人)在游戏中会被完全碾压,游戏体验非常差,从而放弃继续进入格斗类游戏。

因此,格斗类游戏是一直需要AI的,一方面可以用AI来进行基本招式的教学,另一方面可以利用AI来帮助新人提升技术,度过从新玩家到熟练玩家的过程,提升玩家的游戏体验,并增加格斗类游戏自身对玩家的吸引力。

但是,格斗类游戏不同于竞速类游戏,赛道在设计完成之后是不会改变的,而在格斗类游戏中,对手并不是一成不变的,不同的对手有不同的策略。这对经典的强化学习算法提出了新的挑战。具体而言,传统强化学习算法假设环境是静态的,模型在与环境的交互中,以获得最大的累积奖励为目标。如果将对手作为环境的一部分,由于不同的对手有不同的策略,因此环境实际上是一个复杂的动态的环境,对于模型的学习会非常困难。本节将介绍一种通用的方法,用以缓解格斗类游戏中对手难以建模的问题。

2.3.1 问题建模

以腾讯的动作格斗类游戏《火影忍者》(见图2.9)为例,游戏中包含经典的1V1竞技模式。这种游戏模式主要包含了一个格斗的场景、两名选手和相应的状态条、分数值等。

图2.9 《火影忍者》图片

将这种经典的格斗类游戏的场景进行抽象,主要有如下组成部分。

(1)场景信息。

● 战斗时间,很多格斗类游戏是限定时间的,因此需要考虑战斗时间。

● 战斗范围,一般会限定战斗的范围,不让角色出圈。

● 建筑物或障碍物等,有些格斗类游戏会设定一些建筑物或障碍物,因此攻击的位置或角色移动的位置需要做出相应调整。

● 其他信息。

(2)双方角色的基本信息。

● 位置。

● 血量。

● 蓝量。

● 怒气值。

● 其他信息。

(3)双方角色的招式、动作信息。

● 招式冷却时间。

● 招式消耗资源情况。

● 招式造成伤害情况。

● 伤害来源招式。

● 做的动作。

● 其他信息。

经过这样的处理,格斗类游戏中的状态就被建模出来了,这样可以很好地感知目前游戏进行到什么样的情景,给后面做正确的决策提供了数据上的可能。

对状态进行建模后,就需要考虑如何进行动作的建模了。在格斗类手游设计中,一般是左手操作轮盘来决定角色的朝向,右手操作各个按键来组合触发某些招式的。为了与玩家的操作相同,格斗类游戏中的动作建模统一为此种形式,即采用“一个模型两个输出”的形式来分别控制左右手的行为。

有了状态、动作的建模后,就需要考虑如何设计合理的奖励结构,从而引导AI学习合理的行为,并逐步提升能力和其他特性。根据格斗类游戏自身特性,奖励结构可以归纳为如下4类。

● 胜负:显然一局比赛的胜负对应了强化学习算法下的Terminal Reward,胜负也是主要期望优化的目标。

● 血量变化:一局的胜负只在最后才能给出,这样的奖励信号过于稀疏,因此利用一段时间内的双方血量变化来表示双方战斗表现。

● 蓝量或其他资源变化:与血量变化相同,蓝量或其他资源的变化也可以被考虑作为奖励,如在达到同样伤害的情况下,蓝量用得更少可能是更好的对抗策略。

● 移动:考虑双方角色的移动情况,此种奖励可以引导玩家的走位,从而形成更好的攻击位置取得胜利,或者采取躲避策略来减少伤害等。

依据上面的设计,马尔可夫决策过程(MDP)具有如下的结构(见图2.10)。

图2.10 格斗类游戏的MDP结构

2.3.2 模型自对弈

基于上述建模方式,先通过模型与行为树的对战来训练模型,再采用强化学习算法优化模型,模型便能很容易地拥有完全打败行为树的能力。然而,我们希望研发出具有一定能力强度、能覆盖不同段位玩家的AI,来帮助玩家成长,所以仅仅打败行为树是远远不够的。为了继续提升模型的能力,可以使用模型自对弈(见图2.11)的方式来进行训练。具体来讲,就是让模型与之前训练得到的模型对战,到一定程度后,进行切换,将对手模型更改为目前最新的模型继续训练,不断重复此过程,使模型在这种自我对弈的过程中提升能力。

图2.11 模型自对弈过程

在模型自对弈过程中,以下几类问题会影响训练的进程走向和最终的结果。

● 停止切换条件。

停止切换条件即一轮训练什么时候结束,什么时候进入下一轮的训练。停止切换条件可以是训练到完全收敛,可以是训练到一定胜率,可以是训练到一定时间。在不同的问题情境和不同的训练阶段,可以考虑使用不同的停止切换条件。

● 对手模型选择策略。

对手模型选择策略即在一轮训练中选择什么样的模型作为对手。对手的不同,会使得学习目标不同,并使得最终得到的模型不同。一般来说,只使用最近轮次的模型,会使得训练得到的模型出现策略退化,即最新的模型对战较近轮次的模型胜率较高,而对战靠前轮次的模型胜率出现下降。因此,将历史模型进行一定程度的混合是一种使用较多的方案。

● 模型评估。

模型评估即一轮训练结束后,如何评价模型的能力和行为特性,以及是否达到预期效果等。在能力方面,可以使用Elo Score、Nash Equilibrium等方式来对训练得到的模型进行度量。在行为特性方面,可以通过增加行为指标数据(如各种技能的使用次数、使用时间等数据)的方式来反映模型的具体表现。

综合来看,模型自对弈结构如图2.12所示。

图2.12 模型自对弈结构

经过一定的参数调整和对手模型选择的设置,随着自对弈的进行,模型能力整体上能够取得不断的增长,不仅能够远远超过内置的最强等级的行为树,并且很快便可以达到人类玩家中上水平。

2.3.3 联盟战争

按照上述模型自对弈的过程,通常会用同一种配置进行多轮次的迭代,以期望不断地提升模型的能力。然而,在实际应用此种方法来研发格斗类游戏AI的过程中,至少会遇到如下两大问题。

● 同一个角色,同种技能配置,可以有多种风格的玩法,有的疯狂进攻,有的保守防御等。风格与对手有关,会根据对手的情况进行选择。从实际应用场景的需求出发,我们希望模型的表现能够具有变化性,而不只是单一的操作习惯,也就是说,模型的风格多样性是期望的目标之一。

● 想要通过自对弈来不断提升模型的能力,需要有一个很强的前提,那就是模型在此游戏中具有传递性,即假设A能打败B,B能打败C,则A一定能打败C,这样在自对弈的过程中模型能力就能不断提升。然而实际上,这样的传递性在多角色的格斗类游戏中往往不存在,模型能力与模型的关系可能是一个如图2.13所示的陀螺形(RealWorld Games Look Like Spinning Tops)分布。从图2.13中我们可以看到,传递性只存在于风格单一的模型中,在多风格的模型中几乎是无法保障的。这就意味着,在训练中必须产生多风格模型,并与之对战演进,这样才能真正评估模型能力,并进一步提升模型能力。

从上述两方面可以看出,如何在模型训练过程中产生多样性模型,对提高模型的能力有至关重要的作用。

图2.13 陀螺形分布

下面从3个不同的角度介绍一些相关的经验。

1.不同的训练参数

显然,不同的奖励设定会决定强化学习问题的优化目标,因此一个直接的方法就是通过不同的奖励的赋值来引导模型学习不同的打法和倾向,即不同的风格。具体来说,可以在格斗类游戏上设定4类奖励(见表2.2),这4类奖励均可以进行调整,来引导风格的差异。

表2.2 4类奖励说明

除奖励外,其他的一些训练参数也会影响训练结果,从而导致不同的风格,如使用了含有熵的学习目标的熵的系数,以及使用了ϵ-greedy方法的ϵ的取值。

2.不同的种子模型

训练是一个迭代很多轮的过程,那么自然地,当每一轮训练开始时,从哪一个模型开始恢复训练就会影响最终模型的能力和风格的表现。例如,在某一轮训练时,使用完全相同的奖励配置和其他参数设定,但是选择从两个不同的模型开始恢复训练,那么最终训练收敛得到的模型可能有完全不同的表现。这个现象和优化算法的求解过程有相似之处,不同的起点往往会收敛到不同的终点。

3.不同的对手模型

同样地,训练过程中不同的对手模型会使得整个学习环境和学习目标发生改变。例如,以A模型为对手,则可能以战胜A模型为目标,而以B模型为对手,则可能以战胜B模型为目标,显然这样会得到差异很大的两个模型。

总之,不同的训练参数、不同的种子模型和不同的对手模型是训练过程中模型不同风格的主要来源。因此可以在一个迭代的训练中,综合考虑这3个因素,同时启动几个任务,以产生风格多样性。

通过上述方式不断地迭代,就可以产生具有不同特点的模型了。那么这些模型的能力和风格具体是怎么样的呢?我们需要对模型进行更客观的评估来更直观地表现出来(见图2.14)。

在能力评估方面,目前业界采用较多的是Elo分的方式。但是Elo分很容易受评估次数、评估池的大小、不同模型类型的分布影响,并且对于有循环胜负的问题,Elo分的表征能力非常弱。依据学术界的相关研究,采取了Nash Equilibrium的评估方式。具体地,先让模型池中的模型两两对战N局,记录对战的胜率,得到完整的胜率矩阵。利用胜率矩阵可以计算Nash Equilibrium,从而衡量模型对战不同类型模型时能力的均衡表现。

图2.14 模型的双维评估

在风格评估方面,风格的不同表现可以被认为是模型倾向使用的技能招式、走位值、命中率的不同。具体来讲就是,先让模型池中的模型两两对战N局,记录对战时模型的各技能使用次数、命中率、掉血量、走位值等指标,并分别计算每一个指标在所有模型上的均值,将这些均值组合在一起,成为均值向量,这样一个均值向量就可以较好地度量某个模型在打法上的倾向和风格上的差异,这种均值向量被称为风格多样性向量。

通过如图2.14所示的组件,就可以在训练时通过不同的设定来产生不同的风格,并且通过模型评估来度量模型能力和风格的差异,为下一代训练的设定提供数据支持。模型池负责管理维护模型的更新,为整个模型池中的模型的能力增长和风格多样性提供来源和保证。

在知晓联盟战争的架构(见图2.15)之后,就可以利用联盟战争来进行具体的实验迭代了。

图2.15 联盟战争的架构

例如,可以设定下面这样一种配置。

● 在奖励方面,首先使用多组参数的权重组成奖励,每一个参数权重设定多个候选项,如某个技能命中后获得不同的奖励。然后可以从各个参数权重中随机选择一个来最终组成一套奖励配置。在迭代过程中,可以将最好的一个或几个奖励配置保留继续迭代。

● 在种子模型方面,每一代训练完成后进行评估、聚类,从每一个簇类中选择一个Nash分最高的模型分别作为一个种子模型。为了避免训练规模过大,可以设定最多选择几个种子模型。

● 在对手模型方面,同样利用聚类,从每一个簇类中选择一个或几个Nash分较高的模型,将其混合作为对手模型。

● 在模型池方面,出于规模和效率的考虑,可以增加淘汰机制,不让模型池内的模型数量一直增长,设定最大数量及每一个簇类中模型的最大数量。

按照这样的设定,我们在《火影忍者手游》上进行了实验,当训练进行到第6代时,总共产生了159个模型,这些模型聚成了10类。这10类模型的各种技能的使用情况展示如下(见图2.16、图2.17和图2.18)。

图2.16 聚类结果1

图2.17 聚类结果2

图2.18 聚类结果3

可以看出,当训练到第6代时,得到的这些模型的风格具有明显差异,如簇类2更喜欢使用技能3,技能1和技能2使用得较少,簇类3则3种技能都喜欢使用。具体地,模型的风格演进如图2.19所示。可以看出,在训练过程中,每一代的模型的风格都会出现明显的变化,并且同一代中不同实验训练出的模型具有不同的风格差异。

图2.19 模型的风格演进

类似地,对6代训练中的各个模型的Nash分的变化情况汇总观察,得出模型的能力演进如图2.20所示。

图2.20 模型的能力演进

2.3.4 小结

一对一的格斗类游戏看似简单,但是游戏AI的制作非常重要,因为包含对战性,在建模过程中必须考虑对手的建模。由于人类的行为丰富多变,因此对手的建模是大部分对战游戏难以解决的难点。在这一部分,我们将对手建模为强化学习环境中的一部分,并利用自对弈的框架完成对手的更新完善,通过引入联盟战争提升自对弈过程的多样性和稳定性,从而使得训练的AI在迭代过程中稳步提升能力。显然,这种模式可以自然、方便地扩展到其他的格斗类游戏上。