143

我目前正在尝试让 ANN 玩视频游戏,我希望能从这里的精彩社区获得一些帮助。

我已经选择了暗黑破坏神 2。因此,游戏是实时的,并且从等距的角度来看,玩家控制一个以摄像机为中心的化身。

具体来说,任务是让你的角色 x 经验值而不使其生命值降至 0,其中经验值是通过杀死怪物获得的。以下是游戏玩法的示例:

这里

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

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

所以,我的问题是:你还能想出什么其他方法来训练一个网络来完成这项任务的至少一部分?最好不要制作数千个带标签的示例。

只是为了更多的方向:我正在寻找其他一些强化学习来源和/或任何无监督方法来在此设置中提取有用信息。或者,如果您可以想出一种无需手动标记即可从游戏世界中获取标记数据的方法,则可以使用监督算法。

更新(04/27/12):

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

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

更新(15 年 10 月 21 日):

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

4

7 回答 7

56

我可以看到您担心如何训练 ANN,但是这个项目隐藏了您可能不知道的复杂性。通过图像处理在计算机游戏上识别对象/字符是一项极具挑战性的任务(对于 FPS 和 RPG 游戏来说不是很疯狂)。我不怀疑你的技能,我也不是说它不能完成,但是你可以很容易地花 10 倍以上的时间来识别东西而不是实现 ANN 本身(假设你已经有数字图像处理技术的经验)。

我觉得你的想法很有趣,也很有野心。在这一点上,您可能需要重新考虑它。我觉得这个项目是你为大学计划的,所以如果工作的重点真的是 ANN,你可能应该选择另一个游戏,更简单的东西。

我记得不久前有人来寻找关于一个不同但不知何故相似的项目的提示。值得一试。

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

实现机器人的一种方法是访问游戏客户端的内存以查找相关信息,例如角色在屏幕上的位置及其健康状况。读取计算机内存是微不足道的,但要弄清楚要在内存中的确切位置查找却并非如此。像Cheat Engine这样的内存扫描器对此非常有帮助。

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

在这个答案中,我简要描述了通过图像处理完成您想要的 2 种方法。如果您对它们感兴趣,您可以在Exploiting Online Games(第 6 章)中找到更多关于它们的信息,这是一本关于该主题的优秀书籍。

于 2011-07-03T17:12:00.483 回答
44

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

正如预期的那样,这要归功于强化学习和深度学习的最新进展,以及使用像 OpenAI 这样的开放游戏框架,它可以简化 AI 的开发,因为您可以获得简洁的 API,还因为您可以加速游戏(AI 玩相当于每天对自己进行 180 年的游戏!)。

2018 年 8 月 5 日(10 天后!),计划让这个 AI 对抗顶级 DotA 2 游戏玩家。如果这成功了,期待一场巨大的革命,也许不像围棋游戏的解决那么中介化,但它仍然是游戏 AI 的一个巨大里程碑!

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

  • OpenAI 的 Universe:一个使用机器学习玩几乎任何游戏的平台。API 是 Python 的,它在 VNC 远程桌面环境后面运行游戏,因此它可以捕获任何游戏的图像!您可能可以通过机器学习算法使用 Universe 玩暗黑破坏神 II!
  • OpenAI 的 Gym:类似于 Universe,但专门针对强化学习算法(因此它是 AlphaGo 使用的框架的一种概括,但适用于更多游戏)。Udemy 上有一门课程,涵盖了使用 OpenAI Gym 将机器学习应用于 breakout 或 Doom 等游戏。
  • TorchCraft : Torch(机器学习框架)和星际争霸:母巢之战之间的桥梁。
  • 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 的技术问题:

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

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

然后,另一个问题是,即使您获取了所需的所有数据,游戏也只是部分可观察的。因此,您需要注入世界的抽象模型,并为其提供经过处理的游戏信息,例如您的头像的位置,以及屏幕外的任务物品、目标和敌人的位置。您可能会为此查看 Vermaak 2003 的 Mixture Particle Filters。

此外,您需要有一个自主代理目标是动态生成的。您可以尝试的著名架构是 BDI 代理,但您可能必须对其进行调整,以使该架构在您的实际案例中工作。作为替代方案,还有递归 Petri 网,您可能可以将它与 Petri 网的各种变体结合来实现您想要的,因为它是一个经过充分研究和灵活的框架,具有很好的形式化和证明程序。

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

总而言之,您想要在这里实现的是当前最先进算法的极限(并且可能有点超出)。我认为这可能是可能的,但即使是这样,你也会花费很多时间,因为这不是一个理论问题,而是你正在处理的实际问题,因此你需要大量实施和组合不同的人工智能方法来解决它。

整个团队几十年的研究可能还不够,所以如果你一个人并兼职工作(因为你可能有一份工作谋生),你可能会度过一生而无法到达附近的任何地方一个可行的解决方案。

所以我在这里最重要的建议是降低期望,并尝试降低复杂性尽可能使用所有信息来解决您的问题,并尽可能避免依赖屏幕截图(即尝试直接挂钩到游戏中,寻找 DLL 注入),并通过实施监督程序来简化一些问题,不要让您的算法学习一切(即,现在尽可能放弃图像处理并依赖内部游戏信息,稍后如果您的算法运行良好,您可以将 AI 程序的某些部分替换为图像处理,从而逐渐达到您的全部目标,例如,如果你可以让某些东西很好地工作,你可以尝试复杂化你的问题,并用截图上的无监督机器学习算法替换监督程序和记忆游戏数据)。

祝你好运,如果成功了,一定要发表一篇文章,你一定能以解决如此困难的实际问题而闻名!

于 2013-12-28T12:43:56.500 回答
26

你所追求的问题在你定义它的方式中是棘手的。认为神经网络会“神奇地”学习到问题的丰富表示通常是错误的。在决定 ANN 是否适合某项任务时,需要牢记的一个好事实是,它是一种插值方法。想一想,您是否可以将问题描述为找到一个函数的近似值,在这个函数中您有很多点,并且有大量时间来设计和训练网络。

你提出的问题没有通过这个测试。游戏控制不是屏幕上图像的功能。玩家必须记住很多信息。举个简单的例子,在游戏中每次进入商店时,画面看起来都是一样的。但是,您购买什么取决于具体情况。无论网络多么复杂,如果屏幕像素是它的输入,它在进入商店时总是会执行相同的动作。

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

于 2011-07-01T01:01:15.920 回答
18

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

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

于 2011-07-03T18:05:15.440 回答
2

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

您可以通过相关性检测和识别敌人(使用 FFT)。但是,如果动画重复像素精确,则只查看几个像素值会更快。您的主要任务将是编写一个强大的系统,该系统将识别新对象何时出现在屏幕上,并将精灵帧的所有帧逐渐写入数据库。可能您还必须为武器效果建立模型。这些可以被减去,这样它们就不会弄乱你的对手数据库。

于 2011-07-04T17:05:23.967 回答
1

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

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

然后我猜有价值的“目标”将是敌人物体的消失和健康条的减少(得分相反)。

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

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

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

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

于 2012-01-20T12:15:40.150 回答
1

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

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

一段时间后(或“赢”/“输”),评估神经网络与“目标”的接近程度(这可能涉及一些领域知识)。然后扔掉离目标最远的 50%(或其他百分比)的 NN,对前 50% 进行交叉/变异,然后再次运行新的 NN 集。继续运行,直到一个令人满意的 NN 出来。

于 2011-07-01T16:42:59.077 回答