如何使用视觉输入训练人工神经网络玩Diablo 2?

148
我目前正在尝试让人工神经网络玩一个视频游戏,并希望从这里美妙的社区中获得一些帮助。
我选择了《暗黑破坏神2》。游戏是实时的,以等距视角进行游戏,玩家控制一个单一的角色,摄像机以其为中心。
为了使事情具体化,任务是让您的角色获得x点经验值,而不使其健康值降至0,其中通过杀死怪物获得经验点。以下是游戏玩法的示例:

here

现在,由于我希望网络仅基于屏幕上的像素信息运行,因此它必须学习非常丰富的表示形式以便高效地玩游戏,因为这可能要求它(至少是隐含地)知道如何将游戏世界分成对象并与其交互。
所有这些信息都必须以某种方式教给网络。我无法想象如何训练这个东西。我的唯一想法是有一个单独的程序从屏幕中提取游戏中天生好/坏的东西(例如健康,黄金,经验),然后在强化学习过程中使用该统计数据。我认为这将是答案的一部分,但我认为这还不够;从原始视觉输入到目标导向行为有太多抽象层次,以至于如此有限的反馈无法在我的有生之年内训练出一个网络。
所以,我的问题是:你能想到其他方法来训练网络完成至少部分任务吗?最好不要制作数千个标记示例。
只是为了更好的方向:我正在寻找一些其他的强化学习来源和/或在这种情况下提取有用信息的任何无监督方法。如果您能想到一种方法,可以获得游戏世界中的标记数据,而无需手动标记它,则可以使用受监督的算法。
更新(04/27/12):

奇怪的是,我仍在继续这项工作,并似乎正在取得进展。让ANN控制器正常工作的最大秘密是使用最先进的适用于任务的ANN架构。因此,在微调时间差反向传播(即使用标准前馈ANN进行强化学习)之前,我使用了一个由分解有条件限制玻尔兹曼机组成的深度置信网络进行了无监督训练(使用我玩游戏的视频)。

尽管如此,我仍在寻找更有价值的信息,特别是关于实时动作选择问题以及如何为ANN处理编码彩色图像方面的问题:-)

更新(10/21/15):

我刚想起来我曾经问过这个问题,并且我认为我应该提到这不再是一个疯狂的想法。自从我上次更新以来,DeepMind发表了他们的自然论文,关于如何让神经网络通过视觉输入玩Atari游戏。实际上,唯一阻止我使用他们的架构来玩Diablo 2的是缺乏对底层游戏引擎的访问权限。将其渲染到屏幕上,然后将其重定向到网络中进行训练所需的时间太长。因此,我们可能不会很快看到这种机器人玩Diablo 2,但只是因为它将玩一些开源或具有API访问渲染目标的东西。(也许是Quake?)


1
看看这篇论文。 :Dhttp://www.ri.cmu.edu/pub_files/pub2/pomerleau_dean_1992_1/pomerleau_dean_1992_1.pdf - zergylord
1
据我所知,Diablo 2使用易于提取的精灵表。将对象(玩家、敌人等)与相关精灵列表联系起来应该相当简单。这并不能解决对象互相遮挡的问题,但至少是一个开始。 - Ryan Jenkins
@zergylord 如果您能说明您想要坚持的标准有多严格,即a)玩Diablo 2和b)使用屏幕上绘制的像素作为您唯一的输入源,那将会很有帮助。如果您想让事情变得更容易,我认为您需要放松其中一个(或两个)-您愿意这样做吗? - Stompchicken
@zergylord:我已经在下面写了一个长答案来解决你的初始问题,但实际上我真的认为你需要简化你的问题并且尽可能地作弊,否则你将无法在合理的时间内得到任何可行的解决方案。 - gaborous
2
投票关闭,原因是过于宽泛。 - Ciro Santilli OurBigBook.com
显示剩余2条评论
7个回答

60

