大话AI技术辅助游戏NPC设计

Jingwen 腾讯互娱研究员

在电子游戏开始之初,游戏的乐趣很大程度上依赖于游戏开发者设计的世界,在世界里有各种NPC(Non-Player Character),我们通过与之互动推动游戏的进行。游戏NPC作为游戏中的一个重要组成部分。一直伴随着游戏玩家以及游戏开发者。于是NPC的设计就成为了玩家和开发者都高度关注的一个焦点。广大玩家总觉得NPC太傻,行为太单一,没有真正的代入感。而受限于技术工具,编写NPC往往需要设计开发复杂的行为树或者状态机,对于游戏开发者而言是巨大的负担。尽管电子游戏已经诞生了这么多年,游戏NPC的设计技术并没有什么太本质的变化,基本上还是依靠规则和数值体系。如果有新的技术能够优化NPC的设计流程也许会给游戏研发注入新的血液。

 

---

 

电子游戏需要NPC吗?

 

随着网络游戏的高速发展,世界各地的游戏玩家可以非常方便的同时在一个游戏中进行互动,现在的游戏都在网游化,似乎对于NPC的需求并不那么强烈了。但是实际上真的是这样嘛?

 

仔细观察一下,发现好像并不尽然。

 

首先,故事驱动型的3A游戏大作在游戏市场中依然占据着举足轻重的位置,而这类游戏中对于NPC设计的需求强烈而复杂。虽然这类游戏目前还主要存在于主机平台上,覆盖的群体远不如手游玩家庞大,但是随着5G网络的普及,我们有理由相信,手游上(或者不限于手机平台的其他形式)的游戏内容会越来越丰富,也许形式上也会朝着向主机游戏靠拢。那么在未来的游戏中对于NPC设计的需求会只增不减。

 

其次,即使对于目前大型多人在线的网络游戏而言。NPC也并没有我们想象中那么可有可无的。以诸如《王者荣耀》这样竞技性的游戏而言,有竞技就会有赢有输。对于一个从来无法在比赛中获得胜利的玩家而言,游戏的乐趣是飞速下降的。很多玩家玩游戏其实只是为了放松,平时并不会使用太多的时间来磨炼自己的游戏技能,好不容易抽点时间放松一下,结果还因为被虐给心里添堵,从而从游戏中流失。这样的玩家流失其实是非常可惜的,因为可能并不是我们设计的游戏不够精彩,而是没办法照顾到各个水平层次的玩家体验而导致的。另外一方面,硬核玩家总归是少数,要想游戏被更多的玩家玩,那么照顾这些中轻度玩家就是很有必要的事情。如果我们有能力水平合适的NPC陪各个水平段的玩家玩,那会是一种非常好的辅助游戏运营的工具。

 

这里还可以再引申一下,NPC作为游戏的一个重要组成部分,并且会与玩家频繁互动,它们的优劣实际上会严重影响游戏的体验。我相信能够精确控制玩家在游戏中的体验会是游戏策划心中一种很理想的游戏形式,他们就像一个导演,通过NPC引导玩家进入他们设计的世界,牵动玩家情绪的改变,一步一步的去体会自己精心设计的故事,而玩家也忘我般地沉浸其中。如果能够有效地控制NPC,那么这样的游戏形态也就成为可能,它也许会是西部世界那样的样子,也会是其他更丰富的形态。PVE的内容可能会重新成为游戏的亮点。

 

[ 西部世界中的NPC ]

 

但是怎么样才能设计出各种我们想要的NPC呢?对于目前的游戏而言(即便是手游),设计一个游戏中的NPC已经变得非常棘手了。摩尔定律诚不欺我,机器性能在一直变强。大家都知道现在即使一部千元手机的计算性能也远远超过了若干年前的台式计算机了。这也使得游戏开发者能够在此基础上实现更多酷炫的效果,更复杂的游戏场景,随之带来的也有更多新奇多样的游戏玩法。

 

因此在这样的游戏中,我们往往难明确定义(数值上或者规则上)一个NPC到底应该是什么样子的,而不同水平的NPC的行为模式也可能是非常不一样的。这些对于游戏开发者而言,无疑是繁重而又缺乏清晰头绪的工作。在计算机技术飞速发展的今天,人们自然会想到能不能借助计算机帮助我们自动生成这些NPC呢?能不能用上好像很神奇的人工智能技术呢?

 

