游戏中的深度学习与人工智能

2017 年 6 月 27 日

本文为大数据杂谈 4 月 27 日微信社群分享内容整理。

大家好,我是欢聚时代的高扬,这次跟大家分享的内容是深度学习在游戏 AI 中的应用这样一个话题。

(点击放大图像)

NPC 的驱动粗分可以分成低级、中级、高级、特高级,这样几个类别。当然,按照其它的方式分也未尝不可,这里主要是针对实现方式和应用场景的一个粗略划分。

(点击放大图像)

低级NPC 通常说的是一些游戏中所谓的杂兵,不涉及什么情节,也没有什么所谓的策略作为驱动。基本上就是按照一定的设计好的路线行进,并直接攻击游戏主角。这类游戏很常见,尤其是老的单机游戏中,绝大部分就是这类NPC。

(点击放大图像)

中级NPC 常见于游戏群战中的配合型NPC。这类机器人会有一定的事先编号的策略作为驱动,并且有简单的应变能力。当然,这些都是人类事先设定好的策略内容。比如优先攻击血量较低的游戏主角,比如在自己血量过少的时候会优先进行回血等等,通过这些行为完成一定的活动序列差异。但是场景非常单一而且确定。

(点击放大图像)

高级NPC 是指网游中的高级团战中的配合。像王者荣耀、或者英雄联盟一类的游戏有着丰富的走位、加血、加防御、减速……等等复杂的影响盘面的因素。这些因素对于人来说都是需要长期摸索和练习才能在不同场景中得以良好配合的,所以这类NPC 的策略是比较难编写的,至少很难找到一个相对确定的能够保证较高胜率的策略编写思路。

(点击放大图像)

特高级NPC 泛指那些带有较强的博弈性的对抗策略。在这种NPC 需要对长期的盘面演变有较好的全局能力,通常更难直接编写。如果尝试使用穷举的方式去做搜索来充当策略的话,其时间复杂度通常也是普通的计算单元难以承受的。所以,如果期望NPC 在复杂环境中有比较好的表现那么就需要有更合适的方式,例如让NPC 自己在大量的游戏过程中自己学习最好的方式并逐步进化。

(点击放大图像)

这种情况下人工智能在游戏AI 中的应用就越来越受到人们的关注。当然,人工智能的差距主要是体现在游戏环境的差距上。不同的游戏的NPC 训练其难度是不一样,当然是越简单的场景越容易训练,体现出来的就是输入的维度差距。少的游戏只有几个维度,而一些较复杂的场景就有数万个维度抑或更多。

(点击放大图像)

除此之外,人工智能的差距还体现在另一方面,那就是在这个过程中,人对训练过程的参与程度的高低,我们当然是期望人为参与程度越低越好。越低说明这种模型或者方式的“自主性”越强,那么未来其自己进化的场景泛化性也就会越大。

(点击放大图像)

对于这一类需要使用训练(自学习)的方式来进化的NPC 来说,基本套路是固定的。如果能够在全局范围内,将模型转化成为一个求最大值或者最小值的问题那么就可以通过凸优化或者凹优化的方式来解决。那么在这个建立模型的过程中就要设定好整个模型的评价函数,并在策略的调整中使得评价函数取得极值。

(点击放大图像)

在落地的过程中可以使用经典的统计方法来做,也可以用神经网络来拟合策略,当然也可以使用人工智能中比较经典的强化学习的套路来做实现,这些都是可以选择的路径。

(点击放大图像)

可以使用经典的统计模型的多为概率性的博弈游戏,例如德州扑克、二十一点等等这些。不过这些模型在规则确定的情况下是几乎只能按照静态概型的情况通过排列组合来做计算的,所以局限性也比较强。

(点击放大图像)

如果使用神经网络算法(深度学习)来做游戏AI 也是可以的,由于神经网络拥有很高的VC 维,也就本身超强的拟合能力,所以是可以用来应对复杂场景的。那么在这其中最容易想到的就是使用卷积神经网络作为落地工具。卷积神经网络有着很好的特征提取的特性,收敛快,适合输入为大量像素的情形。

(点击放大图像)

这里简单介绍一下卷积网络,卷积网络是一种很常见的深度学习网络构建方式。其中拥有卷积层、池化层和最终的输出层。卷积层用来提取特征,池化层用来做降采样,提高泛化能力,输出层则是用来做分类或者预测,在这样一个场景中则可以用来表示NPC 的输入,或者动作。也就是说,场景数据向量作为输入,NPC 动作作为输出,网络在训练的过程中被投以大量的正样本——也就是那些在游戏中行为正确的样本。

(点击放大图像)

