前言
AI研究的目的是为机械赋予智慧,而游戏一直被认为是需要智慧才能完成的事情,因而游戏自然成为了AI自证能力的最佳途径之一。从棋盘游戏到视频游戏,从最早的Deep Blue到近几年大热的Alpha Go,人们不懈地在各类游戏上尝试提高AI水平。但游戏与AI的关系不仅限于此——游戏是AI的试金石,同时AI也可为游戏带来服务。例如:拟真的AI机器人与玩家共同游戏,让玩家更有沉浸感;使用AI为游戏生成内容(游戏关卡、故事剧情等),一方面可以减少游戏创作者的重复工作量,另一方面可激发人类的创造力;AI技术对玩家体验上的理解(数据挖掘及建模)可驱动和提升游戏的设计过程。本文主要介绍游戏中经常涉及的AI行为选择方法,包含传统的AI编辑方法以及近几年兴起的基于机器学习的AI算法,尽管覆盖的内容不够全面,仍希望本文能为游戏开发者选择AI算法提供参考或从中有所启发。
特定行为编辑方法
行为编辑(Behavior authoring)是指不涉及任何形式的搜索或学习而只取决于静态的特定表示的方法,常见的有有限状态机、行为树、基于效用的AI等。这些方法在传统上主导了AI机器人的控制,且在如今的游戏AI编程中仍能见到的行为建模算法。
有限状态机
有限状态机(FSM, Finite-state machine)概念简单,编码便捷,花费很小的代价就能构建一个强有力的灵活AI结构,一直到20世纪90年代中期,是智能体的控制与决策过程的主导AI方法。
FSM将智能体分解成小且离散的碎片,将这些碎片可称为状态(state)。每个状态表示一个特定的行为或者智能体内部状态,在同一时刻只有一种状态是处于激活状态(active)。状态之间由状态迁移(state transition)来连接,状态迁移负责在满足特定条件时切换激活状态。FSM可以用图结构来表示,其中节点表示状态,状态之间的连线箭头表示状态转移,连线上的标注表示转移条件。
以一个城堡守卫NPC为例,上图是FSM各状态的关系图。巡逻为NPC的初始状态,在该状态中下,NPC会沿路线巡逻,并时刻关注附近区域的情况。如果NPC听到动静,就会退出巡逻状态,进入调查状态,调查一段时间仍无进展,再返回巡逻状态。如果NPC看到了敌人,则进入攻击状态。在攻击期间,如果NPC的血量过低,他会进入逃跑状态以保命。如果战胜敌人返回巡逻状态。在设计完类似上图的图标,理解不同状态及迁移关系后就可以开始编写代码了,十分简单且有用。但随着游戏规模增加,状态数量会增多,这回导致FSM系统非常复杂,如果要添加新的状态则会非常困难且容易出错,因为需要判断新状态与原有状态之间的转换关系。FSM最大的缺点之一是程序的行为也许无法与结构优雅地配合,例如,无法做到有上下文地行为重用,虽然FSM的变体HFSM可缓解这类问题,但仍无法彻底解决。
行为树
行为树(Behavior tree)是一种与FSM类似的专家知识系统,其可以描述在有限的任务(或行为)集合中的各种转换。可以用树形结构来表示行为树:包含一个根节点和许多行为组成,每个行为都是智能体要表现的一个独立动作,其中每个行为都可以有子行为。 每个tick都会从根节点开始通过一些条件来搜索行为树,最终确定需要做的行为(叶节点)并执行。
下面的示例展示如何为一个追击玩家的机器人设计一棵简单的行为树。机器人具备三种主要行为。首先,在可以看见玩家的情况下,如果距离玩家足够近则连续射击玩家三次,否则靠近玩家。其次,如果机器人最近发现过玩家,但玩家不在视野内,则尝试移动到最后感知的玩家位置并进行巡视。最后,一段时间内没有发现玩家的踪迹,则随机选择位置进行巡逻。
从图中可以看到机器人有三种行为:攻击、追随、巡逻,在其他复杂的树里一个行为后面还可以跟其他行为节点。但这些行为其实并不是真正的决策的结果,它只是一个类型,来帮助我们了解这个分支的一些行为是属于这类的,真正的行为树的行为都是在叶节点上,一般称之为动作节点(action node)。动作节点是和游戏相关的,根据游戏不同需要定义不同的动作节点,但对于某个游戏,在行为树上的动作节点是可以复用,比如移动在追随、巡逻等行为上都复用这个节点。动作节点一般分为两种状态:运行中running,完成completed(可能是成功、失败或报错)。
除了这些动作节点外,其他的节点(即父节点)都可以成为控制节点(或逻辑节点)。这些节点是行为树的精髓所在,因为搜索是通过这些控制节点来定义的,从控制节点上,可以看出整棵行为树的逻辑走向。
这些控制节点常见的有两种,如图所示:
选择节点(selector):选择其子节点的某一个执行(选择的顺序可以是从左到右或者按概率选择)
序列节点(sequence):将其所有子节点按顺序执行,当前子节点返回完成状态(成功)后,再运行子节点的下一个兄弟节点
可见控制节点就是控制其子节点如何被执行(子节点可以是叶节点也可以是控制节点),因而可以扩展出很多其他控制节点,其他常见的控制节点还有并行节点(parallel)、装饰节点(decoractor)等。区别于动作节点,控制节点是和游戏无关的,仅负责行为树逻辑的控制,不涉及游戏代码。
在上图中的行为树中还可以看到节点上还有一些条件判断,这些判断被成为前提(precondition),其作用就是选择节点的选择依据,即进入或者选择这个节点的条件。当走到选择节点的时候,需要测试每一个子节点的前提,如果满足,则选择此节点。如图中root选择节点(追击玩家)是从左到右判断子节点的precondition,如果玩家在视野范围则选择攻击并继续攻击的子节点,如果不满足条件则检测是否最近发现过玩家,以此类推。
行为树强大的地方在于简单直接,易于实现,相较于FSM,行为树中的个行为之间的耦合度比FSM状态间的耦合度小很多,每个行为都是独立的,添加或移除某个行为都不会影响树中的其他部分。但行为树也有不适用的时候:由于行为树是从根节点驱动,往往简单的行为树就有大量的条件语句,在某些平台上会导致运行速度慢;另外,行为树是无状态的,因此必须特别留意会涉及机器人记忆的情况。当然,本文只是简单介绍行为树的基本概念,行为树还有很多扩展,其可以帮助行为树改善其某些缺憾,以及提高行为树在解决更复杂的行为设计问题上的能力。
基于效用的AI
基于效用的系统基本思想是对所有可能的动作(action)进行一次评分,并从中选取得分最高的行为,其消除了有限状态机和行为树的模块化限制。效用理论(Utility theory)的概念最早出现在博弈论、经济学等领域中,其核心思想是,任何一个可能的行为或者既定模型中任何一个状态都可以用一个统一的价值(即效用)来描述。游戏中的决策往往不是简单的布尔值(是或否)可以回答的,而是由多个因素决定的。例如在追击敌人的例子中,需要考虑的因素可能有敌人距离自己的距离、自己的hp、自己的mp或者其他的连续值或者离散值。基于效用的系统通过对大量参考因素进行度量、权衡、组合、评价、排序、挑选,决定潜在动作的优先性(preferability)。
下面以选择武器的过程为例具体阐述基于效用的AI是如何工作的。为了选择武器,智能体需要考虑几个方面:范围、习惯、随机噪声、子弹与室内环境。智能体会定期检查可用的武器,并计算出武器的效用值,选择总效用最高的武器。
- 范围:依据距离计算武器的效用值,例如,距离近的情况,手枪将被赋予更高的效用值。
- 室内环境:是一个布尔值,用于惩罚部分武器不能在室内使用,例如在室内环境使用手雷效用则为0,而手枪、狙击枪等为1。
- 子弹:返回关于当前子弹等级的效用值。
- 习惯:为当前所有武器赋予一个更高的效用值,这样可避免武器频繁切换。
- 随机噪声:为选择增加不确定性,这样智能体在相同的游戏情况中就不会总选择相同的武器。
这些效用函数曲线及计算总效用可以是各种函数形式。效用利用的关键在于如何充分理解输入和输出之间的关系,并能够清晰描述拟合曲线。虽然基于效用的AI方法有很多优势,如很容易构造出核心架构,添加新行为也很容易,但是选取适当的函数、调节参数的过程可能需要花费大量的时间。
基于机器学习方法
除了以上介绍的传统游戏AI技术,近几年基于机器学习方法的游戏AI在复杂环境中也逐渐兴起。Alpha Go在围棋上战胜人类顶尖选手,DeepMind、OpenAI两家公司分别在星际争霸和dota等游戏中开发的AI,其能力已可以与电竞选手匹敌,这些案例都向人们证明了基于机器学习的游戏AI的上限之高,已远超传统AI方法。
在维基百科里,机器学习的定义是:从数据中自动获得规律,并利用规律对未知数据进行预测的算法。用通俗的话来讲,机器学习在做的事情就是让机器具备找到一个函数的能力。根据目的不同,函数的输入和输出会有不一样的定义,比如:想让机器做语音识别,听到一段语音信息后得到对应的文字,那这个函数的输入就是语音信号,输出是这段信号的内容。可以想象这样的函数一定非常的复杂,无法靠人类手写出来的方程,所以我们期望借助机器的力量能自动找到这个函数,这件事情就叫机器学习。随机硬件水平的发展,机器能学习的函数形式也变得更复杂,比如神经网络(neural network)。如下图所示,神经网络是一种类似人脑神经系统的形式,每个节点类似生物神经元,对于输入的信息做一些计算处理。在给予足够规模的网络结构与充足的计算资源时,神经网络能够逼近任何连续的实数函数。
类比至游戏中,以视频游戏space invader为例(游戏规则是玩家控制飞船,清空上方的入侵者),神经网络的输入是当前帧的信息,输出是下一步采取的操作(向左、向右、开火)。
接下来介绍两种现在在游戏领域常用的机器学习方法:模仿学习和强化学习。这两种方法类似人类学习打游戏的方法:第一种学习已有高玩的经验,观看教学视频,模仿他们的策略(对应模仿学习);第二种通过自我探索,反复在实践中练习,强化自己实力(对应强化学习)。
模仿学习
模仿学习(Imitation learning)正如上文所说是一种学习专家经验的过程,所以该算法包括两个步骤:搜集专家经验;利用数据训练神经网络。基本思路是记录人类玩家某个游戏的轨迹,并且训练某些函数(如上文介绍的神经网络)来做出类似人类玩家的行为。
搜集数据指得是通过日志记录玩家的游戏过程轨迹,主要需要记录两个部分:state(状态)即做这次策略的游戏信息,并作为对应神经网络的输入;以及玩家在这一帧的操作action对应神经网络的输出。以上述视频游戏为例,可将决策帧的图像作为state,也可以选择以简单的统计数据(玩家坐标、每一列最近外星人的坐标等)作为state;向左、向右、开火作为action。在给定输入与期望输出的组合后,通过反向传播训练神经网络,以预测在当前游戏状态(输入)中会被高玩所选择执行的动作(输出)。
值得注意的点是如何设计state和action。由于本例较为简单,state用像素或者提取信息差别不大,但一般情况下,使用图像作为输入对计算资源的要求较高,随着游戏的复杂训练速度会受影响;后者使用人类提取的信息,可以大大减少对资源的依赖,并提高训练效率,但对提取的特征是否能涵盖决策所需信息有一定的要求。在复杂游戏中甚至会将两者结合作为输入。另外,本例的action也很明确,但对于复杂游戏,如多人对战中的AI,不仅需要选技能,还要选目标、移动方向等,这时候action还要具体设计。
强化学习
强化学习(Reinforcement learning)是一种类似生物学习的方法,通过环境中收到的奖赏(正面或负面)而采取策略。以训练狗狗坐下为例,当它听到“坐下”的指令时做出正确动作,就奖励一些食物,否则不会给任何奖励。在训练过程中,狗狗会尝试不同的行为,根据给的奖励,最终学到了正确动作。这个过程可以抽象成下图的一个流程:智能体(可以看作是一个神经网络)从环境中观察到状态,执行动作,最终得到奖励。
还是以space invader为例,其中state为每一个决策帧图像,action为向左、向右、开火,reward为游戏的分数。如图所示,每一局开始智能体会收到一帧的信息,并返回一个动作向右,执行后得到reward1;接着收到下一帧,执行动作开火,得到5分作为reward2;直到游戏结束得到一个最终的奖励。智能体的目标是最大化最终的累积奖赏,以此来改进策略。
如下图所示,对于特定的输入,输出表示的是采取每个动作的概率。在训练开始,每个动作的概率是随机的,但随着训练的局数增加,智能体尝试可能的动作后,智能体将逐渐学会如何去选择能够最大化其累积奖励的动作。具体的算法及训练过程可参考:https://gym.openai.com/envs/SpaceInvaders-v0/
从以上描述可以看出,基于强化学习的智能体需要将游戏反复玩上成千上万次。因此,提高游戏速度或庞大的服务器对于强化学习训练是非常有用的。
更多讨论
由于篇幅有限,还有一些游戏AI算法没有介绍,例如:规划器、树搜索、进化算法等。但没有哪种算法是万能的,具体使用某种AI算法还取决于应用场景及需求,下表罗列了传统AI与基于机器学习AI算法的优劣之处。对于传统的AI其主要的优势有简单游戏环境下,成本低、易于编写及调试,但随着游戏场景的复杂,规则编写也愈加困难;基于机器学习的AI恰好可以解决对于复杂场景的问题,但相应也要消耗较大的硬件成本。另一个值得关注的点是不同算法得到的最终AI表现的可预期性是不同的。例如用完全的规则来写AI脚本,其AI表现是完全可以预测的,有很强作者控制(authorial control),但对应的缺点是套路单一,容易被玩家针对。而用模仿学习和强化学习算法的AI表现是具有反应的(reactive)——能够感知环境,并据此选择适当的动作来回应,根据对手的情况变化策略。然而,这也可能加大了对AI行为调试的难度,虽然神经网络可解释性算法可在一定程度上缓解这一问题,但解决得并不彻底。
另一方面,这些算法看似原理不同,但其并非是相互割裂的,在某些场景中是可以将其结合使用。例如:在行为树中的选择器可以用机器学习来训练;强化学习可以学习宏观的策略,其输出一个宏动作,具体的宏动作实现可以由规则脚本或行为树完成。AlphaGo就是在算法混合和嵌入的很好案例,其卓越的围棋能力实际上是结合了蒙特卡洛树搜索、强化学习与监督学习等方法。
最后不管选择哪种AI算法或将算法结合,都需要基于游戏场景和需求,因为游戏AI的最终目的是给玩家带来乐趣,为玩家创造一种特殊体验。
参考文献
[1] S Rabin. Game AI Pro: Collected Wisdom of Game AI Professionals. 2013.
[2] Yannakakis, Georgios N., and Julian Togelius. Artificial intelligence and games. Vol. 2. New York: Springer, 2018.
[3] Arthur Gill. Introduction to the theory of Finite-State Machines. McGraw-Hill, 1962.
[4] Alex J. Champandard. Understanding Behavior Trees. AiGameDev. com, 2007.
[5] Dave Mark and Kevin Dill. Improving AI decision modeling through utility theory. In Game Developers Conference, 2010.
[6] Mnih, Volodymyr, et al. Human-level control through deep reinforcement learning. nature 518.7540 (2015): 529-533.