欢迎来到爱看文章网 网

爱看文章网

当前位置:

让AI做个人吧!探究游戏AI的拟人性问题

时间:2023-07-02 09:14出处:端游热点阅读(0)

以下文章来源于腾讯研究院 ,作者杨敬文 等腾讯研究院.

文丨Jingwen、阿白、fortyseven

腾讯互动娱乐 游戏AI研究中心

为什么游戏需要AI?

自电子游戏诞生之始,为了能够为玩家打造一个有生命力的虚拟的世界,游戏中往往都会添加诸多的非玩家角色(Non-Player Character, NPC)。他们最早可以追溯到龙与地下城的桌游(Dungeons & Dragons)[1],在这类桌游中通常需要一个游戏主持人来扮演非玩家的角色提供给玩家决策的选择和下一步的指引。他起到了串联起玩家与游戏世界的作用,甚至可以说整个游戏的进行的节奏都由他来掌控。

[ 《龙与地下城》桌游 ]

而到了电子游戏中,这种非玩家的角色的职责就更加丰富了。他们或许是任务的发布者,或是关键剧情的人物,或是玩家要挑战的对手,亦或仅仅是玩家擦肩而过的路人。但是他们串联起玩家与游戏世界的作用依然没有变。如果没有他们,游戏设计者是很难构建出一个充盈丰富的虚拟世界的。

很多经典的NPC由于背负着丰富的故事剧情,成为一代玩家心中宝贵的回忆。比如大家熟知的《超级马里奥》中的碧琪公主(Princess Peach),就是玩家操控的马里奥一直去努力营救的对象。尽管碧琪公主在游戏中更像一个花瓶NPC,与主角的交互并不多。但是正是由于她的存在,赋予了《超级马里奥》整个游戏的原始驱动力。

[ 《超级马里奥》中的碧琪公主 ]

更有甚者,诸多游戏NPC的原型就是取材于我们的真实生活。比如《魔兽世界》中的暗夜精灵女猎人凯莉达克(Caylee Dak),她的原型就取材于现实生活中的一个猎人玩家,由于她经常在游戏里帮助别人而备受广大玩家欢迎。后来她因白血病不幸逝世后,游戏中的公会专门为她举办了盛大的虚拟葬礼以纪念她的乐观友善。葬礼上数百名玩家集结在暴风城的英雄谷,一路游行至暴风城的花园区,并按照美式习俗鸣放了21响礼炮。《魔兽世界》官方得知后便专门为她设计了这个NPC和相关的剧情任务,为游戏增添了不少温度。

[ 《魔兽世界》中的NPC凯莉达克 ]

NPC可以说是游戏中不可或缺的一部分。是他们点亮了整个游戏虚拟世界,一方面让玩家更好地融入游戏,另一方面传达了游戏的态度。但是随着游戏创作者的野心越来越大,玩家对游戏的要求也越来越高,单纯只会读剧本的NPC已经很难满足构建一个优秀虚拟世界的要求。这些NPC的行为必须变得更加丰富一些,能处理的问题必须更复杂一些才能让这个虚拟世界变得更有趣,更吸引玩家。其实早在1950年,游戏AI的概念就被引入到了电子游戏中[2],就是为了用人工智能的技术来设计出更智能的NPC,因此游戏AI也常常成为了游戏NPC的一种代称。

但是传统的游戏AI制作技术存在着诸多缺陷,使得这些游戏中的人工智能一直饱受人工“智障”的骂名。不仅极大地影响了游戏的体验,也制约了游戏开发者设计游戏的思路。如何能够制作出优秀的游戏AI(游戏NPC)无疑是游戏开发者苦苦探求的问题。

为什么现在的AI是智障?

为什么现在的AI很多时候总是看上去像个智障呢?其实背后的主要原因是驱动AI的模型太简单了,目前主流的游戏AI都是基于行为树这样的规则系统实现的,它的复杂度有限,并且规律易寻。反观人类大脑里这么多神经元错综复杂的交汇着,至今科学家们也没完全解开大脑的秘密。