例如在象棋对弈中,象棋棋盘就可以描述成为一个9*9 的向量,向量上的每个维度可以用线性无关的编码描述有没有棋子,有哪个棋子——这些作为整个盘面的描述信息输入给卷积网络。网络的输入部分则给一个“好棋”的描述,就类似于“车三进一”,“炮二平七”这样的动作的向量化描述。

(点击放大图像)

请注意,在这个过程中,一定要给卷积网络大量的正样本,也就是那些比较靠谱的动作,这样才能让卷积网络在这个过程中学到正确的动作。而如果相反,如果你给到网络的是一些不太好的行棋动作,那么网络同样会把这些臭棋都学下来。显然,这根本不是我们想要的东西。

(点击放大图像)

卷积网络的优点就如刚才我们说的那样,收敛速度快,泛化能力好,应用场景广。这就使得它可以在很多种不同的游戏中得以应用,用来当做NPC 的大脑来训练。

(点击放大图像)

但是同样,卷积网络也是有着自己的缺点,它需要大量的正样本和人工干预。就以刚才的象棋来说,每一个盘面在输入网络的时候,都需要给定其一个人为标注过的“好棋”的描述。这样训练成本就大大增加了,所以这一点也就使得无法低成本获得正样本评价的场景中直接这样使用卷积网络成为了不可能。

(点击放大图像)

综上所述,直接使用卷积网络仅仅适合那些输入数据量偏小,而且动作简单,容易获得正样本的游戏。而其它局势复杂的游戏通常都需要做一些改进才可以。

(点击放大图像)

目前比较先进的游戏AI 的训练方式是以2013 年NIPS 发表的关于DQN 的论文为理论基础的神经网络和强化学习的结合方式。先抛开DQN 不管,我们先来说强化学习的基本概念。在强化学习的范畴中,通常有这样几个研究对象,一个是机器人,也叫本体,就是我们要训练的对象;一个是环境,也就是机器人所处的场景;一个是动作,是机器人所发出的行为(Action);从环境中,机器人会不断地得到两种东西,一个是状态(State),一个是奖励(Reward)。

(点击放大图像)

一旦这个场景建立之后,其实就可以开始训练了,作为机器人我们将获得什么呢?当然是时间序列上的一系列State、Action、和Reward。请注意,这个Reward 不一定只是奖励,如果是一个正数,那么就表示奖励,如果是一个负数就表示惩罚。在一个事件序列上我们将连续不断地获得State、Action 和Reward 串。不过这里的Reward 不是表示当前你的State 和Action 的奖励,而是表示在前一个State 的状态下,由于你做了一个Action 所带来的奖励值。

(点击放大图像)

既然有了这样一系列的数据,其实通过简单的统计我们就能得到这样一张表。如图所示,纵列都是State,横列都是Action,通过统计可以在表中填写一个Reward 值。也就是表示在某个State 下,发出某个Action 后所获得的Reward 值,这就是一个认知。那么在使用的时候,机器人可以通过查表,在一个State 下,找到那个State 下最大的Reward,和它对应的Action,然后做这个Action 就可以获得最大的奖励值了。

不过这样也有一个显而易见的问题,那就是短时问题。因为State 是连续的,前后之间也是有着一些潜在影响的。就像在玩沙罗曼蛇这种游戏的时候,如果为了吃个枪而在下一秒撞墙的话,那么吃枪的意义就不存在了。所以,即便在当前State 下找到一个最大Reward 的Action 并不意味着它能够在未来保证长期的Reward 比较大。

(点击放大图像)

这种情况我们就需要这样来看了,其实就像这样一颗树。时序上靠近前面的State 就是树根,时序上偏后的就是下面的树枝树叶的节点。下一层上所有的Action 中Reward 最大的其实并不意味着能引导一条全局Reward 最大的路径。换句话说,下一秒笑得最开心不代表能笑到最后。从这个图上也能看出来,1-4-1 这条路径的总收益是没有右侧的1-1-5 更好的。

(点击放大图像)

这种时候就需要这样一种叫做Q-Learning 算法的东西,公式就这样写。Q(s,a) 表示的就是前面那张表的内容,a 和s 分别是横纵坐标。一个Q(s,a) 就表示一个具体的值,这个值就是一个Reward。在这个算法中需要对整个表中的Q(s,a) 不断更新,更新的原则就像公式上所写,其中alpha 和gamma 是一个权重系数。定性来说,Alpha 代表对未来收益的重视程度,0 就表示完全不考虑,1 则表示当前的收益取决于下一个可以转移到的状态中那个Reward 值最大的。

也就是可以这样理解,如果把alpha 配置成1 的话,整个Q(s,a) 的更新过程就是不断把后一个状态中Reward 最高的值向前赋予。也就是可以解释成,一个状态被评价为“比较靠谱”是因为它后一个状态“比较靠谱”,而这后一个状态“比较靠谱”也是由于它的后一个状态“比较靠谱”。这样进行向前传递,也就容易解决短视问题了。

