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


138

我目前正在尝试让ANN玩电子游戏,并且希望能从这里的美好社区得到一些帮助。

我已经选择了《暗黑破坏神2》,因此游戏是实时的,并且是从等轴测的角度来看,玩家可以控制相机居中放置的单个化身。

具体来说,任务是获得角色x经验值,而角色的生命值不会降低到0,而经验值是通过杀死怪物获得的。这是一个玩法示例:

这里

现在,由于我希望网络仅基于它从屏幕上的像素获得的信息进行操作,因此它必须学习非常丰富的表示形式才能有效地进行游戏,因为这大概需要(至少是隐式地)知道如何将游戏世界分为对象以及如何与它们交互。

所有这些信息都必须以某种方式传到网上。我一辈子都想不起来如何训练这个东西。我唯一的想法是拥有一个单独的程序,从屏幕上直观地从游戏中提取某些本来是好事/坏事(例如健康,黄金,经验),然后在强化学习过程中使用该统计信息。我认为这将是答案的一部分,但我认为这还不够。从原始的视觉输入到面向目标的行为的抽象层次太多,以至于有限的反馈无法在我的一生中训练网络。

因此,我的问题是:您可以想到哪些其他方法来训练网络至少完成此任务的一部分?最好不要制作成千上万个带有标记的示例。

只是提供一些指导:我正在寻找增强学习的其他来源和/或在这种情况下提取有用信息的任何无监督方法。或采用监督算法,如果您可以想到一种无需手动标记就可以从游戏世界中获取标记数据的方法。

更新(04/27/12):

奇怪的是,我仍在努力,似乎正在取得进展。使ANN控制器正常工作的最大秘密是使用适合该任务的最先进的ANN架构。因此,我一直在使用由因式条件受限的玻尔兹曼机器组成的深度置信网,该机器以无监督的方式(在我玩游戏的视频中)进行了无监督的训练,然后通过时差反向传播(即使用标准的强化学习)进行了微调。前馈ANN)。

仍然在寻找更有价值的输入,特别是在实时选择动作以及如何为ANN处理编码彩色图像方面:-)

更新(10/21/15):

只是想起了我曾经回问过这个问题,并以为我应该提到这不再是一个疯狂的主意。自从我上次更新以来,DeepMind发表了他们的自然论文,内容涉及通过视觉输入让神经网络玩Atari游戏。确实,阻止我使用他们的体系结构玩《暗黑破坏神2》的一个有限子集的唯一原因是缺乏对基础游戏引擎的访问。渲染到屏幕然后将其重定向到网络实在太慢了,无法在合理的时间内进行训练。因此,我们可能不会很快看到这种机器人在玩Diablo 2,只是因为它会玩开源或具有对渲染目标的API访问权限的东西。(也许是地震?)



本文中的驾驶问题和游戏中的驾驶问题的最大区别在于,在驾驶问题中,视觉输入是足够完整的状态表示:如果右侧有障碍物-向左转,如果左侧有障碍物-转向对。但是,在游戏中,您通常必须根据屏幕上未显示的内容进行决策。每当您进入商店时,它看起来都一样,但是您需要购买其他商品。
唐·雷巴

1
为了使我回忆起来最好,暗黑破坏神2使用了容易提取的精灵表。将对象(玩家,敌人等)绑定到关联的精灵列表应该相当简单。它不能解决对象相互遮挡的问题,但这是一个开始。
瑞安·詹金斯

@zergylord如果您能说出要坚定地遵守a)暗黑破坏神2和b)使用绘制到屏幕上的像素作为唯一输入源的标准,这将很有帮助。如果您想让自己更轻松一些,我想您将不得不放松其中一个(或两个),您愿意吗?
Stompchicken 2011年

Answers:


53

我可以看到您担心如何训练ANN,但是该项目隐藏了您可能不会意识到的复杂性。通过图像处理在计算机游戏中识别对象/字符是一项极富挑战性的任务(不要说对FPS和RPG游戏而言是疯狂的)。我毫不怀疑您的技能,也不是说它无法完成,但是与实现ANN本身相比,您可以轻松地花费10倍以上的时间来识别事物(假设您已经具有数字图像处理技术的经验))。

我认为您的想法很有趣,而且也很有野心。此时,您可能需要重新考虑。我感觉到这个项目是您正在为大学计划的,因此,如果工作的重点是真正的人工神经网络,那么您可能应该选择其他游戏,这会更简单。

我记得不久前有人来寻找有关另一个不同项目的提示。值得一试。

另一方面,如果您接受建议,可能会有更好/更简便的方法来识别游戏中的物体。但首先,让我们将此项目称为您想要的项目:一个智能机器人

