如何训练一个人造neural network使用视觉input来玩“暗黑破坏神2”?

我目前正在试图让人工neural network玩一个电子游戏,我希望能从这个美妙的社区获得一些帮助。

我决定使用“暗黑破坏神2”(Diablo 2)。因此,玩家可以实时从等轴测视angular观看,并且玩家可以控制相机所在的一个angular色。

为了使事情具体化,任务是让你的angular色x的经验值不降低到0,通过杀死怪物获得经验值。 这是一个游戏的例子:

这里

现在,因为我希望networking完全基于从屏幕像素获得的信息进行操作,为了有效地播放它,它必须学习非常丰富的表示,因为这可能需要它知道(至less隐含)如何把游戏世界分成对象和如何与之交互。

而所有这些信息都必须被教给networking……不知何故。 我不能为了我的生活想到如何训练这个东西。 我唯一的想法是有一个单独的程序从屏幕上直观地提取游戏中天生好/坏的东西(例如健康,黄金,经验),然后在强化学习过程中使用该属性。 我认为这是答案的一部分 ,但我认为这还不够。 从原始视觉input到目标导向行为的抽象层次太多,以至于这种有限的反馈,在我的有生之年就要训练一个networking。

所以,我的问题:你还有什么其他的方式可以用来培养一个networking来完成这个任务的至less一部分? 最好不要制造数千个标记的例子…

只是稍微指出一点:我正在寻找一些其他的强化学习来源和/或任何无监督的方法来提取有用的信息在这个设置。 或者是一个监督algorithm,如果你可以想办法从游戏世界中获取标签数据而不需要手动标记它。

UPDATE(04/27/12):

奇怪的是,我仍然在努力,似乎正在取得进展。 让neural network控制器工作的最大秘诀就是使用适合于这个任务的最先进的neural network架构。 因此,我一直在使用深度信念networking组成的条件限制玻尔兹曼机器 ,我已经在一个无监督的方式(在我玩游戏的video)训练之前微调与时间差异向后传播 (即强化学习与标准前馈人工neural network)。

仍然在寻找更有价值的input,特别是在实时动作select的问题上,以及如何为ANN处理编码彩色图像:-)

UPDATE(15年10月21日):

只记得我今天回答了这个问题,我想我应该提一下,这不再是一个疯狂的想法。 自从我上次更新以来,DeepMind发布了他们关于让neural network从视觉input中玩atari游戏的自然论文 。 事实上,阻止我使用他们的体系结构玩“暗黑破坏神2”的一个有限子集的唯一原因是缺乏对底层游戏引擎的访问。 渲染到屏幕然后redirect到networking太慢,无法在合理的时间内进行训练。 因此,我们很可能不会在近期看到这种机器人玩“暗黑破坏神2”,但只是因为它会播放开源或API访问渲染目标的东西。 (地震也许?)

我可以看到你担心如何训练人工neural network,但是这个项目隐藏了你可能没有意识到的复杂性 。 通过image processing对计算机游戏进行对象/字符识别是一项非常具有挑战性的任务(对于FPS和RPG游戏,不要说疯狂 )。 我不怀疑你的技能,我也不是说它不能完成,但你可以轻松地花10倍的时间来识别东西,而不是实现人工neural network(假设你已经有数字image processing技术方面的经验) )。

我认为你的想法非常有趣,也很有雄心 。 在这一点上,你可能想重新考虑它。 我觉得这个项目是你为大学计划的东西,所以如果工作的重点是真的,那么你应该select另一个游戏,更简单一些。

我记得有一个人在不久之前就寻找了一个不同的,但有点类似的项目的提示。 这是值得检查出来的。

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

一种实现机器人的方法 访问游戏客户端的存储器以查找相关信息,例如屏幕上人物的位置和健康状况。 读取计算机内存是微不足道的,但是确切地说,在内存中寻找的内容不是。 像Cheat Engine这样的内存扫描程序对此非常有帮助。

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

在这个答案中,我简要介绍了2种方法,通过image processing完成你想要的。 如果你对他们感兴趣,你可以在Exploiting Online Games (第六章)中find更多关于他们的知识。

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

  • OpenAI的宇宙 :一个使用机器学习来玩任何游戏的平台。 这个API是用Python编写的,它运行的是VNC远程桌面环境下的游戏,因此它可以捕捉任何游戏的图像! 你也许可以使用Universe通过机器学习algorithm来玩Diablo II!
  • OpenAI的健身房 :与Universe类似,但专门针对强化学习algorithm(所以这是AlphaGo使用的框架的一般化,但对于更多的游戏)。
  • TorchCraft : 火炬 (机器学习平台)和“星际争霸:母巢之战”之间的桥梁。
  • pyGTA5 :一个项目,在GTA5中只使用屏幕截图自动驾驶汽车( 在线有很多video )。