(点击放大图像)

来看这张图,在这种假设前提下,基本我不能获得每一个State 下每一个Action 的具体评价,也能够在整个棋局最终结束的时候对胜利一方给一个正值的Reward,并通过这种方式进行传递,最终把整个一条完整的“靠谱”的行为链找到。

(点击放大图像)

深度学习在这个场景中也是有应用的,现在用的比较多的是DQN,全称叫做Deep Q-Network。这是强化写出和深度学习的一种结合,网络的输入是一个盘面的信息,中间通过卷积层和全连接层,最后是一个SOFTMAX 来拟合一个Q 值也就是Action 和其对应的Reward 值的评价。

(点击放大图像)

DQN 的损失函数是比较特殊的。在训练的过程中,需要做两件事:1、不断把后面状态的 Reward 向前部去做更新,就像刚才我们写的那样。2、在这个过程中让一个状态 Statet 和它的下一个状态 Statet+1 通过网络,让他们产生的 Reward 评价差异最小。在整个算法最后收敛的时候,会有这样一种现象,那就是那条最靠谱的路径上所有的 Statet 和 Statet+1 的 Reward 值都一样大。并且,Statet 和 Statet+1 状态的评价规则是一样的。因此,这种情况下,任何一个 State 输入网络,都可以顺着这个 State 下面最靠谱的那条路径走下去。

(点击放大图像)

除此之外,其实也可以对这种机器人进行扩展。也就是说,评价函数不是让它胜率最高,而是让它在跟玩家游戏的过程中,使得玩家的游戏时长加大。这个技巧就比较多了,是需要把玩家的游戏节奏也作为训练条件输入的。

(点击放大图像)

总体来说,对于很多流量不充足的游戏平台还是会需要这样一种机器人来陪伴玩家进行游戏的。不管是连续赢、连续输、没有对手、没有队友,任何一种引起玩家不悦感觉的情况,机器人理论上都应该可以破解。

(点击放大图像)

对于一些更为复杂的模型,单纯依靠普通的DQN 已经不能很好地解决问题了。因为维度过高,所以很可能导致模型收敛速度不理想。有时候可能需要借助一些其它的手段来进行决策,例如随机决策森林等。也就是说可以建立多个精度较差的模型,让它们各自根据自己的判断来进行策略投票,最终通过表决的方式来决定策略。其实就是一个“三个臭皮匠顶个诸葛亮”的用法。

(点击放大图像)

最后进行一下游戏市场的展望,2016 年中国的游戏市场大约1700 亿的盘子,这个规模还是很大的。

(点击放大图像)

目前据我们估算在众多的游戏中,大概有30% 在长尾中的用户是由于“失配”的原因导致的流失或不活跃。那么机器人的作用就非常明显了,就是希望通过它们与用户的磨合最终弥补这30% 的失配情形,最大程度提高长尾用户的活跃程度。

(点击放大图像)

据推测在这长尾的容积中大概有700 亿左右的市场空间是可以由游戏机器人来弥补的,也就是刚才估算的那30%。其中棋牌类游戏的保守估算大约80 亿,所以说市场规模还是非常值得期待的。这也是我们逐步努力的目标。

答疑环节

Q1:机器学习和深度学习在文本日志分析领域有做得比较好的案例吗?面对这么庞大的日志,貌似目前都没有一个很好的解法,这个相信很多同学都碰到类似的问题,不管监督还是非监督学习,对于未知文本分析都起不了很好的作用,总不能人肉长期来分析,也不是特别合适,不知道老师对这方面的看法是如何的?

高扬:关于文本挖掘是有专门的领域来研究的,如果是形态比较好的日志,那么分析的手段就比较多了,因为里面会有大量的带有强烈的提示性的 ERROR 或者 WARNING 等。如果是文字比较多,那么也是 NLP 研究的一个范畴。这类应该还是比较典型的监督学习。目前如果使用深度学习做文本分析,还是需要由人来大量标定样本,进而让分类器识别相应的文本分类。如果是 NLP,那么主要也是靠分词以及文章类别的标定等方法。聚类也是可以用的,不过聚类只能找出那些彼此近似的日志,这种情况下研究离群点可能更合适,看看这些点是不是代表着典型的且严重的问题,拿这些作为样本来训练。

Q2:高老师,请问,深度学习应用于游戏的最大特点和难点是什么?

高扬:深度学习的特点是可以 End-to-End,那么在以图片或者视频作为输入的场景中,显然巨大的样本维度是一个非常难以应付的问题。所以在这种情况下,我们通常都会考虑采用降采样的方法来降维,来让网络收敛快一些。其次,对于一些演化太过复杂的游戏来说,越丰富的信息也就意味着需要越多的样本进行训练,而且数量是几何级的,这个也是比较大的问题。当然,卷积网络肯定是非常好的选择,因为它的降采样功能本身有着很好的抗过拟合,和收敛快的效果,只不过在不同的游戏中,网络的设计需要多种尝试才能确定,没有固定的套路来一步到位。这个也是比较麻烦的事情。

Q3:AI 如何在游戏中自动进化?

高扬:这个比较容易,简单说就是随着样本越来越多,那么 AI 在这其中就能学到越来越多,越来越靠谱的决策方法。

Q4:像星际这样的游戏,如何把大量的状态映射到一定的矩阵中?

高扬:FC 游戏的强化学习,我的 TEAM 已经在尝试中了,其实原理是一样的,只不过显然星际争霸这样的游戏更为复杂。所以第一肯定是考虑采用带有池化层的卷积网络来进行降维以及特征提取,其次的话可以考虑人为做一些降采样的功能,比如可以通过多个网络来进行不同的动作。有的网络用来标定其中的 NPC 或者 PLAYER 的位置以及分类,这个可以考虑用 RCNN 来做;有的网络用来获取当前处于整个大地图的位置;有的用来获取玩家当前的各种资源状态等等……这些网络都是有着极好的而且极大效率的降维功能,对于整个算法的训练收敛是有帮助的。所以,这些方式都应该是我们优先尝试的对象。

作者介绍

高扬,著有《白话大数据与机器学习》、《白话深度学习与 Tensorflow》、《数据科学家养成手册》。其中《白话大数据与机器学习》已经上市一年,在京东取得了 400+ 的好评以及 99% 的好评度;《数据科学家养成手册》是刚刚上市的作品,有吴甘沙先生以及 CSDN 创始人蒋涛先生等众多名家的赞誉。重庆工商大学管理科学与工程专业硕士研究生事业导师。北京邮电大学计算机专业毕业,从事数据库、大数据、数据挖掘、机器学习、人工智能等相关工作研究,有 3 年海外工作经验。曾任金山软件西山居大数据架构师,现任欢聚时代资深大数据专家。


感谢杜小芳对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017 年 6 月 27 日 17:534737

评论

发布
暂无评论
发现更多内容

《零基础学 Java》 FAQ 之 3-为什么计算机里的浮点数不精确

臧萌

Java 浮点数

一口气带你踩完五个 List 的大坑,真的是处处坑啊!

楼下小黑哥

Java 踩坑 后端 集合

产品周刊 | 第 14 期(20200510)

Herbert

产品 产品经理 产品设计

给在线教学泼点冷水

启润

在线教育 基础教育

如果想了解驱动开发,请不要错过这篇。

水滴

最佳实践 开发者 程序设计 测试驱动开发实战营

软件产品的信息安全问题

Interstate5

软件开发 信息安全

用 Electron 打包语雀

封不羁

Java Electron

程序员必需清楚的进程和线程

后端学长

线程 操作系统 进程

浅析 - CocoaLumberjack 3.6 之 FileLogger

Edmond

ios log4j CocoaLumberjack DDLog 日志轮替

从nacos客户端的TIME_WAIT说起

小楼

Java TCP nacos

Spring Cloud集成Sentinel

Java收录阁

Spring Cloud sentinel

Sentinel集成Nacos实现动态流控规则

Java收录阁

sentinel

谈知识付费

兆熊

面向对象是什么

落英亭郎

面向对象

《零基础学Java》 FAQ 之 零-这门课适合我吗?

臧萌

Java 编程语言

《零基础学 Java》 FAQ 之 4-关于补码,多说两句

臧萌

Java 补码

《如何阅读一本书》读书心得

兆熊

读书笔记

自助设备系列——推广

孙苏勇

产品 行业资讯 智能设备

软件产品信息安全 - 数据分类

Interstate5

软件开发 信息安全 数据分类

webpack入门(一)

子铭

HTTP 升级 HTTPS 全过程记录

猴哥一一 cium

https 证书

Dubbo和Spring集成的原理

Java收录阁

dubbo

Java内存模型和volatile、final等关键字

麻瓜镇

Java 多线程

权威与边界

伯薇

权威 边界 BART 工作方式

人人都应该懂的加密算法 - 公钥加密

麦叔

对称加密 加密解密 信息安全 公钥加密

分布式限流框架 - Sentinel

Java收录阁

dubbo sentinel

设计模式入门和策略模式

设计模式

在实战中学习项目管理

兆熊

项目管理 专栏

软件产品开发流程

Interstate5

软件开发 软件开发流程

大话区块链和比特币的技术原理

麦叔

比特币 区块链 数字货币 加密货币 加密解密

Spring Boot自动装配的原理

Java收录阁

Spring Boot

游戏中的深度学习与人工智能-InfoQ