如何训练一个人工神经网络玩暗黑破坏神2使用视觉输入?

我目前正在尝试让一个 ANN 玩视频游戏,我希望得到一些来自这里的美好社区的帮助。

我选了暗黑2。因此,游戏是实时的,从一个等距的角度来看,玩家控制一个单一的化身,摄像机的中心。

具体来说,任务是让你的角色获得 x 经验值,而不是让它的生命值降到0,在这里经验值是通过杀死怪物获得的。下面是游戏的一个例子:

here

现在,既然我希望网络仅仅根据它从屏幕上的像素获得的信息来运行,它必须学习一个非常丰富的表示以便有效地玩,因为这可能需要它知道(至少是隐含地)如何将游戏世界划分为对象以及如何与它们交互。

所有这些信息都必须以某种方式传到网上。我怎么也想不出该怎么训练它。我唯一的想法就是用一个独立的程序从屏幕上直观地提取出游戏中天生的好/坏信息(比如健康、黄金、经验) ,然后在一个强化学习过程中使用这些信息。我认为这将是 一部分的答案,但我不认为这将是足够的; 只是有太多层次的抽象从原始的视觉输入到目标导向的行为,这样有限的反馈训练一个网在我的一生。

那么,我的问题是: 你还能想到其他什么方法来训练一张网来至少完成这项任务的一部分呢?最好不要做成千上万个带标签的例子。

我正在寻找一些其他的强化学习和/或任何无监督的方法来提取这种设置中的有用信息。或者一个有监督的算法,如果你能想到一种方法,不需要手动标记就可以从游戏世界中获得标记数据。

更新(04/27/12) :

奇怪的是,我还在研究这个,而且似乎有进展。使神经网络控制器工作的最大秘诀是使用最先进的神经网络结构来完成任务。因此,我一直在使用一个由分解的 有条件限制的玻尔兹曼机器组成的 深度信仰网,我在无人监督的情况下(在我玩游戏的视频中)训练它,然后再用 时间差反向传播进行微调(即用标准的前馈神经网络进行强化学习)。

尽管如此,仍然在寻找更有价值的输入,特别是在实时动作选择问题以及如何为人工神经网络处理彩色图像编码方面

更新(10/21/15) :

我刚想起来我以前问过这个问题,我想我应该提一下,这不再是一个疯狂的想法了。自从我上次更新以来,DeepMind 公布了他们的自然 关于从视觉输入中获取神经网络来玩雅达利游戏的论文。事实上,唯一阻止我使用他们的架构来玩,一个有限的子集,暗黑破坏神2是缺乏访问底层的游戏引擎。呈现到屏幕,然后将其重定向到网络,这对于在合理的时间内进行训练来说实在是太慢了。因此,我们可能不会看到这种类型的机器人玩暗黑破坏神2任何时候很快,但只是因为它会发挥的东西,要么开源或与 API 访问的呈现目标。(也许是地震?)

39194 次浏览

你所追求的问题在你所定义的方式上是难以解决的。认为神经网络能够“神奇地”学会一个问题的丰富表示,这通常是错误的。在决定人工神经网络是否是完成任务的正确工具时,需要记住的一个好事实是,它是一种插值方法。思考一下,你是否可以把你的问题定义为找到一个函数的近似值,在这个函数中你有很多点,并且有很多时间来设计和训练网络。

你提出的问题没有通过这个测试。游戏控制不是屏幕上的图像的功能。玩家必须在内存中保存大量的信息。举个简单的例子,每次你在游戏中进入一家商店,屏幕看起来都是一样的。然而,你买什么取决于具体情况。不管网络有多复杂,如果屏幕像素是它的输入,它总是在进入存储时执行相同的操作。

此外,还存在规模问题。你提出的任务实在是太复杂了,无法在合理的时间内学会。你应该看看 Aigamedev.com的游戏 AI 是如何工作的。人工神经网络已经成功地应用于一些游戏中,但是应用范围非常有限。游戏 AI 很难开发,而且开发成本很高。如果有一种构建功能性神经网络的通用方法,该行业很可能会抓住它。我建议您从简单得多的例子开始,比如井字游戏。