---

 

计算机能帮我们自动生成吗?

 

我们先来看看应用AI技术让机器生成游戏NPC可以达到什么程度呢?

 

这个问题的答案很大程度上取决于游戏本身的复杂度,如果游戏很复杂,想要自动生成能够高水平完成该游戏的AI的难度就会非常大。那么游戏的复杂度又怎么去界定呢?关于这个问题,我们应该首先树立一个观点,那就是玩起来简单的游戏并不代表这个游戏的复杂度就低,反之亦然。

 

这里我尝试按照两个维度去刻画游戏的复杂度,以期望给大家展示一个全面的景象。我们暂时认为游戏的复杂度可以由游戏环境表征的复杂度和游戏玩法的丰富程度来共同刻画。图中的位置表述并不非常准确,仅仅为了展示一种相对关系。

 

[ 游戏NPC设计难度天梯图 ]

 

要设计一个游戏AI,我们首先要考虑如何表达一款游戏,比如棋牌类游戏,我们很容易的就能够通过一些符号和规则定义这款游戏,甚至不需要做一个真正的游戏出来。如果一款游戏越容易表达,那么我们可以认为这款游戏的环境复杂度是比较低的,反之则越高,我们可能需要花费很多人力物力去开发一个游戏实体出来,比如我们喜闻乐见的吃鸡这样大场景的开放世界游戏,花花草草,一房一隅跟真实世界一样一样的,非常难通过一些简单的符号规则表示了。

 

在另外一方面,游戏玩法的多样性也对游戏的复杂度有很大的影响,玩法多样性是什么意思呢?我们可以简单理解为游戏取胜的方式的种类数。比如像赛车类游戏,当我们熟知赛道之后,如何能够在这个赛道上跑出最佳成绩的跑法其实基本上也确定了,考验的主要是玩家能否把自己的最佳状态表现出来。而之前被津津乐道的围棋,号称包容了人类最高深的智慧,它的取胜方式相比赛车这类游戏就要丰富得多。这里其实有两个原因,一个是因为本身棋盘上可以做的选择就比较多,另外一个是因为由于对手的不同,取胜的策略也会因此不同。这个第二点其实可以作为游戏复杂度一个重要分水岭,对战类的游戏由于存在对手策略未知的问题,往往都会比非对战的游戏要复杂得多。而在对战类的游戏中,对方的信息是否可见又成为对战类游戏里一个重要的分水岭,对方信息不可见的我们一般成为非完美信息,这类游戏又比对方信息可见的游戏要难得多。

 

从这两个维度去考虑我们目前常接触到的游戏的话,我们会发现围棋确实算是很难的游戏了,对战类,并且策略选择非常丰富。但是它又远远不是最难的,因为围棋上双方的信息都是公开可见的,因此相比起一些我们玩得比较多,似乎不太拿的上台面的游戏比如麻将、德州扑克,其实就比围棋还要复杂。而这些仅仅是棋牌类游戏,他们的表达都是比较简单的,同样具有对战属性,并且对手信息不可见的电子游戏诸如王者荣耀、吃鸡其实难度还要再更上一层楼。

 

了解了目前游戏的难度分布概况之后,以我们目前的人工智能技术而言,是否能够自动生成这些游戏的AI呢?很遗憾的是,其实真正能完美做出来的并不是特别多。

 

[ 人工智能自动生成技术能力覆盖图 ]

 

 

 

在上图的用绿色框出来的范围内的游戏种类已经在学术上有很好的解决方案了,他们通常是非对战类的游戏,有着比较明确的游戏目的,比如获得高分之类的,而一些策略相对比较小的对战棋牌类游戏也有相应的解决方案了,比如五子棋、象棋等。由于商业的需求,这类游戏可能会有着相对复杂的3D场景,这对于表达游戏会有一定的困难,但是并不会给这类游戏造成真正的困扰。比如在QQ飞车中,我们也可以通过一些特征表示将场景进行简化,同样能够生成水平比较高的AI。

 