我们以经典的《吃豆人》游戏为例来介绍一下如何用一个规则系统实现游戏AI。吃豆人游戏的玩法如图所示,就是要控制吃豆人尽可能多地吃掉散布在迷宫各处的豆子。但是其中的难点在于,会有能够伤害吃豆人的幽灵在其中游荡,吃豆人为了得到更多的豆子不得不躲避幽灵的进攻。

[ 《吃豆人》游戏 ]

那么如果要用规则系统设计一个吃豆人的AI,该怎么做呢?首先,我们需要考虑吃豆人可能会遭遇哪些状态?而当遭遇这些状态后,吃豆人又可以采取怎样的操作?不同的操作又可以把吃豆人引入怎样的状态中去?当把这些问题答案罗列出来之后,我们就能够组织出吃豆人在不同状态下应该如何决策的规则系统,如下图所示

[ 简易吃豆人的规则AI系统 ]

在“寻找豆子”状态下,可以设置让吃豆人随机游走,如果看到豆子就去吃掉它的行为。而当发现幽灵正在附近的时候,就进入到“躲避幽灵”状态,这时可以将吃豆人的行为设置为远离幽灵,而无视豆子的存在。当幽灵脱离了之后,状态又可以转换到“寻找豆子”。如果吃豆人很幸运地吃到了一颗能量药丸,那么他就获得了击败幽灵的能力,此时状态可以转换为“追击幽灵”......

从上面的吃豆人的例子中我们可以看出,基于规则的AI系统是有明显的缺陷的。首先,如果游戏场景比较复杂或者说对智能体的行为和能力有比较高的要求,会有非常复杂繁多的状态。分解出这些状态、编写状态中的行为、设计状态之间的转移条件无疑会带来巨大的游戏开发成本。但是游戏开发的成本是有限的,开发人员的精力也是有限的。其次,随着游戏的设计越来越复杂,分解这些状态、编写规则系统也已经变得越来越不太可能了,更别说开发一个栩栩如生的规则AI系统了。最后,但是最重要的一点是当人类与这些AI进行交互的时候,可能会产生很多意料之外的状态,而这些规则系统是完全不具备泛化性的,对于这种意外状态只能表现出智障行为。

为什么游戏AI需要像人?

随着游戏这么多年的发展,游戏的形态和玩法都变得越来越丰富。但是我们可以发现,在那些特别吸引人的游戏中,有两种类型的游戏是特别突出的。

一种是构建了一个引人入胜的虚拟世界,里面的人和事是那么真实,以至于让我们深深沉浸其中。比如在《荒野大镖客》中,当你漫步在小镇的街道上,也许会看到一个妇人倒在地上哭泣求助,如果你过去帮助她,她会突然变脸掏出枪指着你说“抢劫!”。这种看似对玩家的当头一棒,却又是非常符合那个时代背景的事件真的让玩家无法自拔。

[ 游戏《荒野大镖客》 ]

而同样也是打造了一个西部场景乐园的《西部世界》更是吸引了无数的权贵到其中游玩,它本质上就是一个有高度拟人AI的动作探险游戏,只不过里面AI的智能和外形都进化到了一个远高于现在电子游戏的形态。

另外一种是构建了一个合适的与真人在线竞技的场景。多人在线对战变得越来越热门,其背后的逻辑也可以解释为在游戏消费内容有限的情况下,玩家还是希望更多地与更聪明的人类进行游戏,因为人类的创造力和游戏生命力是旺盛的,即便在这个过程中可能要忍受谩骂与不快。如果我们用足够像人类玩家的AI来填充,这类游戏本质上和第一类也没有区别。

总而言之,就是游戏中的角色越像人,就越能给玩家带来吸引力。它并不一定需要像高手玩家一样将游戏玩得滚瓜烂熟,但是要能做出人类才会做出的反应,即便那些反应是不理智的。

因此游戏角色行为的智能性对于打造整个游戏的游戏性、以及对玩家体验的塑造有着至关重要的作用。但是就像前面提及的行为树一样,这么多年过去游戏中诞生了无数的AI,但是大多数还是会被玩家认为不像人,只会固定的套路,让玩家对游戏兴趣大减。