假设在任何时候,你可以从一系列可能的“行动”中产生一系列“结果”(可能涉及概率) ,并且在游戏中有一些一致性的概念(例如,你可以一遍又一遍地玩 X 级) ,你可以从 N 个随机权重的神经网络开始,让每个神经网络以下面的方式玩游戏:

1)对于每一个可能的“移动”,生成一个可能的“结果”列表(带有相关的概率) 2)对于每个结果,使用你的神经网络来确定一个相关的“价值”(得分)的“结果”(例如一个数字之间的 -1和1,1是最好的可能的结果,-1是最坏的) 3)选择“移动”,得到最高的 prob * 分数 4)如果这个动作导致了“赢”或者“输”,停止,否则回到第一步。

经过一段时间(或者“赢”/“输”) ,评估神经网络离“目标”有多近(这可能涉及一些领域知识)。然后抛弃离目标最远的50% (或其他一些百分比)的神经网络,对前50% 进行交叉/突变,并再次运行新的神经网络集合。继续运行,直到一个满意的神经网络出来。

我可以看到你担心如何训练人工神经网络,但 这个项目隐藏了一个复杂性,你可能不知道。通过 图像处理对电脑游戏中的物体/字符进行识别是一项非常具有挑战性的任务(FPS 和 RPG 游戏中不说 太疯狂了)。我不怀疑你的技能,我也不是说这是不可能的,但是你可以很容易地花费10倍的时间来识别东西比实现人工神经网络本身(假设你已经有经验与 数字图像处理数字图像处理技术)。

我认为你的想法很 很有趣也很 野心勃勃。现在你最好重新考虑一下。我感觉这个项目是你为大学计划的,所以如果工作的重点真的是人工神经网络,你可能应该选择另一个游戏,一些更简单的东西。

我记得不久前有人来找 不同但有点相似的项目的技巧。值得一查。

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

一种方法 用于实现僵尸程序 访问游戏客户端的内存来查找相关信息,比如字符在屏幕上的位置和它的健康状况。读取计算机内存是微不足道的,但是精确计算出在内存中要查找的位置却是不容易的。像 作弊引擎这样的内存扫描仪对此非常有帮助。

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

在这个答案中,我简要地描述了2种方法来完成你想通过图像处理。如果你对它们感兴趣,你可以在 开发网络游戏(第6章)上找到更多关于它们的资料,这是一本关于这个主题的优秀书籍。

这个项目的核心似乎是探索人工神经网络的可能性,所以我建议选择一个不需要处理图像处理的游戏(从其他人的回答来看,这似乎是一个实时游戏中的 真的难题)。你可以使用星际 API 来建立你的机器人,他们给你访问所有相关的游戏状态。

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

作为第一步,您可以看看连续帧的差异。你必须区分背景和真正的怪物精灵。我想这个世界也可能包含动画。为了找到这些,我会让角色四处移动,并收集所有随着世界移动的东西,形成一个大的背景图像/动画。

你可以检测和识别敌人的相关性(使用 FFT)。然而,如果动画重复像素精确它将更快地只看几个像素值。您的主要任务将是编写一个健壮的系统,将确定当一个新的对象出现在屏幕上,并将逐步所有帧的精灵帧到一个数据库。也许你还得建造武器效果的模型。这些可以减去,以便他们不会杂乱你的对手数据库。

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

然后试着想想最简单的暗黑破坏神 II 游戏,可能是一个野蛮人。然后一开始保持简单,就像第一幕一样,仅仅是第一个区域。

那么我猜有价值的“进球”就是敌人物体的消失,以及生命值的减少(得分相反)。

一旦你完成了这些单独的、“更简单”的任务,你就可以使用“主”神经网络来决定激活哪个子神经网络。