围棋作为一种玩法策略比较丰富的竞技对战游戏,是很难解决的,曾经一度作为人类顶尖智慧的代表。不过近几年由于阿尔法狗的诞生,终于使得人工智能技术已经能够克服围棋这样复杂度的游戏了。但是阿尔法狗的技术本质上并没有突破性的创新,它成功的关键在于将各种已有技术的有机结合和非常顶尖的工程实现能力。这里这么说主要是想要强调两点:1.阿尔法狗在人工智能算法上其实并没有基本原理上的突破,并不代表人工智能能够下围棋了,人工智能就能颠覆世界了。2.解决的问题虽然很难,但还远远不是最难的。因为围棋是完美信息的(即双方的信息都可见),是回合制的(双方不需要同时做决策),并且围棋的表达不困难(一个三值的二维矩阵即可),很容易进行推演和复盘。

 

而对于像王者、星际这样的游戏,游戏逻辑非常复杂,不仅对手的信息不可见,还需要与对手同时进行决策,一个对对手错误的预判,可能就导致整个局势的扭转。另外我们也很难像表示围棋那样用一个简单的矩阵就完美的刻画整个盘面,也没有办法很快的在一个盘面上进行推演,这就为游戏的AI设计大大增加了难度。换句话说阿尔法狗上的经验几乎很难应用到这类游戏上来,必须有更先进的技术才能取得突破,目前这两类游戏的AI在学术界上依然处于研究探索阶段,目前已经有了一定的成果,可以参考DeepMind、OpenAI,还有腾讯在王者上做的绝悟。虽然这些工作都有了一些实际展示,但是它们在该类游戏上达到的程度还远没有达到阿尔法狗在围棋中那样至强的水平。

 

而像吃鸡这样真实世界场景,大规模多人在线,并且敌人信息不可知,而玩法又极其丰富的游戏无疑是目前游戏AI设计的至难题材了,学术研究甚至还没有涉足到这样复杂的载体上。

 

所以从上面的分析来看,对于目前的游戏市场上的游戏,我们能够用人工智能技术自动化的解决NPC的品类并不是特别多,而且很多能够解决的品类中,耗费的代价还异常巨大,比如在OpenAI的DOTA的设计中,并不是任何一个游戏都能接受这样的代价去制作NPC的。

 

---

 

AI技术能帮上什么忙?

 

如果我们从产品上去考虑,重新审视一下我们的问题,我们真正需要完全自动的生成一个完整的顶级NPC嘛?有固然好,没有的话,我们能做什么呢?

 

除了运营阶段为不同水平的玩家提供陪玩服务,在我们游戏研发阶段其实也有很多场景需要设计NPC,比如为关卡设计BOSS,或者为游戏设计教学NPC等等。应用在这些场景的NPC不一定要覆盖到整个游戏场景,并且可能也不需要特别强的能力。

 

懒惰虽然是人类发展的第一动力,但是罗马不是一日建成的,我们不能完全自动生成游戏中所有的NPC,但是部分生成也许是可行的。因此我想需求可能会有这么几点:

 

减少繁琐的人工规则:编写规则类的NPC是费时费力的,不仅要对游戏逻辑有非常清晰的梳理,还需要不断地调试其中的参数,以提高NPC的水平。在这一步,如果能够尽量利用机器自动生成,能生成多少是多少。生成越多就越能减少游戏开发技术人员的工作量。

 

拉近非技术人员与NPC设计的距离:非技术人员(比如策划等)最好能够真正参与到NPC的创建中去,而不仅仅是通过向开发提需求。如果能够创造全新的NPC设计接口,让非技术人员也能非常容易的自己动手设计NPC,不需要写代码,不需要太多繁琐的数值调整那就是最好的。当策划能够通过较为自然的方式提出所需要的NPC,而这些需求又能够通过精确的转换,变成机器可理解的目标,那只要不是特别复杂的任务,让非技术人员自动生成NPC也就易如反掌。

 

复杂的AI设计能够有套路可寻:对于那些没有办法完全自动生成的复杂NPC怎么办呢?除了等待技术的进一步革命,一种简单的想法就是采取分治法。复杂的NPC应该是可以由一些简单的部件构建起来的。当我们可以很容易生成简单部件的时候,设计复杂的NPC也就有迹可循了。

 

基于上面分析的这些需求点,我们可以看到关键问题可以归结为两点:

 

1. 如何定义和解决机器能够自动生成的模块?

2. 非技术人员如何定义这样的模块?

 