我可以看出你对如何训练人工神经网络感到担忧,但这个项目隐藏了一些你可能没有意识到的复杂性。在电脑游戏中通过图像处理进行对象/角色识别是一项非常具有挑战性的任务(尤其是FPS和RPG游戏中)。我不怀疑你的技能,也不是说它做不到,但你很容易花费比实现ANN本身(假设你已经有数字图像处理技术的经验)多10倍的时间来识别物品。

我认为你的想法非常有趣而且也非常雄心勃勃。此时你可能需要重新考虑一下。我感觉这个项目是你计划为大学做的事情,所以如果工作的重点真的是ANN,你应该选择另一个游戏,选择更简单的。

我记得不久前还有其他人来寻求关于一个有些类似的但不同的项目的建议。值得一看。

另一方面,如果你接受建议,可能会有更好/更简单的方法来识别游戏中的对象。但首先,让我们把这个项目称为你想要的东西:一个智能机器人

一种方法实现机器人访问游戏客户端的内存来查找相关信息,例如角色在屏幕上的位置及其健康状况。读取计算机内存很容易,但确定要查找的内存位置并不容易。像Cheat Engine这样的内存扫描程序可以非常有帮助。

另一种方法是在游戏下方操作渲染信息。游戏的所有对象都必须被渲染到屏幕上。这意味着所有3D对象的位置最终将被发送到视频卡进行处理。准备好进行一些严肃的调试工作。

在这个答案中,我简要描述了通过图像处理实现你想要的2种方法。如果你对它们感兴趣,可以在涉及此主题的优秀书籍Exploiting Online Games(第6章)中找到更多相关信息。


46
2018年7月26日更新: 就是这样!我们现在接近于解决这种游戏的点了!使用OpenAI并基于DotA 2游戏,一个团队可以制作出一款能够击败半职业玩家的5v5游戏的人工智能。如果你了解DotA 2,你就会知道这个游戏在机制上与类似暗黑破坏神的游戏非常相似,但也有人认为由于团队合作的关系,它甚至更加复杂。

正如预期的那样,这要归功于强化学习和深度学习的最新进展,并使用开放的游戏框架,如OpenAI,因为你可以得到一个整洁的API,同时还可以加速游戏(AI每天自己对抗相当于180年的游戏时间!)。

在2018年8月5日(还有10天!)计划将这个AI与顶级DotA 2玩家进行比赛。如果成功,预计会引起一场大革命,也许不像解决围棋游戏那样被媒体广泛报道,但对于游戏人工智能来说,这将是一个重大的里程碑!

更新 2017-01: 自 AlphaGo 取得成功以来,该领域发展迅速,并且几乎每个月都会推出新的框架来促进机器学习算法在游戏上的开发。以下是我发现的最新框架列表:

  • OpenAI's Universe:一个使用机器学习玩几乎任何游戏的平台。API使用Python编写,并在VNC远程桌面环境中运行游戏,因此可以捕获任何游戏的图像!您可能可以使用Universe通过机器学习算法玩Diablo II!
  • OpenAI's Gym:类似于Universe,但专门针对强化学习算法(因此它是AlphaGo所使用框架的一种概括,但适用于更多的游戏)。有Udemy上的课程介绍如何使用OpenAI Gym将机器学习应用于像打砖块或末日毁灭者等游戏。
  • TorchCraft:Torch(机器学习框架)和星际争霸:自由之翼之间的桥梁。
  • pyGTA5:一个项目,使用仅屏幕截图(有许多在线视频)在GTA5中构建自动驾驶汽车。

非常激动人心的时刻!

重要更新(2016-06):正如原帖所述,现在有几个严肃的机构正在解决使用仅视觉输入训练人工神经网络玩游戏的问题,并取得了相当有希望的结果,例如DeepMind Deep-Qlearning-Network (DQN)