非常激动人心

重要更新(2016-06):正如OP指出的那样,培训人造networking仅仅使用视觉input来玩游戏的问题现在已经被一些严肃的机构所处理,并且相当有希望的结果,比如DeepMind Deep-Qlearning-Network(DQN ) 。

而现在,如果您想要面对下一个挑战,您可以使用各种AI视觉游戏开发平台之一,例如高度优化的平台ViZDoom (7000 fps)来训练networking,只使用视觉input来玩Doom :

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

结果是相当惊人的, 看到他们的网页上的video和漂亮的教程 (在Python中)在这里!

还有一个Quake 3 Arena的类似项目叫做Quagents ,它也提供了对底层游戏数据的简单API访问,但是你可以取消它,只使用截图和API来控制你的代理。

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

  • 游戏的高性能实现(您可以用更less的时间生成更多的数据/游戏/学习代,这样您的学习algorithm可以更快地收敛!)。
  • 一个简单而有反应的API来控制你的代理(也就是说,如果你试图用人类的input来控制一个游戏,你的一些命令可能会丢失,所以你也应该处理你输出的不可靠性)。
  • 自定义场景的简单设置。
  • 可定制的渲染 (可以用来“简化”你所获得的图像以简化处理)
  • 同步(“turn-by-turn”)播放 (所以你不需要你的algorithm在第一时间实时工作,这是一个巨大的复杂性减less)。
  • 其他的便利function,如跨平台兼容性,逆向兼容性(当有新的游戏更新时,您不会再冒险不再使用游戏),等等。

总而言之,这些平台的优点在于, 它们可以缓解许多以前需要处理的技术问题 (如何操作游戏input,如何设置场景等),以便您只需处理学习algorithm本身。

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


旧post描述了仅依靠视觉input来开发AI的技术问题:

与上述一些同事相反,我不认为这个问题是棘手的。 但它肯定是一个难以置信的!

上面指出的第一个问题是游戏状态表示 :你不能用单一的图像来表示完整的状态,你需要保持某种记忆 (健康,但也包括装备的物品和可用的物品使用,任务和目标等)。 要获取这些信息有两种方法:直接访问游戏数据,这是最可靠和最容易的; 或者你可以通过实施一些简单的程序(打开库存,截图,提取数据)来创build这些信息的抽象表示。 当然,从屏幕截图中提取数据要么需要放入一些监督程序(完全定义的)或无监督的(通过机器学习algorithm,但这会增加复杂性)。 对于无监督机器学习,您将需要使用一种相当新近的algorithm,称为结构学习algorithm(学习数据的结构,而不是如何分类或预测值)。 一种这样的algorithm是Richard Socher的recursionneural network(不要与recursionneural network混淆): http ://techtalks.tv/talks/54422/

然后,另一个问题是,即使你已经提取了你所需要的所有数据,游戏也只能部分观察到 。 因此,你需要注入一个世界的抽象模型,并将其与来自游戏的处理信息(例如,你的头像的位置)一起提供给它,同时也是任务物品的位置,目标和屏幕外的敌人。 你也许可以看看Vermaak 2003的Mixture Particle Filters。

此外,您需要有一个自主代理 ,dynamic生成目标 。 您可以尝试的着名架构是BDI代理,但是您可能必须对此架构进行调整,才能在实际情况下运行。 作为替代scheme,还有recursionPetri网,您可以将它们与各种各样的Petri网结合起来,以达到您想要的效果,因为它是一个研究得非常好,灵活的框架,具有很好的forms化和certificate程序。

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

总而言之,你想在这里达到的是当前最先进的algorithm的极限(也许有点超出) 。 我认为这可能是可能的,但即使是这样, 你也要花很多时间 ,因为这不是一个理论问题,而是一个实际的问题 ,因此你需要实现和结合很多不同的AI方法来解决它。

几十年的研究与整个团队的工作可能是不够的,所以如果你是孤身一人,并在兼职工作(因为你可能有工作谋生),你可能会花一辈子没有到达任何地方附近一个工作解决scheme

所以我最重要的build议就是降低你的期望值,尽量减less问题的复杂性尽可能地利用你所能得到的所有信息,并尽可能地避免依靠屏幕截图(即试图直接挂钩游戏,寻找DLL注入),并通过实施监督程序来简化一些问题,不要让你的algorithm学习所有的东西(即,尽可能地放弃image processing,依靠内部游戏信息,稍后如果你的algorithm运行良好,你可以用image processing来replace你的AI程序的某些部分,这样就可以实现你的全部目标,例如,如果你能得到很好的工作,你可以尝试复杂化你的问题,用无监督的手段取代监督程序和记忆游戏数据机器学习algorithm的截图)。