针对这两点我们再来看看,使用机器学习技术大概能做到什么程度。

 

---

 

定义可自动生成的NPC

 

一种方式是利用领域知识来拆解问题,定义一些目标明确的任务目标。例如:赛车比赛中尽量快,篮球中晃动之后投篮尽量准,格斗游戏中能快速使用某技能击中对手等等。一旦我们能够清晰的描述我们的问题,我们就可以给强化学习设计奖赏函数,让强化学习为我们自动完成NPC的生产。所谓强化学习就是针对我们的目标为NPC设计一些激励机制,让NPC在自己的探索中不断摸索出能够完成我们目标的行为模式的方法。。

 

既然有这等神器,为什么不能所有任务都完全交给强化学习呢?因为强化学习中涉及到大量的试错过程,需要比较高昂的时间代价,另外对于复杂的任务,依然还没有特别高效的算法可以保证收敛到最优情况。因此我们只能将一些不那么复杂的任务交给强化学习解决。

 

有时候我们虽然有明确的目标,但是却比较难进行形式化的定义。不过如果我们很容易对这个任务进行示范,那也能通过机器学习技术得到解决。

 

UC Berkeley的人工智能实验室就做了这样的一项研究。首先让用户提供一些完成任务的样例,然后基于这些数据训练一个任务成功与否的判断分类器,用分类器的结果作为奖赏,用以进行强化学习的训练,并在这个过程中搜集分类器的负样本。最终依据学习的结果,选择一些样本向用户进行查询。不断迭代这个过程就能够得到一个不错的AI。

 

这个过程实际上利用了两种技术,一种是逆强化学习。因为在训练奖赏分类器的时候,不仅人类提供的正样本很重要,负样本同样也很重要。如果负样本覆盖不全就会导致模型学习到很偏的行为,但是让人类提供各种各样的负样本代价太高了。因此这里的逆强化学习中实际上是在用一种对抗的方式生成负样本。具体一点而言:

 

1. 随机初始化奖赏分类器和强化学习策略

2. 更新策略最大化奖赏

3. 训练分类器以区分用户提供的样本和策略采集到的样本

4. 用新的分类器作为奖赏分类器再更新强化学习策略

5. 不断迭代这个过程,直到模型不再能区分策略的样本和用户的样本。

 

但是上面这个过程虽然不需要用户提供负样本,但是却需要在建立分类器的时候提供大量的正样本,对用户的使用而言依然还是有很大的使用负担。这里就采取了主动学习的技术,选择一定的样本向用户进行查询,从而避免了让用户提供大量正样本的问题。

 

在实际试验中,这个方法显示只需要向用户进行比较少次数的询问就可以成功的训练机械臂完成指定的任务,并且都是直接从图像中学习得到的。

 

 

[ 机械臂实验 ]

 

这里简单展示一下他们的实验成果。主要考察了如图所示的三个机械臂任务:

 

-pushing,这个任务需要机械臂将一个杯子推到杯垫上

-draping,这个任务需要机械臂将一块布盖在盒子上

-book placing,这个任务需要机械臂将书插入到书架的空处

 

每个任务初始都提供了80个成功的样例,通过上面的算法都训练到了能够百分之百准确率的完成任务,下面是每个任务需要主动向人询问的次数:

 

从这个结果中我们可以看到,在对于我们人类而言比较能接受的询问次数里,我们就可以利用机器学习技术,让机械臂完成相对不是特别复杂的实际操纵任务。

 

但是我们可能并不想去做这个问题的拆解,有时候是因为懒惰,有时候是因为有些问题确实很难去清楚的去划分子模块。这种时候,其实机器学习也能够帮上忙,OpenAI就提出来一种不用领域知识就能生成若干行为模式的方法,认为不同的行为模式会访问到不同的状态,用访问到的这些状态即可以作为不同行为模式的区分。只要尽量鼓励行为模式之间的差异性,就可以得到足够丰富行为。

 

具体一点而言,这个算法的优化目标可以形式化为如下这样:

 

F = I(S;Z) + H[A|S] - I(A;Z|S)

 

三项中,第一项是最大化子策略和状态之间的互信息,为的是控制自测路访问哪些状态。

 

第二项是最大化混合策略的熵,将所有子策略放在一起视为一个混合策略,最大化熵即是鼓励子策略的多样性。

 