现在,如果您想挑战下一个级别的挑战,可以使用各种AI视觉游戏开发平台,例如ViZDoom,这是一个高度优化的平台(7000 fps),可以使用仅视觉输入训练网络来玩Doom:

ViZDoom允许开发使用仅视觉信息(屏幕缓冲区)玩Doom的AI机器人。 它主要用于机器视觉学习和特别是深度强化学习的研究。 ViZDoom基于ZDoom提供游戏机制。

结果非常惊人,可以在他们的网页上观看视频,这里也有Python教程

还有一个类似的项目是Quake 3 Arena的Quagents,它也提供了易于访问底层游戏数据的API,但您也可以使用截图和API来控制您的代理。

如果我们只使用截图,为什么这样的平台很有用?即使您不访问底层游戏数据,这样的平台也提供以下功能:

  • 高性能的游戏实现(您可以在更短的时间内生成更多的数据/游戏/学习代数,以便您的学习算法能够更快地收敛!)。
  • 一个简单而响应迅速的API来控制您的代理(即,如果您尝试使用人类输入来控制游戏,则可能会丢失一些命令,因此您还需要处理输出的不可靠性...)。
  • 易于设置自定义场景
  • 可定制的渲染(可以用于“简化”您获得的图像以便于处理)
  • 同步的(轮流进行)游戏(因此您首先不需要让算法实时工作,这是巨大的复杂性减少)。
  • 其他方便功能,如跨平台兼容性、向后兼容性(当有新的游戏更新时,您不会冒险您的机器人不再与游戏一起工作),等等。

总之,这些平台的好处在于它们减轻了以前必须处理的许多技术问题(如如何操作游戏输入,如何设置场景等),使得您只需处理学习算法本身。

现在,开始工作,为我们打造最好的AI视觉机器人吧;)


旧文章,描述了仅依赖视觉输入开发人工智能的技术问题:

与我上面的一些同事相反,我并不认为这个问题是不可解决的。但它肯定是一个非常困难的问题!

首先要解决的问题是游戏状态的表示:仅凭单张图像无法完整地表示状态,需要维护某种记忆(包括健康状况、装备和可用物品、任务和目标等)。获取这些信息有两种方法:直接访问游戏数据最可靠且简单;或者通过实现一些简单的过程(打开库存、截取屏幕截图、提取数据)创建这些信息的抽象表示。当然,从屏幕截图中提取数据要么需要您制定一些受监督的过程(完全由您定义),要么需要使用无监督的机器学习算法(但这会大大增加复杂性……)。对于无监督的机器学习,您需要使用一种相当新的算法,称为结构学习算法(它们学习数据的结构而不是如何对它们进行分类或预测值)。其中一种算法是Richard Socher的递归神经网络(不要与循环神经网络混淆): http://techtalks.tv/talks/54422/ 然后,另一个问题是即使你已经获取了所需的所有数据,游戏仍然只有部分可观察性。因此,您需要注入一个抽象的世界模型,并使用来自游戏的处理信息进行喂养,例如您的角色的位置,但也包括屏幕外的任务物品、目标和敌人的位置。您可以尝试查看Vermaak 2003的混合粒子滤波器。
此外,您需要具有动态生成的目标的自主代理。您可以尝试使用著名的BDI代理架构,但您可能需要对其进行调整以使其在实际情况下工作。作为替代方案,还有递归Petri网,您可以将其与各种Petri网的变体相结合,以实现您想要的功能,因为它是一个非常好研究和灵活的框架,具有很好的形式化和证明程序。
最后,即使你做了以上所有事情,你仍需要找到一种方法来模拟游戏的加速速度(使用视频可能很好,但问题是你的算法只能观察而没有控制,自己尝试非常重要)。实际上,众所周知,当前最先进的算法需要比人类学习同样的东西花费更多时间(特别是在强化学习方面),因此如果不能加速这个过程(也就是说,如果你不能加速游戏时间),你的算法甚至无法在一个生命周期内收敛...
总之,你想要在这里实现的目标处于当前最先进算法的极限(甚至略有超越)。我认为这可能是可能的,但即使如此,你将花费很长时间,因为这不是一个理论问题,而是一个你正在处理的实际问题,因此你需要实施和结合许多不同的人工智能方法来解决它。
几十年的研究可能还不足够,所以如果你是独自工作并且只能兼职(因为你可能需要一份工作维持生计),你可能会花费整个人生而仍未达到一个可行的解决方案。因此,我最重要的建议是:降低期望值,尽可能地利用所有可以使用的信息,减少问题的复杂性(例如,尝试直接连接游戏,寻找DLL注入,实施监督过程简化一些问题,不要让算法学习所有东西,暂时放弃图像处理,依靠内部游戏信息,等到算法完善后再逐步引入图像处理,替换监督式程序和记忆游戏数据,使用无监督机器学习算法处理屏幕截图)。祝好运,如果成功了,请务必发表文章,你肯定会因解决如此难题而声名大噪!