至于训练,我只看到三种选择: 你可以使用上面描述的进化方法,但是你需要手动选择“赢家”,除非你为此编写一个完全独立的程序。你可以让电视台“观看”某人的比赛。在这里,他们将学习模仿一个球员或一组球员的风格。网络试图预测玩家的下一个动作,得到一个正确的猜测,等等。如果你真的得到人工神经网络,你想这可以与视频游戏完成,没有实际需要的现场游戏。最后你可以让网络玩游戏,让敌人死亡、升级、恢复生命等作为正强化和玩家死亡、失去生命等作为负强化。但是看到即使是一个简单的网络也需要成千上万个具体的训练步骤来学习即使是简单的任务,您将需要很多耐心来完成这个任务。

总而言之,你的项目是非常雄心勃勃的。但我个人认为,只要给予足够的时间,“理论上”是可以做到的。

希望对你有所帮助,祝你好运!

更新2018-07-26: 就是这样!我们现在正在接近这种游戏可以解决的临界点!使用 OpenAI 和基于 DotA2的游戏,一个团队可以制作一个可以 在5对5的比赛中击败半职业化玩家的 AI。如果你知道 DotA2,你就会知道这个游戏在机械方面和暗黑破坏神很相似,但是有人会说这个游戏更复杂,因为它是团队游戏。

正如预期的那样,这得益于深度学习强化学习的最新进展,以及使用像 OpenAI 这样的开放游戏框架,这种开放游戏框架简化了人工智能的开发,因为你可以得到一个简洁的 API,还因为你可以加快游戏的速度(人工智能相当于180年来每天都在与自己对抗!).

2018年8月5日(10天后!)它计划让这个 AI 与顶级 DotA2玩家竞争。如果这成功了,预计将会有一场大革命,也许不会像围棋游戏的解决方案那样多媒体化,但它仍将是游戏人工智能的一个巨大里程碑!

更新2017-01: 自 AlphaGo 取得成功以来,这个领域发展得非常迅速,几乎每个月都有新的框架来促进游戏机器学习算法的开发。以下是我最近发现的一些问题:

  • OpenAI 的宇宙 : 一个到 使用机器学习几乎玩任何游戏的平台。API 是用 Python 编写的,它在 VNC 远程桌面环境中运行游戏,因此它可以捕获任何游戏的图像!你也许可以通过机器学习算法使用宇宙来玩暗黑破坏神 II!
  • OpenAI 的 Gym : 与 Universe 类似,但是专门针对强化学习算法(所以它是 AlphaGo 使用的框架的一种概括,但是适用于更多的游戏)。关于 Udemy 的课程涵盖了机器学习在诸如“突破”或“使用 OpenAI 健身房的毁灭战士”等游戏中的应用。
  • 火炬手: 火把(机器学习框架)和星际争霸: 母巢战争之间的桥梁。
  • PyGTA5 : 一个仅使用屏幕截图(大量 在线视频)在 GTA5中建造自动驾驶汽车的项目。

非常激动人心的时刻!

重要更新(2016-06) : 正如 OP 指出的那样,这种仅使用视觉输入来训练人工网络玩游戏的问题现在正在由几个严肃的机构解决,具有相当有希望的结果,如 DeepMind 深度学习网络(DQN)

现在,如果你想接受下一个级别的挑战,你可以使用各种 人工智能视觉游戏开发平台之一,如 ViZDoom,一个高度优化的平台(7000帧/秒)来训练网络播放毁灭战士,只使用视觉输入:

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

结果是相当惊人的,看看他们网页上的视频教得不错(在 Python 中)在这里!

Quake 3 Arena 也有一个类似的项目,称为 探员,它也提供了对底层游戏数据的简单 API 访问,但是你可以放弃它,只使用屏幕截图和 API 来控制你的代理。

如果我们只使用屏幕截图,为什么这样一个平台是有用的?即使你不能访问底层的游戏数据,这样的平台也能提供:

  • 高性能 游戏的实现(您可以用更少的时间生成更多的数据/游戏/学习代,这样您的学习算法可以收敛得更快!).
  • 一个简单的和 响应式空气污染指数来控制你的代理(即,如果你试图使用人工输入来控制游戏,你的一些命令可能会丢失,所以你也会处理不可靠的输出...)。
  • 自定义场景的简易设置。
  • 可定制的渲染 (可用于“简化”图像以方便处理)
  • 同步(“ turn-by-turn”)播放 (所以一开始不需要算法实时工作,这是一个巨大的复杂性降低)。
  • 额外的便利特性,比如跨平台兼容性,回溯兼容性(当有新的游戏更新时,你不会冒险让你的机器人不再使用游戏)等等。

总而言之,这些平台的伟大之处在于,您必须处理 它们缓解了以前的许多技术问题(如何操作游戏输入,如何设置场景等) ,以便 你只需要处理学习算法本身。

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


描述仅依靠视觉输入开发人工智能的技术问题:

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

上面指出的第一个问题是 游戏状态的代表的问题: 你不能仅仅用一张图片来表示完整的状态,你需要维护某种 记忆(健康状态,但是也要维护装备齐全的物品和可以使用的物品,任务和目标等等)。要获取这些信息,你有两种方法: 要么直接访问游戏数据,这是最可靠和容易的; 要么你可以通过实现一些简单的程序(开放库存,截屏,提取数据)来创建这些信息的抽象表示。当然,从屏幕截图中提取数据要么需要加入一些监督过程(完全定义) ,要么需要无监督过程(通过一种机器学习算法,但这样会大大增加复杂性... ...)。对于非监督式学习,你将需要使用一种相当新的算法,称为结构化学习算法(它学习数据的结构,而不是如何分类或预测值)。一个这样的算法是递归神经网络(不要和递归神经网络混淆)

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

此外,还需要有一个 自主代理人,其中动态生成了 目标。您可以尝试的一个众所周知的体系结构是 BDI 代理,但是您可能必须对它进行调整,以使该体系结构能够在您的实际情况中工作。作为一种替代方案,还有递归 Petri 网,你可以将它与各种不同的 Petri 网结合起来,从而达到你想要的效果,因为它是一个研究得很好的灵活的框架,具有很好的形式化和证明过程。

最后,即使你做了以上所有的事情,你也需要找到一种方法来模拟 加速的速度中的游戏(使用视频可能很好,但问题是你的算法只能在没有控制的情况下观看,并且能够自己尝试对于学习来说是非常重要的)。事实上,众所周知,目前最先进的算法需要花费更多的时间来学习人类可以学习的东西(强化学习更是如此) ,因此,如果不能加快这个过程(即,如果你不能加快游戏时间) ,你的算法甚至不会在一个单一的生命周期内收敛... ..。

总而言之,您希望在 当前最先进的算法的极限(也许有点超出)中实现的目标。我认为这可能是可能的,但即使它是,你会花很多时间,因为这不是一个理论问题,而是一个你正在接近的 实际问题,因此你需要实现和 结合了许多不同的人工智能方法来解决它。

几十年的研究与整个团队的工作可能是不够的,所以如果你是独自一人和工作的兼职(因为你可能有一份工作为生) ,你可能会花费一生的时间没有达到任何附近的工作解决方案。

所以我在这里最重要的建议是,你的 降低你的期望值,尽量减少复杂性的问题,使用所有的信息,你可以,并尽可能避免依赖于屏幕截图(即,尝试挂钩直接进入游戏,寻找 DLL 注入) ,并简化了一些问题,实施监督程序,不要让你的算法学习一切(比如,现在尽可能放弃图像处理,依赖内部游戏信息,以后如果你的算法运行良好,你可以用图像处理代替人工智能程序的某些部分,从而逐步实现你的全部目标,例如,如果你能让某些东西运行良好,你可以尝试复杂化你的问题,通过截图上的非监督式学习算法代替监督程序和记忆游戏数据).

祝你好运,如果成功了,一定要发表一篇文章,你一定会因为解决这样一个困难的实际问题而出名!