一种实现机器人的方法访问游戏客户端的内存以查找相关信息,例如角色在屏幕上的位置及其健康状况。读取计算机内存很简单,但要弄清楚要在内存中查找的位置却不是很容易。诸如Cheat Engine之类的内存扫描仪对此很有帮助。

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

在此答案中,我简要介绍了两种通过图像处理来完成所需操作的方法。如果您对它们感兴趣,可以在利用在线游戏(第6章)中找到关于它们的更多信息,这是一本关于该主题的极好的书。


42

更新2018-07-26:就是这样!我们现在正在接近解决这类游戏的地步!使用OpenAI并基于游戏DotA 2,团队可以制作出可以在5v5游戏中击败半职业游戏玩家的AI 。如果您了解《 DotA 2》,您会知道这款游戏在机制上与《暗黑破坏神》类似的游戏非常相似,但有人会说,由于团队合作,它甚至更加复杂。

不出所料,这要归功于强化学习和深度学习的最新进展,并使用了OpenAI之类的开放游戏框架,这使AI的开发变得轻松,因为您拥有了一个精巧的API并且还可以加速游戏(相当于每天有180年的游戏历史!)。

在2018年8月5日(10天之内!),计划将此AI与顶级DotA 2游戏玩家对抗。如果能够解决问题,那将是一场巨大的革命,也许不会像Go游戏的解决方案那样媒介化,但是对于AI游戏来说,这将是一个巨大的里程碑!

2017年1月更新:自AlphaGo成功以来,该领域的发展非常迅速,并且几乎每个月都有新的框架来促进游戏中机器学习算法的开发。这是我发现的最新列表:

  • OpenAI的Universe:一个几乎可以使用机器学习玩任何游戏的平台。该API使用Python,可以在VNC远程桌面环境下运行游戏,因此可以捕获任何游戏的图像!您可能可以使用Universe通过机器学习算法来玩Diablo II!
  • OpenAI的Gym:与Universe类似,但专门针对强化学习算法(因此,它是AlphaGo使用的框架的一种概括,但适用于更多游戏)。Udemy上一门课程,内容涉及使用OpenAI Gym将机器学习应用于诸如Breakout或Doom的游戏。
  • TorchCraftTorch(机器学习框架)与StarCraft:育雏战争之间的桥梁。
  • pyGTA5:一个仅使用屏幕截图(在线有大量视频)在GTA5中构建自动驾驶汽车的项目。

非常激动人心的时刻!

重要更新(2016-06):正如OP所指出的那样,一些严肃的机构正在解决这个仅靠视觉输入来训练人工网络玩游戏的问题,其结果令人鼓舞,例如DeepMind Deep-Qlearning-Network(DQN) )

现在,如果您想接受更高级别的挑战,则可以使用各种AI视觉游戏开发平台之一,例如ViZDoom(高度优化的平台(7000 fps)),以仅使用视觉输入来训练网络播放《毁灭战士》。 :

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

结果令人惊讶,请在其网页上观看视频以及此处的精美教程(使用Python)!

Quake 3 Arena还有一个类似的项目叫做Quagents,它还提供了对底层游戏数据的轻松API访问,但是您可以将其抓取,仅使用屏幕截图和API即可控制您的代理。

如果仅使用屏幕截图,为什么这样的平台有用?即使您不访问基础游戏数据,该平台也可以提供:

  • 高性能的游戏实现(您可以用更少的时间生成更多的数据/游戏/学习信息,从而使学习算法可以更快地收敛!)。
  • 一个简单且响应迅速的API来控制您的代理(即,如果您尝试使用人工输入来控制游戏,则某些命令可能会丢失,因此您还将处理输出的不可靠性...)。
  • 易于设置自定义方案
  • 可定制的渲染(有助于“简化”您易于处理的图像)
  • 同步播放(因此,您一开始就不需要算法实时工作,这可以大大降低复杂性)。
  • 其他便利功能,例如跨平台兼容性,追溯兼容性(在新游戏更新后,您不必担心机器人不再与游戏一起使用)等。

总而言之,这些平台的妙处在于它们减轻了您不得不处理的许多先前技术问题(如何操纵游戏输入,如何设置场景等),因此您只需要处理学习算法即可。本身。

所以现在,开始工作,让我们成为有史以来最好的AI视觉机器人;)


旧帖子描述了仅依靠视觉输入来开发AI的技术问题:

与上面的一些同事相反,我认为这个问题不是很难解决的。但这肯定是一件很难的事!