1
哇,这真是对每年更新的承诺啊...干得好,先生。 - Turq6ise

26

您所追求的问题在您定义的方式下是难以解决的。认为神经网络会“神奇地”学习一个问题的丰富表示通常是错误的。在决定ANN是否是任务的正确工具时需要牢记的一个好事实是它是插值方法。思考一下,您是否可以将您的问题构建成找到一个函数的近似值,其中您有来自该函数的许多点和大量的时间来设计并训练网络。

您提出的问题未能通过这个测试。游戏控制不是屏幕上图像的函数。玩家必须记住很多信息。以一个简单的例子来说明,通常情况下在游戏中每次进入商店时,屏幕看起来都是相同的。然而,您购买的取决于情况。无论网络多么复杂,如果屏幕像素是其输入,那么它在进入商店时总会执行相同的操作。

此外,还存在规模问题。您提出的任务太复杂了,在任何合理的时间内学习它都是不可能的。您可以参考aigamedev.com来了解游戏AI的工作原理。人工神经网络已经在某些游戏中成功运用,但使用范围非常有限。游戏AI是难以开发的,通常也很昂贵。如果有一种构建功能神经网络的通用方法,该行业大概会抓住它。我建议您从简单得多的例子开始,比如井字棋。


好的。你可以把大多数类似网络的东西称为ANN,但这几乎不可能引起实质性的讨论。 :) - Don Reba
嗯,是的...我应该更深入地解释我的动机。我知道有更好的方法来制作游戏AI,但我正在这样做是为了推动我一直在升级的ANN模拟器的极限。请参见:http://www.stanford.edu/group/pdplab/pdphandbook/ - zergylord
1
无论如何,Don Reba是正确的,我也认为在没有整合大量先前知识并提取可用于基于强化学习方法的有用特征的情况下,学习像暗黑破坏神这样的策略是不可行的。仅从视频输入中学习将极其困难,如果不是使用今天的计算机几乎不可能。 - ahans

18

看起来这个项目的核心是探索ANN的可能性,所以我建议选择一个不需要处理图像的游戏(从其他人在这里的回答中得知,在实时游戏中进行图像处理似乎是非常困难的任务)。你可以使用Starcraft API构建你的机器人,他们为你提供了所有相关的游戏状态。

http://code.google.com/p/bwapi/


2
作为第一步,您可以查看连续帧之间的差异。您必须区分背景和实际怪物精灵。我猜这个世界可能也包含动画。为了找到这些动画,我会让角色四处移动并将所有随着世界移动的东西收集到一个大的背景图像/动画中。
您可以使用相关性(使用FFT)来检测和识别敌人。但是,如果动画重复像素完全相同,则仅查看几个像素值将更快。您的主要任务是编写一个健壮的系统,该系统将识别新对象何时出现在屏幕上,并逐渐将所有精灵帧的帧添加到数据库中。可能还需要为武器效果构建模型。这些应该被减去,以避免混淆对手数据库。