第三项是最小化策略和给定状态下的动作之间的互信息,这是用以确保策略是由状态来被区分的。

 

算法流程大概是这样:

 

[ OpenAI提出的生成算法 ]

 

一开始从行为(skill)的分布中采样出一种,然后在本轮探索中按照该行为给出的动作概率去采取动作。如果智能体探索到容易被分类器区分的状态里去,就会被奖励。与此同时,分类器也会进一步为了更好的从状态区分出行为进行更新。

 

在文章中的模拟环境实验中,在没有任何奖赏设计的情况下,AI自己就学会了诸如跑、走、翻滚等行为模式。

 

[ 算法生成的行为 ]

 

---

 

如何使用

 

从上面提到的这些技术,我们可以看到我们是有可能为非技术人员提供更为直接的设计NPC的途径的。

 

对于能够明确定义出目标的任务,只需要设定目标即可。如果不能准确描述出来,可以使用示范的形式。如果示范也不想做,也可以让计算机自己去探索一些行为模式之后再做挑选。这里的大部分工作可以交由计算机去完成了。

 

除此之外,当我们有了这些由机器生成的简单模块之后,对于这些模块还不能完成的复杂任务,他们依然可以利用起来作为零部件去拼凑一个复杂的AI。拼凑的方法可以是用传统的行为树,将这些模块作为节点进行调用。也可以用机器学习的方法进行组合,比如分层强化学习。

 

在OpenAI的文章中也提到了,利用这些基础模块,能够加速强化学习的对于复杂问题的学习过程。

 

实验进行在如图所示的两个任务中,Cheetah Hurdle希望智能体能够顺利快速的跨过障碍物,Ant Navigation则要求智能体必须按照指定的顺序到达每个点,最终获得一个奖赏。这两个任务中的障碍物和稀疏的奖赏使得对于非分层的强化学习方案非常难以学习。

 

[ 模拟环境中的复杂问题 ]

 

但是在利用上面的自动生成行为的方法之后,在这些方法之上加上强化学习则能取得非常好的结果。之前传统方法甚至不能完成的任务,在这里能够被完成了。

 

[ 利用生成的行为进行进一步学习的效果 ]

 

展望

 

上面提到的这些方法其实只是这类技术里的冰山一角,还有更多的工作值得去研究。而对于我们游戏开发者而言,游戏方法虽然本身并不为游戏开发而生,但却实实在在能够在游戏开发的某些环节中体现出重大作用。比如上面提到的这些工作,他们都在帮助非技术人员理解和使用人工智能技术设计游戏NPC的道路上,或多或少地提供了一些技术思路。

 

当然目前来看缺点也是很多的。为什么叫大话AI辅助NPC设计,就是因为它还仅仅停留在学术文章上,到实际生产环境中还有很长的路要走。即使能够很好的实现出来,它依然不能完全免除人工参与。比如:对于用户自定义的模块,需要用户自己对问题进行拆解划分;对于定义模糊的模块时,需要用户进行示范;对于完全自动生成的行为,可能在表现上都完全不是我们想要的类型。

 

还有一点值得一提的是这类方法并不能保证生产智能体的强度。对于智能体的强度提升,还有很多广阔的课题需要做,不同的游戏品类要实现顶级强度AI的难度是完全不一样的,哪怕只是玩法上的一点点改变,问题可能就会变得很难很难。这方面依然需要长期探索。

 

这里讨论的技术,更多的是考虑非技术人员可以怎么去使用人工智能技术。并且这些技术发明之初,也并不是为了游戏研发的场景。因此这里其实希望有更多的游戏开发者(策划、游戏开发等等)以及人工智能技术的研究人员共同参与进来,一起打开脑洞,一起去设想怎样的工具才是游戏开发者期望的效率提升神器。这样我们才真正有可能去革新游戏研发中的这一环。

 

我们希望游戏中的人工智能技术今后不仅仅只停留在Nature、Science这样离我们比较遥远的学术期刊上,也不是停留在一些宣传的视频文章上,而是能更接地气的实实在在地在我们的生产环境中应用起来,成为广大游戏开发者的福音。当然这是一场漫长的远征。下一世代的游戏NPC设计工具究竟是怎样的,由我们这一代游戏人来共同定义。

阅读与本文标签相同的文章