怎么判断AI像不像人呢?

那怎么才能判断AI到底像不像人呢?这个问题并不好回答,具体到不同的场景里,答案可能都不一样。比如机器可以很好的将一段复杂的中文翻译成英文,但是又很难听懂“我去!我不去”“那么到底去不去呢?”这样的对话。那么这个机器到底像不像人呢?实际上,在人工智能诞生之初,计算机之父图灵(Alan Turing)就讨论过这个问题,并提出了著名的图灵测试(Turing Test)[3]作为一种解决方案。如下图所示,假设有一个人和一台机器被隔离在一个小房间里,我们看不到里面到底是人还是机器,但是我们可以通过一些装置与他们进行沟通。通过一系列提问,我们需要判断究竟哪个是机器哪个是人,如果我们的误判比例超过30%,那么就可以说机器通过了图灵测试。图灵认为通过图灵测试的机器具备了和人类一样的智能。

在游戏中,我们其实也希望AI能够达到类似这种以假乱真的效果,至少在游戏的某个具体任务上,AI能够通过图灵测试,让玩家觉得AI是鲜活的,有生命力的。虽然图灵测试对于判断AI像不像人直观并且可靠,但是却并不实用。至少在优化AI的过程中,使用这样的方式去评判成本太高了。因为我们很难直接把人当成AI的优化器,让人判断了AI做的像不像人之后,再反馈到AI的模型上,让AI去修改参数,再让人类判断。这样手把手的“人工”智能,对于人的精力消耗大不说,也很难覆盖到所有可能的场景。如何更好地度量AI的拟人性依然是一个非常重要的研究课题,但是最基本的我们可以从人类的行为数据和AI的行为数据的对比中罗列出哪些行为是不像人的、哪些是像人的,从而逐渐去优化不合理的部分。这对于一个有限的问题空间而言并不是一件非常困难的事情。

从人类的行为里学习

接下来我们就要考虑如何得到一个像人的AI模型。既然像行为树这种总结经验式的AI制作手段对于提升AI的智能性非常困难,一个最直接的想法便是能不能直接从人类过往的游戏行为里学习经验呢?答案是肯定的。人类在玩游戏的时候,能够产生一系列的游戏状态-游戏操作对,这些游戏状态-动作对就是我们说的人类示例。我们可以将人类一局游戏的示例按顺序组织起来,形成一条行为轨迹一条游戏的序列,即 。那由 条人类示例轨迹组成的数据集可以记为 。从人类行为里学习的目标可以认为是希望AI在游戏中的表现与人类的表现越接近越好。如果能够从这种数据里估计出人类的策略分布 ,并且引入一个回报函数 来刻画这个表现程度(比如游戏的技巧得分、游戏的竞技得分等的综合表现)。那么模仿人类行为的学习目标就可以表示为找到一个AI策略 ,使得它尽量能够取得和人类接近的回报,即:

行为克隆

如何求解这个问题呢?一种直接的想法是通过人类的示例数据集 来估计人类的行为策略 ,这种方式也被称为行为克隆(Behavior Cloning)[4]。一种常用的估计方法就是最大似然估计(Maximum Likelihood Estimation)。假设要求解的策略模型表示为 是描述模型的参数),那么它产生一个数据样本 的似然即可以表示为 。最大似然估计可以转换为最大化对数似然,即

这是一个凸优化问题,我们可以直接使用一些强大的机器学习学习方法来求解。比如,近几年飞速发展的深度学习,由于非常强的学习拟合能力而被广泛应用到图像、自然语言处理等领域。它同样可以帮助我们来拟合人类的行为。

不过值得注意的是,在进行机器学习的时候,每个样本都是作为独立的样本去对待的(机器学习的样本独立同分布假设),但是样本实际上都是从序列数据中收集而来,并不满足独立同分布的假设。这就会导致策略模型如果在某一步发生了一丁点儿的错误预测,那么这个错误会被一直累积下去,导致AI遇到一些人类从来没有遇到过,并且AI也没有被训练过的场景。这时候AI的表现就会非常糟糕。