2
熟悉《暗黑破坏神II》游戏的我可以说,它使用256种颜色(除非某些模式使用高色或真彩色)。它还大量使用精灵来显示不同的对象。如果您能够提取一些精灵(甚至从屏幕截图中提取),您可以训练您的工具根据精灵识别对象(例如,掉落的“小治疗药水”始终看起来相同)。然而,如果我深入研究《暗黑破坏神II》的特定内容,也会出现更多问题。祝好运! - Ivaylo Slavov

1
假设您随时可以从所有可能的“移动”中生成一组“结果”(可能涉及概率),并且游戏中存在某种一致性(例如,您可以一遍又一遍地玩第X级),则可以从具有随机权重的N个神经网络开始,并让它们按以下方式玩游戏:
1)对于每个可能的“移动”,生成可能的“结果”列表(带有相关概率) 2)对于每个结果,使用您的神经网络确定“结果”的相关价值(得分)(例如,在-1和1之间的数字,1是最佳结果,-1是最差结果) 3)选择导致最高概率*分数的“移动” 4)如果移动导致“胜利”或“失败”,则停止,否则返回步骤1。
在一定时间后(或“获胜”/“失败”),评估神经网络与“目标”的接近程度(这可能涉及一些领域知识)。然后丢弃距离目标最远的50%(或其他百分比)的NN,交叉/突变前50%,然后再次运行新的NN集。继续运行,直到出现令人满意的NN。

啊,加入了GA,有趣。不幸的是,由于我要让网络实际发送按键/鼠标移动作为操作,所以我需要每个网络一个物理计算机 >.< 另一个问题是环境的状态空间不是离散的(技术上来说是,但非常细微)。例如,想象与鼠标点击相关的可能结果:网络控制下的角色可能移动或攻击,但敌人也可能移动,并且从像阴影和天气效果之类的东西中会出现像素级别的环境差异。 - zergylord
从我的角度来看,神经网络能做的事情有限。最多只能用作可学习启发式函数的离散状态空间概念。为了纳入敌人的变化性,您可能需要使用其他启发式方法,然后可以使用它来创建每个移动的可能结果状态集及其相关概率。此外,只要存在初始和最终配置的静态概念,您就可以一次运行一个神经网络。 - tstramer

1

我认为你最好的选择是一个涉及几个网络的复杂架构:例如,一个用于识别和响应物品,一个用于商店,一个用于战斗(也许在这里你需要一个用于敌人识别,一个用于攻击),等等。

然后尝试考虑最简单的《暗黑破坏神II》游戏玩法,可能是一个野蛮人。一开始保持简单,比如只有第一幕,只有第一个区域。

然后我想有价值的“目标”可能是敌人物体的消失和生命条的减少(得分相反)。

一旦你处理好了这些单独的“更简单”的任务,你可以使用一个“主”ANN来决定激活哪个子ANN。

关于训练,我只看到三个选项:你可以使用上面描述的进化方法,但是你需要手动选择“赢家”,除非你为此编写一个完整的单独程序。你可以让网络“观察”某人玩游戏。在这里,它们将学习模仿玩家或一组玩家的风格。网络尝试预测玩家的下一步行动,如果猜对了就会得到强化,等等。如果你真的得到了想要的ANN,这可以通过视频游戏来完成,不需要实际的现场游戏。最后,你可以让网络玩游戏,以敌人死亡、升级、恢复健康等作为正向强化,以玩家死亡、失去生命值等作为负向强化。但是,即使是一个简单的网络,也需要成千上万的具体训练步骤才能学习甚至简单的任务,因此你需要很多耐心。
总之,你的项目非常雄心勃勃。但是我认为“理论上可以做到”,只要有足够的时间。
希望这有所帮助,祝你好运!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接