祝你好运,如果有用,一定要发表一篇文章,你一定会因为解决这个难题而出名!

你所追求的问题在你定义的方式上是棘手的。 认为一个neural network会“神奇地”学习一个问题的丰富回报通常是一个错误。 在决定ANN是否是正确的工具时,记住一个好的事实是它是一种插值方法。 想一想,你是否可以将问题定义为寻找函数的近似值,从这个函数中得到许多要点,并且有很多时间来devisenetworking并对其进行训练。

你提出的问题没有通过这个testing。 游戏控制不是屏幕上图像的function。 玩家必须记住很多信息。 举一个简单的例子,通常情况下,每次你进入一个游戏店,屏幕看起来都是一样的。 但是,你买什么取决于具体情况。 无论networking多么复杂,如果屏幕像素是其input,在进入商店时总会执行相同的操作。

另外还有规模问题。 你提出的任务太复杂了,无法在合理的时间内学习。 你应该看到aigamedev.com如何游戏AI工程。 人工neural network已经在一些游戏中成功地使用,但是以非常有限的方式。 游戏AI很难开发,而且开销往往很高。 如果有一个构buildfunctionneural network的一般方法,那么这个行业很可能会被抓住。 我build议你从很多简单的例子开始,比如井字棋(tic-tac-toe)。

似乎这个项目的核心是探索ANN的可能性,所以我build议select一个游戏,你不必处理image processing(从这里的其他答案,似乎是一个非常困难的任务实时游戏)。 你可以使用星际争霸API来构build你的机器人,他们让你访问所有相关的游戏状态。

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

那么假设在任何时候都可以从一系列可能的“移动”中产生一组“结果”(可能涉及概率),并且在游戏中有一些一致性的概念(例如,你可以反复玩X级再次),你可以从N个随机权重的neural network开始,每个人都按照以下方式玩游戏:

1)对于每一个可能的“移动”,生成一个可能的“结果”(相关概率)列表2)对于每个结果,使用你的neural network来确定“结果”的相关“价值”(分数)数字在-1和1之间,1是最好的结果,-1是最差的)3)select导致最高概率*得分的“移动”4)如果移动导致了“胜利”或“失败”停止,否则回到步骤1。

经过一段时间(或“赢”/“失”),评估neural network与“目标”的距离(这可能涉及一些领域知识)。 然后扔掉距离目标最远的50%(或其他一些比例)的neural network,进行前50%的交叉/变异,再次运行新的neural network集。 继续运行,直到出现令人满意的NN。

作为第一步,你可以看看连续帧的差异。 你必须区分背景和实际的怪物精灵。 我想这个世界也可能包含animation。 为了find那些我将要angular色四处移动,并收集与世界一起移动的一切成为一个大的背景图像/animation。

你可以检测和识别相关的敌人(使用FFT)。 但是,如果animation重复像素精确,则只需查看几个像素值即可。 你的主要任务是编写一个强大的系统,以确定何时在屏幕上出现一个新的对象,并逐步将精灵帧的所有帧都写入数据库。 也许你必须build立武器效果的模型。 那些可以被减去,以便他们不会混乱你的对手数据库。

我认为你最好的select是一个涉及less数几个networking的复杂的体系结构:一个是识别和响应物品,一个是商店,一个是战斗(也许在这里你需要一个用于敌人识别,一个用于攻击)等等。

然后试着想一下最简单的暗黑2游戏,可能是野蛮人。 然后保持简单,就像第一幕一样。

那么我觉得有价值的“目标”就是敌方物体的消失和健康的减退(反过来得分)。

一旦你有这些单独的,更简单的任务照顾,你可以使用一个“主”人工neural network来决定哪个子人工neural network激活。

至于培训,我只看到三个select:你可以使用上面描述的进化方法,但是你需要手动select“优胜者”,除非你编写了一个单独的程序。 你可以让networking“看”有人玩。 在这里,他们将学习模仿一个球员或一组球员的风格。 networking试图预测玩家的下一步行动,获得正确的猜测等。如果你真的得到了人工neural network,你可以用video游戏来完成,不需要真正的现场游戏。 最后,你可以让networking玩游戏,让敌人死亡,升级,恢复健康等,作为积极的强化和玩家的死亡,失去健康等作为负面的强化。 但是看到即使一个简单的networking需要数千个具体的训练步骤来学习即使是简单的任务,你也需要很多的耐心。

总而言之,你的项目非常有雄心。 但是我认为,如果有足够的时间,我们可以在理论上做到这一点。

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