如下图所示,我们可以很直观地从一个赛车游戏的例子中明白,假如在学习人类的赛车轨迹的时候,在弯道的控制上出现了一定的误差,那么这个误差会被一直延续下去,直到赛车撞出赛道。但是如果没有人类撞出赛道之后的补救行为数据,行为克隆将很难帮助我们得到一个满意的行为策略。

[ 失败的行为克隆 ]

不难看出,行为克隆虽然简单并且高效,但是决策序列越长行为克隆就越可能累积很大的误差,导致后续的决策越来越离谱。如果能够获取足以应付各种意外情况的海量人类示例数据,那么这个累积误差问题才能得到缓解,但是这一点在游戏研发阶段通常都很难满足。不然我们只能寄希望于这些累积误差不会导致对游戏致命的影响。

为了解决这个问题,也有学者提出名为DAgger(Dataset Aggregation)[5]的方法。这个方法的基本思想是不断利用人类来纠正行为克隆中出现的错误。具体算法可以描述为:

  • 首先将行为克隆得到的策略继续与环境交互,来产生新的数据

  • 然后将这些数据提供给人类,以获得人类在这些数据上的行为,从而得到一个增广的数据

  • 在增广后的数据集上,重新进行行为克隆,以得到新的策略

  • 重复上述过程

由于在不停和环境交互的过程中利用人类的知识对数据进行了增广,DAgger算法会大大增加数据对状态空间的覆盖度,从而减少学习时候的误差。

但是也需要注意,不停的让人类提供指导本身也并不是一件简单的事情,即便是一个狂热的玩家也很难不厌其烦地教AI玩游戏,况且如果游戏足够复杂,游戏策略足够丰富,那么DAgger需要向人类请教的示例数量同样可能非常海量。

逆强化学习

上一节中我们提到,籍由行为克隆学习得到的策略一般会受到累积误差问题的影响,那么有没有另一种方法能够减轻累积误差问题带来的影响呢?答案是肯定的,这就是逆强化学习[6]。逆强化学习与行为克隆不同,并不直接求解智能体的行为策略 ,而是尝试从示例数据集 中求解出人类所使用的奖励函数 用于解释人类策略的行为。在使用逆强化学习解决模仿学习问题时,我们就可以使用强化学习在学到的奖励函数上求解最优的行为策略。换句话说,行为克隆是单纯的“模仿”,而基于逆强化学习的模仿学习则是尝试“理解”人类行为的内在逻辑(奖赏函数),再根据它“学习”自己的行为,自然比行为克隆更容易适应环境中的小误差。

在逆强化学习中,最核心的部分就是根据示例数据集求解得出的奖励函数,我们通常要求其满足这个性质:当使用这个奖励函数时,使用人类策略获得的累积期望奖赏,比使用其他任意策略所能获得的累积期望奖赏都要多。换句话说,我们认为人类策略是在使用这个奖励函数时的最优策略,也就是

得到人类策略使用的奖励函数后,我们就可以使用这个奖励函数构建一个新的任务 ,并在这个新的任务上用强化学习来求解最优的行动策略 。根据我们之前对 性质的描述,在这个任务上表现最好的行为策略就是人类策略,即 。通过这种方式,我们就得到了一个能够模仿人类的AI策略。

逆强化学习虽然能够解决行为克隆中存在累积误差的问题,但它本身也存在诸多问题,比如逆强化学习假设人类总是做出最优的选择,这个假设通常在模仿人类人类的问题中显得过强了。此外,逆强化学习问题本身并不是一个良定义的问题,通常有多个可能的奖赏函数能够满足要求,例如对任意状态-动作对都给出0值的平凡奖励函数可以成为任意逆强化学习的解。

对抗式模仿学习

行为克隆和逆强化学习作为两种模仿学习的方法,都存在一定的缺陷,我们自然就会考虑是否有一种方法可以将二者的优势结合起来,既能直接求解行为策略,又不会受到累积误差问题的影响呢?

