如何使用视觉输入训练人工神经网络玩暗黑破坏神 2?
Posted
技术标签:
【中文标题】如何使用视觉输入训练人工神经网络玩暗黑破坏神 2?【英文标题】:How to train an artificial neural network to play Diablo 2 using visual input? 【发布时间】:2011-09-26 09:40:05 【问题描述】:我目前正在尝试让 ANN 玩视频游戏,我希望能从这里的优秀社区获得一些帮助。
我选择了《暗黑破坏神 2》。因此,游戏是实时的,从等距的角度来看,玩家控制一个以摄像机为中心的化身。
具体来说,任务是让你的角色 x 经验值而不使其生命值降至 0,其中经验值是通过杀死怪物获得的。以下是游戏玩法示例:
现在,由于我希望网络仅根据从屏幕上的像素获取的信息来运行,它必须学习非常丰富的表示才能有效地播放,因为这可能需要它知道(隐含在至少)如何将游戏世界划分为对象以及如何与它们交互。
所有这些信息都必须以某种方式传授给网络。我这辈子都想不出怎么训练这个东西。我唯一的想法是有一个单独的程序从屏幕上直观地提取游戏中天生好/坏的东西(例如健康、金币、经验),然后在强化学习过程中使用该统计数据。我认为这将是答案的部分,但我认为这还不够;从原始视觉输入到面向目标的行为的抽象层次太多了,无法在我的一生中训练出如此有限的反馈。
那么,我的问题是:您还能想到哪些其他方法来训练网络至少完成部分任务?最好不要制作数千个带标签的示例。
只是为了多一点方向:我正在寻找其他一些强化学习来源和/或任何无监督方法来在此设置中提取有用信息。或者,如果您可以想出一种无需手动标记的方式从游戏世界中获取标记数据,则可以使用监督算法。
更新(2012 年 4 月 27 日):
奇怪的是,我仍在努力,似乎正在取得进展。让 ANN 控制器工作的最大秘诀是使用适合该任务的最先进的 ANN 架构。因此,我一直在使用deep belief net 由分解的conditional restricted Boltzmann machines 组成,我已经以无人监督的方式(在我玩游戏的视频上)进行了训练,然后使用temporal difference back-propagation 进行了微调(即使用标准前馈进行强化学习人工神经网络)。
但仍在寻找更有价值的输入,尤其是关于实时动作选择问题以及如何为 ANN 处理编码彩色图像:-)
更新(2015 年 10 月 21 日):
只记得我以前问过这个问题,并认为我应该提到这不再是一个疯狂的想法。自从我上次更新以来,DeepMind 发布了他们的性质paper on getting neural networks to play Atari games from visual inputs。事实上,唯一阻止我使用他们的架构来玩暗黑破坏神 2 的有限子集是缺乏对底层游戏引擎的访问权限。渲染到屏幕然后将其重定向到网络太慢了,无法在合理的时间内进行训练。因此,我们可能不会很快看到这种机器人在玩暗黑破坏神 2,但这只是因为它会玩开源或通过 API 访问渲染目标的东西。 (也许是地震?)
【问题讨论】:
查看这篇论文。 :D ri.cmu.edu/pub_files/pub2/pomerleau_dean_1992_1/… 论文中的驾驶问题和游戏的一个很大区别在于,在驾驶问题中,视觉输入是一个足够完整的状态表示:如果右边有障碍物--左转,如果有左边是障碍物——右转。但是,在游戏中,您经常不得不根据屏幕上未显示的内容做出决定。任何时候你进入一家商店,它可能看起来都一样,但你需要购买不同的物品。 我记得最好的暗黑破坏神 2 使用了容易提取的精灵表。将对象(玩家、敌人等)绑定到相关精灵列表应该相当简单。它并不能解决物体被彼此遮挡的问题,但它是一个开始。 @zergylord 如果您能说出您希望如何坚定地遵守您的标准,这将有所帮助:a) 玩暗黑破坏神 2 和 b) 使用绘制到屏幕上的像素作为您唯一的输入源。如果你想让自己的事情变得更轻松,我认为你将不得不放松其中的一个(或两个)——你愿意这样做吗? 投票结束,因为范围太广。 【参考方案1】:我可以看出您担心如何训练 ANN,但是这个项目隐藏了您可能不知道的复杂性。通过图像处理在计算机游戏中识别对象/字符是一项极具挑战性的任务(对于 FPS 和 RPG 游戏来说,疯狂)。我不怀疑你的技能,我也不是说它不能完成,但是你可以很容易地花费 10 倍以上的时间来识别东西而不是实现 ANN 本身(假设你已经有 digital 的经验图像处理技术)。
我认为您的想法非常有趣且也非常雄心勃勃。在这一点上,您可能需要重新考虑它。我觉得这个项目是你为大学计划的,所以如果工作的重点真的是 ANN,你可能应该选择另一个游戏,更简单的。
我记得不久前有人在different but somehow similar project 上寻找提示。值得一看。
另一方面,如果您接受建议,可能会有更好/更简单的方法来识别游戏中的对象。但首先,让我们将此项目称为您想要的名称:smart-bot。
一种实现机器人的方法访问游戏客户端的内存以查找相关信息,例如角色在屏幕上的位置及其健康状况。读取计算机内存是微不足道的,但要弄清楚要在内存中的确切位置查找却并非如此。像Cheat Engine 这样的内存扫描器可以对此非常有帮助。
另一种方法,适用于游戏,涉及操纵渲染信息。游戏的所有对象都必须渲染到屏幕上。这意味着所有 3D 对象的位置最终将被发送到视频卡进行处理。准备好进行一些严肃的调试。
在这个答案中,我简要描述了通过图像处理完成您想要的 2 种方法。如果您对它们感兴趣,可以在Exploiting Online Games(第 6 章)上找到更多关于它们的信息,这是一本关于该主题的优秀书籍。
【讨论】:
【参考方案2】:2018-07-26 更新:就是这样!我们现在正在接近这种游戏可以解决的地步!使用 OpenAI 并基于游戏 DotA 2,一个团队可以制作一个可以beat semi-professional gamers in a 5v5 game 的 AI。如果您了解 DotA 2,您就会知道这款游戏在机制方面与类似暗黑破坏神的游戏非常相似,但有人可能会争辩说,由于团队合作,它更加复杂。
正如预期的那样,这要归功于强化学习与深度学习的最新进展,以及使用 OpenAI 等开放游戏框架,因为您可以获得简洁的 API,并且可以加速游戏( AI 每天与自己对战相当于 180 年的游戏!)。
On the 5th of August 2018 (in 10 days!),计划让这个 AI 对抗*** DotA 2 游戏玩家。如果这成功了,期待一场大革命,也许不像解决围棋游戏那样具有中介性,但它仍然是游戏 AI 的一个巨大里程碑!
2017 年 1 月更新:自 AlphaGo 成功以来,该领域发展非常迅速,几乎每个月都有新的框架来促进游戏机器学习算法的开发。这是我发现的最新列表:
OpenAI's Universe:一个使用机器学习玩几乎任何游戏的平台。 API 是 Python 的,它在 VNC 远程桌面环境后面运行游戏,因此它可以捕获任何游戏的图像!您可能可以通过机器学习算法使用 Universe 玩暗黑破坏神 II! OpenAI's Gym:类似于 Universe,但专门针对强化学习算法(所以它是 AlphaGo 使用的框架的一种概括,但适用于更多游戏)。有a course on Udemy 介绍了使用 OpenAI Gym 将机器学习应用于 breakout 或 Doom 等游戏。 TorchCraft:Torch(机器学习框架)和星际争霸:母巢之战之间的桥梁。 pyGTA5:一个仅使用屏幕截图在 GTA5 中构建自动驾驶汽车的项目(有很多 videos online)。非常激动人心的时刻!
重要更新(2016 年 6 月): 正如 OP 所指出的,训练人工网络以仅使用视觉输入来玩游戏的问题现在正由几个严肃的机构解决,并取得了非常有希望的结果,比如DeepMind Deep-Qlearning-Network (DQN)。
现在,如果您想接受下一个级别的挑战,您可以使用各种AI 视觉游戏开发平台,例如ViZDoom,一个高度优化的平台(7000 fps) 来训练网络仅使用视觉输入来玩《毁灭战士》:
ViZDoom 允许开发仅使用视觉信息(屏幕缓冲区)来玩 Doom 的 AI 机器人。它主要用于机器视觉学习的研究,尤其是深度强化学习。 ViZDoom 基于 ZDoom 提供游戏机制。
结果非常惊人,see the videos on their webpage 和 nice tutorial(在 Python 中)在这里!
Quake 3 Arena 也有一个类似的项目,名为 Quagents,它还提供对底层游戏数据的简单 API 访问,但您可以废弃它,只使用屏幕截图和 API 来控制您的代理。
如果我们只使用屏幕截图,为什么这样的平台有用?即使您不访问底层游戏数据,这样的平台也提供:
高性能游戏实现(您可以用更少的时间生成更多的数据/游戏/学习世代,以便您的学习算法可以更快地收敛!)。 一个简单且响应式 API 来控制您的代理(即,如果您尝试使用人工输入来控制游戏,您的某些命令可能会丢失,因此您还要处理不可靠性问题你的输出...)。 轻松设置自定义场景。 可自定义的渲染(有助于“简化”您获得的图像以简化处理) 同步(“回合制”)播放(因此您一开始不需要您的算法实时工作,这大大降低了复杂性)。 额外的便利功能,例如跨平台兼容性、追溯兼容性(当有新游戏更新时,您不会冒着让机器人不再使用游戏的风险)等。总而言之,这些平台的优点在于它们缓解了您之前必须处理的大部分技术问题(如何操作游戏输入、如何设置场景等),因此您只需要处理学习算法本身。
所以现在,开始工作,让我们成为有史以来最好的 AI 视觉机器人 ;)
旧帖描述了开发仅依赖视觉输入的 AI 的技术问题:
与我上面的一些同事相反,我不认为这个问题是棘手的。但这肯定很难!
上面指出的第一个问题是游戏状态的表示:你不能只用一张图片来表示完整的状态,你需要保持某种记忆(健康,还有装备的物品和可用的物品、任务和目标等)。要获取此类信息,您有两种方法:一种是直接访问游戏数据,这是最可靠、最简单的方法;或者您可以通过实施一些简单的程序(打开清单、截屏、提取数据)来创建这些信息的抽象表示。当然,从屏幕截图中提取数据要么让你放入一些有监督的程序(你完全定义),要么是无监督的(通过机器学习算法,但它会扩大很多复杂性......)。对于无监督机器学习,您将需要使用一种非常新的算法,称为结构学习算法(它学习数据的结构,而不是如何对它们进行分类或预测值)。一种这样的算法是 Richard Socher 的递归神经网络(不要与递归神经网络混淆):http://techtalks.tv/talks/54422/
然后,另一个问题是,即使您已获取所需的所有数据,游戏也只是部分可观察。因此,您需要注入世界的抽象模型,并为其提供经过处理的游戏信息,例如您的头像的位置,以及屏幕外的任务物品、目标和敌人的位置。您可能会为此研究 Vermaak 2003 的 Mixture Particle Filters。
此外,您需要有一个自治代理,并动态生成目标。您可以尝试的著名架构是 BDI 代理,但您可能必须对其进行调整,以使该架构在您的实际案例中工作。作为替代方案,还有递归 Petri 网,您可以将它与 Petri 网的各种变体结合来实现您想要的,因为它是一个经过充分研究和灵活的框架,具有很好的形式化和证明程序。
最后,即使您完成了上述所有操作,您也需要找到一种以加速模拟游戏的方法(使用视频可能很好,但问题是您的算法只会在没有控制的情况下进行观察,并且能够自己尝试对于学习非常重要)。事实上,众所周知,当前最先进的算法需要更多时间来学习人类可以学习的相同内容(强化学习更是如此),因此如果不能加快这个过程(即,如果你不能加快游戏时间),你的算法甚至不会在一个生命周期内收敛......
总而言之,您想要在此处实现的目标是当前最先进算法的极限(并且可能有点超出)。我认为这可能是可能的,但即使是这样,你会花费很多时间,因为这不是一个理论问题,而是一个实际问题你正在接近这里,因此您需要实施并结合许多不同的 AI 方法才能解决它。
整个团队进行数十年的研究可能还不够,因此,如果您独自一人并兼职从事该研究(因为您可能以工作为生),您可能会度过一生到达工作解决方案附近的任何地方。
所以我在这里最重要的建议是您降低您的期望,并尝试通过使用所有可能的信息来降低问题的复杂性,并尽可能避免依赖截图(即尝试直接挂钩到游戏中,寻找DLL注入),并通过实施监督程序来简化一些问题,不要让你的算法学习一切(即,现在尽可能放弃图像处理并依赖内部游戏信息,稍后如果您的算法运行良好,您可以将 AI 程序的某些部分替换为图像处理,从而逐步实现您的全部目标,例如,如果您可以很好地工作,您可以尝试复杂化您的问题并在屏幕截图上用无监督机器学习算法替换监督程序和记忆游戏数据)。
祝你好运,如果成功了,一定要发表一篇文章,你一定能以解决如此困难的实际问题而闻名!
【讨论】:
【参考方案3】:您所追求的问题在您定义它的方式中是棘手的。认为神经网络会“神奇地”学习问题的丰富表示通常是错误的。在决定 ANN 是否是任务的正确工具时要记住的一个好事实是,它是一种插值方法。想一想,您是否可以将您的问题定义为找到一个函数的近似值,您可以从该函数中获得很多点,并有大量时间来设计和训练网络。
你提出的问题没有通过这个测试。游戏控制不是屏幕上图像的功能。玩家必须记住很多信息。举个简单的例子,在游戏中每次进入商店时,画面看起来都是一样的。但是,您购买什么取决于具体情况。不管网络多么复杂,如果屏幕像素是它的输入,它在进入商店时总是会执行相同的动作。
此外,还有规模问题。您提出的任务太复杂了,无法在任何合理的时间内学习。您应该看到 aigamedev.com 了解游戏 AI 的工作原理。人工神经网络已在一些游戏中成功使用,但方式非常有限。游戏 AI 开发起来很困难,而且通常很昂贵。如果有一种构建功能性神经网络的通用方法,该行业很可能会抓住它。我建议您从简单得多的示例开始,例如井字游戏。
【讨论】:
很公平。您可以将大多数类似于网络的东西称为 ANN,但它几乎无法引发实质性讨论。 :) 呵呵……我应该更深入地解释我的动机。我知道有更好的方法来制作游戏 AI,但我这样做是为了突破我一直在升级的 ANN 模拟器的极限。见:stanford.edu/group/pdplab/pdphandbook 无论如何,Don Reba 是对的,我也不认为在不结合大量先验知识并提取强化学习的有用特征的情况下学习暗黑破坏神之类的策略是不可行的方法可以根据。使用当今的计算机,即使不是不可能,仅从视频输入中学习也是非常困难的。【参考方案4】:似乎这个项目的核心是探索 ANN 的可能性,所以我建议选择一个你不必处理图像处理的游戏(从其他人的答案来看,这似乎是一个 真正实时游戏中的艰巨任务)。您可以使用 Starcraft API 来构建您的机器人,它们让您可以访问所有相关的游戏状态。
http://code.google.com/p/bwapi/
【讨论】:
【参考方案5】:作为第一步,您可能会查看连续帧的差异。你必须区分背景和实际的怪物精灵。我猜这个世界也可能包含动画。为了找到这些,我会让角色四处移动,并将随世界移动的所有内容收集到一个大背景图像/动画中。
您可以通过相关性检测和识别敌人(使用 FFT)。但是,如果动画重复像素精确,则只查看几个像素值会更快。您的主要任务将是编写一个强大的系统,该系统将识别新对象何时出现在屏幕上,并将精灵帧的所有帧逐渐写入数据库。可能您还必须为武器效果建立模型。应该减去这些罐头,以免它们弄乱你的对手数据库。
【讨论】:
熟悉暗黑2游戏,我可以说它使用256色(除非某些模式使用高或真彩色)。它还大量使用精灵来显示不同的对象。如果您能够提取一些精灵(甚至从屏幕截图中),您可能会训练您的工具根据精灵识别对象(例如,掉落的“小型治疗药水”看起来总是一样的)。但是,如果我深入了解暗黑破坏神 II 的特定内容,也会出现更多问题。祝你好运【参考方案6】:假设您可以在任何时候从一组所有可能的“移动”中生成一组“结果”(可能涉及概率),并且游戏中存在一些一致性概念(例如,您可以玩 X 关)一遍又一遍),您可以从具有随机权重的 N 个神经网络开始,并让它们中的每一个按以下方式玩游戏:
1) 对于每一个可能的“移动”,生成一个可能的“结果”列表(以及相关的概率) 2) 对于每个结果,使用您的神经网络来确定“结果”的相关“价值”(分数)(例如,-1 和 1 之间的数字,1 是可能的最佳结果,-1 是最差的结果) 3)选择导致最高概率*分数的“移动” 4) 如果移动导致“赢”或“输”,则停止,否则返回步骤 1。
一段时间后(或“赢”/“输”),评估神经网络与“目标”的接近程度(这可能涉及一些领域知识)。然后扔掉离目标最远的 50%(或其他百分比)的 NN,对前 50% 进行交叉/变异,然后再次运行新的 NN 集。继续运行,直到得到满意的 NN。
【讨论】:
啊,在组合中添加一个 GA,很有趣。不幸的是,由于我让网络实际上将按键/鼠标移动作为动作发送,我需要每个网络一台物理计算机>。 嗯,在我看来,神经网络能做的只有这么多。似乎充其量它可以用作离散状态空间的某些概念的可学习启发式函数。要结合敌人的可变性,您可能必须使用其他一些启发式方法,然后您可以使用它来创建一组具有相关概率的每次移动可能的结果状态。此外,只要存在初始和最终配置的静态概念,您就可以一次运行每个神经网络。【参考方案7】:我认为你最好的选择是一个涉及几个/可能网络的复杂架构:即一个识别和响应物品,一个用于商店,一个用于战斗(也许在这里你需要一个用于敌人识别,一个用于攻击) 等。
然后试着想想最简单的暗黑破坏神 II 游戏玩法,可能是野蛮人。然后一开始就保持简单,就像第一幕一样,只有第一个区域。
那么我猜有价值的“目标”是敌人物体的消失和生命值的减少(相反得分)。
处理完这些单独的“更简单”任务后,您可以使用“主”ANN 来决定激活哪个子 ANN。
至于训练,我只看到三个选项:您可以使用上述进化方法,但是您需要手动选择“获胜者”,除非您为此编写一个完整的单独程序。您可以让网络“观看”某人的比赛。在这里,他们将学习模仿一名球员或一组球员的风格。网络试图预测玩家的下一个动作,为正确的猜测而强化,等等。如果你真的得到了你想要的 ANN,这可以通过视频游戏来完成,而不需要实际的现场游戏。最后,您可以让网络玩游戏,将敌人死亡、升级、恢复健康等作为正强化,将玩家死亡、失去健康等作为负强化。但是看到即使是一个简单的网络也需要数千个具体的训练步骤来学习甚至简单的任务,你需要对这个有很大的耐心。
总而言之,您的项目非常雄心勃勃。但我个人认为,只要有足够的时间,它“理论上可以完成”。
希望对你有帮助,祝你好运!
【讨论】:
以上是关于如何使用视觉输入训练人工神经网络玩暗黑破坏神 2?的主要内容,如果未能解决你的问题,请参考以下文章