上面指出的第一个问题是游戏状态表示:您不能仅用单个图像来表示完整状态,您需要保持某种记忆(健康,还有装备,可用物品,任务和目标等)。要获取此类信息,您有两种方法:一种是直接访问游戏数据,这是最可靠,最容易的;或者,您也可以通过执行一些简单的步骤(打开清单,截屏,提取数据)来创建这些信息的抽象表示。当然,从屏幕快照中提取数据要么让您进行某种监督(完全定义),要么不受监督(通过机器学习算法,但是这样会大大增加复杂性……)。对于无监督的机器学习,您将需要使用一种称为结构学习算法的最新算法(该算法学习数据的结构,而不是如何对数据进行分类或预测值)。http://techtalks.tv/talks/54422/

然后,另一个问题是,即使已经获取了所需的所有数据,游戏也只能部分观察到。因此,您需要注入一个抽象的世界模型,并从游戏中获取经过处理的信息,例如化身的位置,以及任务物品,目标和屏幕外敌人的位置。您可能为此而研究了Vermaak 2003的混合粒子过滤器。

另外,您需要有一个自治代理,可以动态生成目标。您可以尝试使用一种著名的体系结构,即BDI代理,但是您可能必须对其进行调整才能使该体系结构在实际情况下起作用。作为替代方案,还有递归Petri网,您可以将其与Petri网的各种变体结合以实现所需的功能,因为它是一个经过充分研究和灵活的框架,具有大量的形式化和证明程序。

最后,即使您进行了上述所有操作,您仍需要找到一种以加速速度模拟游戏的方法(使用视频可能会不错,但问题是您的算法只会在没有控制的情况下进行旁观,并且能够自己尝试对学习非常重要)。确实,众所周知,当前的最新算法需要花费更多的时间来学习人类可以学习的相同东西(强化学习时甚至更多),因此如果不能加快这一过程(也就是说,如果您不能加快游戏​​时间),您的算法甚至不会在一个生命周期内收敛...

总而言之,您要在此处达到的目标是当前技术水平的极限(可能会超出极限)。我认为这是可能的,但是即使是这样,您也将花费大量时间,因为这不是理论问题,而是您在此处要解决的实际问题,因此您需要实现和组合很多以解决不同的AI方法

由整个团队进行数十年的研究可能是不够的,因此,如果您独自一人并兼职工作(因为您可能有一份谋生的工作),您可能会花一辈子的时间而无法接近一个可行的解决方案。

因此,我在这里最重要的建议是降低您的期望,并尝试降低复杂性通过使用所有可能的信息来解决问题,并尽可能避免依赖屏幕截图(即,尝试直接挂接到游戏中,寻找DLL注入),并通过实施监督程序来简化某些问题,请不要让您算法学习所有知识(即,尽可能多地放弃图像处理并依靠内部游戏信息,然后,如果算法运行良好,则可以用图像处理替换AI程序的某些部分,从而逐步实现您的完整目标,例如,如果您可以使某些功能正常运行,则可以尝试使问题复杂化,并使用屏幕快照上的无监督机器学习算法替换有监督程序和内存游戏数据。

祝您好运,而且如果可行的话,请确保发表一篇文章,您肯定会因解决这样一个棘手的实际问题而闻名!


27

您所追求的问题以您定义问题的方式是棘手的。认为神经网络会“神奇地”学习到问题的丰富表现通常是一个错误。在确定ANN是否是正确的任务工具时,要记住的一个好事实是它是一种插值方法。想一想,是否可以将问题构想为找到一个函数的近似值,在这个函数中您有很多要点,因此需要花费大量时间来设计网络和对其进行训练。

您提出的问题未通过此测试。游戏控制不是屏幕上图像的功能。播放器必须在内存中保留很多信息。举一个简单的例子,通常每次您进入游戏商店时,屏幕看起来都是一样的。但是,您购买的物品取决于情况。不管网络多么复杂,如果输入屏幕像素,它在进入商店时都将始终执行相同的操作。

此外,还有规模问题。您提出的任务太复杂了,无法在任何合理的时间内学习。您应该访问aigamedev.com了解游戏AI的工作原理。人工神经网络已在某些游戏中成功使用,但方式非常有限。游戏AI很难开发,而且开发成本通常很高。如果有一种构建功能神经网络的通用方法,那么业界很可能会抓住它。我建议您从很多简单的示例开始,例如井字游戏。


很公平。您几乎可以将类似于网络的任何事物都称为ANN,但这几乎不会引起实质性讨论。:)
唐·雷巴

嘿,我应该更深入地解释我的动机。我知道有更好的方法来制作游戏AI,但是我这样做是为了提高我一直在升级的ANN模拟器的极限。请参阅:stanford.edu/group/pdplab/pdphandbook
zergylord 2011年

1
无论如何,唐·雷巴(Don Reba)都是对的,我也不认为在没有大量先验知识并且没有提取强化学习方法所基于的有用功能的情况下,学习类似暗黑破坏神的策略是不可行的。使用当今的计算机,即使不是不可能,仅从视频输入中学习也是非常困难的。
阿汉斯2011年

18

似乎该项目的核心是探索ANN的可能性,因此我建议选择一个无需处理图像处理的游戏(根据此处其他人的回答,这似乎是一个非常困难的任务)实时游戏)。您可以使用Starcraft API来构建您的机器人,它们可以让您访问所有相关的游戏状态。

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


2

第一步,您可能要看一下连续帧的差异。您必须区分背景精灵和实际怪物精灵。我猜世界可能还包含动画。为了找到那些人,我将让角色四处走动,并将与世界一起移动的所有东西收集到一个大的背景图像/动画中。

您可以检测和识别具有相关性的敌人(使用FFT)。但是,如果动画重复精确像素,仅查看几个像素值会更快。您的主要任务是编写一个健壮的系统,该系统将识别何时新对象出现在屏幕上,并将sprite框架中的所有框架逐渐移至数据库。也许您还必须为武器效果建立模型。可以减去这些,以免使您的对手数据库混乱。


2
熟悉暗黑破坏神II游戏,我可以说它使用256种颜色(除非某些模式使用高色或真彩色)。它还大量使用了精灵来显示不同的对象。如果您能够提取一些精灵(甚至从屏幕截图中提取),则可以训练您的工具以基于该精灵识别对象(例如,掉落的“次要治疗药水”看上去总是一样)。但是,如果我深入研究《暗黑破坏神II》的具体内容,也会出现更多问题。祝您好运
Ivaylo Slavov

1

好吧,假设您可以随时从一组所有可能的“动作”中生成一组“结果”(可能涉及概率),并且游戏中存在一些一致性的概念(例如,您可以一遍又一遍地玩X级再次),您可以从具有随机权重的N个神经网络开始,并让每个神经网络通过以下方式玩游戏:

1)对于每个可能的“移动”,生成一个可能的“结果”列表(以及相关的概率)2)对于每个结果,使用您的神经网络来确定“结果”的相关“价值”(得分)(例如-1和1之间的数字,1表示可能的最佳结果,-1表示最差的结果)3)选择导致最高概率*得分的“移动” 4)如果此举导致“获胜”或“失败”,停止,否则返回步骤1。

经过一定时间(或“输” /“输”)后,评估神经网络与“目标”的距离(可能涉及某些领域知识)。然后丢弃距离目标最远的50%(或其他百分比)的NN,对前50%的NN进行交叉/变异,然后再次运行新的NN。继续运行直到满意的NN出现为止。


嗯,将GA加入其中,很有趣。不幸的是,由于我实际上要让网络发送按键/鼠标动作作为动作,因此每个网络需要一台物理计算机>。<另一个问题是环境的状态空间不是离散的(从技术上讲,它是离散的,但是非常细的颗粒)。例如,想象一下与鼠标单击有关的可能结果:网络控制下的角色可能移动或攻击,但敌人也可能移动,并且环境中的阴影和天气影响等因素在像素方面存在差异。
zergylord 2011年

从我的角度来看,神经网络只能做很多事情。似乎充其量可以用作离散状态空间的某些概念的可学习启发式函数。为了合并敌人的可变性,您可能必须使用其他启发式方法,然后可以使用该方法来为每步移动创建一组可能的结果状态以及相关的概率。另外,只要有一个静态的初始和最终配置概念,就可以一次运行每个神经网络。
tstramer

1

我认为您最好的选择是一个复杂的体系结构,该体系结构包含几个/可能的网络:即一个识别和响应物品,一个用于商店,一个用于战斗(也许在这里您需要一个用于识别敌人,一个用于攻击),等等。 。

然后尝试考虑最简单的暗黑破坏神II游戏,可能是蛮族。然后,首先要使其简单,就像第一幕一样。

然后,我认为有价值的“目标”将是敌人物体的消失,以及健康条的减少(得分为反)。

一旦完成了这些单独的“简单”任务,就可以使用“主” ANN来决定要激活哪个子ANN。

至于培训,我只看到三个选项:您可以使用上述进化方法,但是您需要手动选择“优胜者”,除非为此编写了一个完整的单独程序。您可以让网络“观看”某人玩。他们将在这里学习模仿一个或一组球员的风格。网络会尝试预测玩家的下一个动作,为正确的猜测而强化,等等。如果您实际获得了ANN,则可以通过视频游戏来完成,而无需实际的实时游戏。最终,您可以让网络玩游戏,将敌人的死亡,等级提升,恢复的健康等作为正强化,而使玩家死亡,失去健康等作为负强化。但是,即使看到简单的网络也需要数千个具体的培训步骤才能学习甚至简单的任务,

总而言之,您的项目非常雄心勃勃。但我认为,只要有足够的时间,就可以“理论上做到”。

希望对您有帮助,祝您好运!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.