在逆强化学习中,我们学习了一个奖励函数, 我们可以用这个奖励函数来评估智能体策略与人类策略的相似度,但是这个奖励函数不能直接指导智能体进行行动。那么既然智能体的目标是模仿人类的策略,那么我们是否可以不用显式的求出一个奖励函数用来评估AI策略与人类策略的相似性呢?有没有可能直接用“和人类行为的相似度”这样的指标来引导强化学习对行为策略的学习呢?从这样的思路出发,我们就得到了生成对抗模仿学习(Generative Adversarial Imitation Learning, GAIL)[7],它通过用一个评估智能体与人类的相似度的函数作为奖励函数的方式来对人类的策略进行模仿。

GAIL是一种基于生成式对抗网络的方法,与各种使用生成式对抗网络的方法相似,它也会构建一个生成器G和一个判别器D,并让二者不断进行博弈并交替进行更新。在GAIL中,判别器D是一个二分类器,通常是一个深度神经网络,它的输入是状态-动作对 ,输出则是一个(0,1)区间内的概率值,代表输入的状态-动作对由人类生成的概率。和一般的二分类任务相似的,每轮训练中我们可以可以简单的通过最小化交叉熵损失函数 对D进行更新。

GAIL中的生成器G则是智能体的行为策略 ,训练中 需要与环境不断交互生成轨迹 ,它会使用强化学习方法进行更新,使用判别器的输出 作为强化学习任务中的奖励函数。这就意味着,被判别器 认为更像人类的行为会得到更多的奖赏,因此随着训练的推进 会逐渐向人类行为策略 逼近。二者经过多轮迭代最终收敛后,判别器 无法区分出真实轨迹 与生成器生成的轨迹 ,此时我们的生成器 就是一个能够有效模仿人类行为策略的AI策略。

当然,作为一种基于生成对抗式网络的方法,GAIL也有与GAN相似的缺点:实际应用时需要大量经验性的trick,某些情景下很难训练到理想的收敛结果。但由于GAIL能给模型带来的更强的泛化性,以及更少的示例数据需求仍然使它成为了一个优秀的模仿学习方法。

Avatar平台中的模仿学习

Avatar是腾讯互动娱乐事业群-游戏AI研究中心团队自研的分布式在线强化学习训练框架,已经在如竞速、格斗、FPS、Moba等多个品类的游戏上进行探索和实践,部分游戏AI已经上线。本章我们重点讨论在真实游戏业务场景中训练强化学习模型的过程中,在Avatar训练框架下对模仿学习做的探索。

真实业务需求

以我们在工作中的真实业务场景为例,当游戏业务与接入Avatar强化学习训练框架时,除通过AvatarServiceAPI将游戏客户端与训练框架交互接口对齐之外,都不可避免的需要实现下列内容。

  • 特征工程:将游戏原始数据转换为形如MDP(state/action)格式的数据,并设计状态和动作的数据内容

  • 奖赏设计:针对当前对局状态和模型预测的动作给出正负反馈。

  • 网络设计:根据MDP设计对应的神经网络结构

经历过的同学一定能够体会到被调参支配的恐惧,而这三项每个都是调参地狱。例如[8]详解了奖赏设计(reward shaping),文章有多长,说明reward shaping这一过程有多困难。调参工作每一次微小调整都需要数十小时甚至数十日的验证,而指东打西的结果太容易使人崩溃。

不同于研究领域中RL的重点更多倾向于关注“更高的分数、更强的决策”,而实际业务中甲方爸爸的的要求是“高拟人性、高多样性、高可靠性、覆盖各个能力段”。这二者之间的目标差距为reward shaping带来了更大量的工作量。

长远来看,网络设计在学术界已有诸多的NAS(Network Architecture Search)相关研究,可以自适应的生成效果差不多的网络结构,与实际业务的相关性较低。而特征工程和奖赏设计则都与业务强相关,不仅要对ML/DL/RL有相当的经验,也需要对业务有相应的理解才能训练出甲方爸爸满意的,“像人一样的”强化学习模型。

当有了“模型能够做出像各种各样不同玩家能做出的行为”,这一普遍需求后,如何利用真实玩家行为引导强化学习模型训练的想法就会自然而然的浮现出来。也就是如何利用模仿学习,推进现有的强化学习训练进一步提升拟人性、多样性。

Avatar框架内设计

Avatar设计简述

以PVE类型的游戏(无需与其他玩家对抗)为例,Avatar训练框架核心包含了三个服务——Agent Server, Actor Server和Learner Server。核心交互、MDP处理工作由Agent Server完成,其处理与游戏客户端和另外两个server的交互(如下图所示,红色部分由业务方实现)当客户端连接后,轮询等待预测请求,并从对应的预测服务中获取结果,返回给客户端。当积累够一定数量的预测数据后,Agent Server将其组装成训练样本发送给训练服务;

Actor Server预测训练网络当前policy返回的动作结果;Learner Server则负责对网络进行异步训练,并定期同步参数给Actor Server。

辅助网络设计

从框架设计角度考虑,模仿学习可以理解为利用某种监督学习手段提升强化学习训练效果的一种方法,我们将这类网络称之为辅助网络(Auxiliary Model)。为了降低业务方的学习成本,以及尽可能保证框架的模块化、通用性,我们完全复用了Actor和Learner模块,仅新增对监督学习模型配置、输入数据标准标准定义以及loss function支持。

这设计过程中,我们重点处理的依然是模型间的交互流程,以及模型与游戏间的交互方式的变化。我们认为,在MDP结构下,辅助网络对强化学习主模型训练主要影响位点有以下三处:影响policy action;影响某个state,或state/action组合的reward;增加额外的loss。

由此,我们额外开放了交互接口(如下图所示),业务实现代码可以获取每个网络的预测结果,并自由选择交互时机。

模仿学习实现

具体到模仿学习的实现,我们实现了对抗式模仿学习,模仿学习被认为是“影响到reward的监督学习模型”,主要负责判别当前状态(动作)是否是符合人类行为的状态(动作)。在实际训练过程中,模仿学习模型和强化学习模型一同训练。

在业务同学侧,使用模仿学习仅除了设计网络结构之外,仅需要处理主模型在生成训练样本时叠加模仿学习输出的奖赏,以及将人类行为数据引入到模仿学习训练过程中即可。

模仿学习在竞速类游戏上的探索

我们已经尝试在竞速类游戏上对对抗式模仿学习进行了初期探索,将不同赛道地图中使用业务中已上线的不同能力段模型的录像数据视为模仿学习的行为数据。同时,我们去除了reward_shaping中所有人工设计的奖赏,仅保留模仿学习输出和最终圈速与目标圈速的相近程度作为实际奖赏。

在其中一个赛道上的圈速收敛曲线如下图所示:

借助对抗式模仿学习,使用不同能力段位的行为数据,最终训练出的强化学习模型能力段位十分贴近于目标能力段位,且实际比较发现其收敛速度与原始的仅通过reward_shaping收敛效率相当。在竞速类游戏中初步实现了我们预期目标:减少繁琐的奖励调整工作量,并实现模型能力多样化。

总结与展望

打造高智能的游戏AI一直是游戏制作中绕不开的话题,但是过去由于技术所限,导致游戏AI的智能水平比较低,因此游戏制作者天然地考虑了这个缺陷,而将游戏的亮点设计在其他地方,游戏AI仅仅只起到一个补充的作用。但是基于示例的强化学习方法让我们看到一线希望,就是仅通过少许的人类示例数据,也能够让游戏AI获得相当高程度的智能。我们相信在未来,只要能够打造更为拟人、更为智能的AI,他们不仅可以帮助我们为玩家打造更好的游戏体验,甚至还会对游戏的制作思路和角度带来翻天覆地的变化。游戏AI或许会成为整个游戏的最核心资产,游戏的玩法也将是由玩家与这些AI来共同定义的。

分享到:

温馨提示:以上内容和图片整理于网络,仅供参考,希望对您有帮助!如有侵权行为请联系删除!

友情链接: