Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >耶鲁编程马拉松:用神经网络学习超级马里奥游戏

耶鲁编程马拉松:用神经网络学习超级马里奥游戏

作者头像
新智元
发布于 2018-03-13 09:41:32
发布于 2018-03-13 09:41:32
1.2K0
举报
文章被收录于专栏:新智元新智元

Joe Crozier 和我最近刚从YHack 回来,那是一个耶鲁大学举办的36小时编程马拉松,有1500人参加。这是我们连续第二年参加这个比赛,也是我们第二次成功进入前8 !

我们的项目,“crAIg”,是一个自我学习算法,它会学习怎么玩红白机上的超级马里奥。一开始它对超级马里奥毫无了解,不知道它到底是什么、怎么玩、怎么才算赢;使用进化的神经网络算法(neuroevolution)慢慢建立起基础,最后它可以学会玩这个游戏。

在这个项目中,我将注意力放在了如何把crAIg的进化算法与项目融合的各种细节上,于是我发现我应该为此写一篇相对深度的博文。

crAIg的进化基于一种叫做“NEAT”的算法,它来自于一篇名为《运用增强拓扑使神经网络进化》(EvolvingNeural Networks through Augmented Topologies)的论文(文末附下载)。我以下的博文内容将谈到我是如何将这种算法融合到超级马里奥的项目中去的,希望我写得足够浅显易懂。

crAIg的大脑

在我们直接开始谈论算法之前,我打算先介绍一下crAIg的大脑的构成。在游戏中的任何时间,他的“大脑”都是由一群“神经元”和“突触”组成的,叫它们“节点”和“连接”也可以。在本质上,他的大脑是一幅有向图(directedgraph)。

上图是这个项目的第二部分,一个可以显示当前crAIg大脑状态(或者说他在“想”什么)的Node.js服务器。让我们快速了解一下这幅图的含义。

左边,你可以看到大片的正方形网格。这是游戏现在看上去的样子,或者说crAIg的“眼里”游戏现在的样子。他不知道网格中任何一个方块的意思,但他知道“空气”格子和“地面”格子在某些方面是不同的。每一个方块实际上就是一个输入神经元。

右边,你可以看到4个“输出神经元”,或者说crAIg可以按的4个按钮。你也可以看到一条线连接左图一个黑色格子和右图的“R”神经元,被标记成“1”。这是一个突触,当左边的输入神经元放电时,信号会沿着突触传导,告诉crAIg应该按“R”键。用这种方法,crAIg可以正确地行走。随着crAIg不断进化,更多的神经元和突触被创造出来了,最终他的大脑看上去会更像这种样子:

在这张图上有几件事我想指出来。首先,左边的绿色方块是一只板栗仔(goomba)。其次,你可以在非常低的位置看到一个标记为176的神经元,它被称为隐藏神经元,表示既不属于输入神经元也不属于输出神经元。随着crAIg不断进化,复杂度上升,隐藏神经元会出现在他的大脑中。你也可以看到,在他死掉的时候(马里奥被板栗仔碰到了),他正在尝试按“R”键和“B”键。

进化神经模型为何酷炫

当学习玩超级马里奥变成单纯地应用神经网络和进化神经模型,这个游戏在很大程度上就成为了一种展示这些自我进化的神经网络的方法。虽然crAIg只学习了如何玩简单的红白机游戏,但其中用到的算法可以被应用在机器人身上,为你打扫房间、在工厂劳作或者甚至是绘制出美丽的油画。

从crAIg可以窥探到一个机器不再需要被人编程来完成特定任务的未来,取而代之的是给机器设定指导原则,让它们从经验中自我学习。随着我们将越来越难的工作寄托在机器身上,想要通过硬编码(hardcode,译者注:指在软件实现上,把输出或输入的相关参数(例如:路径、输出的形式或格式)直接以常量的方式书写在源代码中,而非在运行时期由外界指定的设置、资源、数据或格式做出适当回应。来自维基百科)的方式编写任务程序就变得越来越不可能。我们需要更多的多功能机器为我们服务,而让神经网络自我进化就是往这个方向迈出了一步。

NEAT(增强拓扑的神经网络进化,NeuroEvolution ofAugmented Topologies)

如果你好奇于神经网络进化遇到的问题背后是怎样的历史,我非常推荐你读一下这个算法的论文(就是前面提到的那一篇)。论文第一部分论述了实现神经网络进化的许多方法和它们各自的优点。

NEAT是一种基因算法,它测试了crAIg大脑的每一次迭代运算,然后从中遴选出质量高的、繁衍它们的后代,与自然界中物种的进化非常相似。其层级是这样的:

突触/神经元:构建出crAIg大脑的组成部分

基因组:crAIg大脑的一次迭代,本质上是一堆神经元和突触。

物种:一堆基因组

世代:NEAT算法的一次迭代。这被不断地重复,让crAIg得到进化。

1. 计算适应度(fitness)

每一个世代中,第一步是计算之前世代里每个基因组各自的适应度。这包括了在每个基因组上运行同样的函数,以此让NEAT知道每个基因组是优是劣。对于crAIg来说,这意味着用某个基因组,或者说“大脑”,玩一遍超级马里奥的一个关卡。结束游戏以后,我们用这个公式来计算这个基因组的适应度:

一旦每个基因组的适应度都计算完成,我们就可以进入到算法的下一个阶段了。

2. 计算调整后的适应度(adjusted fitness)

这一部分的算法可能是最不直观的了。需要调整适应度数值是为了防止种群变得过于庞大。当一个物种的种群大小上升时,个体(基因组)的“调整后适应度”随之下降,迫使基因多样化(diversify)。

要恰当地将这个算法融入我们的代码中是相对高强度的工作,所以在crAIg这个项目中我们把它简化成了下面这个样子:

重要的事情是,现在每一个基因组都各自有一个调整后适应度数值了。

3. 适者生存

这里就是自然选择的部分!“适者生存”指的是有多少基因组可以存活到下一个世代,以及种群中会诞生多少新的后代。那篇论文没有直接写出这一部分的算法,所以这些算法大部分是通过不断试错得到的。

第一步是决定有多少个体(基因组)将要死亡,来为新生儿腾出空间。这依据整个物种的调整后适应度决定:调整后适应度越高,这个世代死亡的个体也就越多。

第二步是决定种群中应该诞生多少新生儿。这同样也是由整个物种的调整后适应度决定的。

这两部分完成以后,种群中就将有确定数量的基因组死去,并产生了确定数量的“新生儿配额”——也就是存活基因组数量与种群大小的差值。

4. 灭绝

这一部分算法实现了让一些物种被淘汰掉。有时候一个物种会走上完全错误的进化道路,于是就没有必要再留着他们继续进化了。这部分算法的逻辑非常简单:如果一个物种处在了整个世代所有物种的最后百分之X的位置,它就被标上了需要被淘汰的记号;如果一个物种连续Y个世代都被打上这个记号,那么这个物种里的所有基因组都会被消灭。

5. 交配的季节

现在来到了基因算法最有趣的部分!每个物种中都有了一定数量的基因组以及一定数量等待新生儿填补的空位。现在这些空位就要被补上了。

每个空位都需要被填补,可以通过两种方式:“无性”繁殖或者“有性”繁殖。换句话说,新生儿可以通过种群中单个基因组变异或是两个基因组融合的方式产生。在我讨论“融合”两个基因组的过程之前,我先来讨论一下变异。

变异

在NEAT中,对于一个基因组而言存在3种变异,如下所示:

(1) 突触权重

这包括了将一个基因组中所有突出的权重重新做一次分布。这可以是彻底完全的重新分布,也可以是仅仅是“扰动”(perturbed),也就是说轻微的改变。

(2) 增加突触

增加一个突触意味着,找到两个之前不相连的节点,然后用突触把它们相连。这个新突触将被赋予一个随机的权重。

(3) 增加节点

这是几种变异中最复杂(tricky)的一种。当你加入一个新节点时,你需要将现存的1个突触变成2个——在原本的两个神经元(N1,N2)之间加入一个新的神经元(N3),建立起N1与N3、N2与N3之间的突触连接。原本这个突触的权重被传递给两个新突触中的第二个,而第一个突触则获得1的权重。有一个重要的地方需要注意,原先的突触(图中红色的部分)并没有被删除,而只是被“停用”(disabled)了。这个意思是,它仍然存在于基因组中,但被标记为“不活跃”(inactive)。

当突触增加发生以后——无论通过增加节点的变异、还是通过增加突触的变异——这个新增加的突触会被标记上一个独特的“id”,称为“历史标记”,在交叉(交配)算法中需要使用到这个标记。

交叉算法

两个基因组“交配”来产生后代的过程,需要依照NEAT中一个详细描述的算法。这个算法背后的直觉性理解是,我们将一对普通的父代配对(别忘了,我们保留过它们的“历史标记”),接着拿出那些无法匹配的变异点,将它们搅和在一起(mix),匹配完成以后就创造出了子代。一旦通过这种方式造出了一个子代,它就已经经历过以上那些变异过程了。我不会太详细地解说这种算法,但如果你很好奇,那么你可以在这篇论文的Section3.2找到更详细的解释,或者你可以看我使用的代码(https://github.com/joenot443/crAIg/blob/master/NEAT/matingSeason.lua#L41)。

6. 重组物种

一旦每个物种中的新生儿都被创造完成以后,我们终于可以开始基因算法的最后一个步骤:重组物种。从本质上来说,我们先从每个物种中都选出一个“候选基因组”(candidategenome)。这个基因组现在是这个物种的代表。所有没有被选上的基因组们都被放进一个通用池(genericpool)中,然后重新规划它们的分组。重组依赖于一个称为“兼容差距公式”(compatibilitydistance equation)的公式:

这个公式确定了任意两个给定基因组有多相似(或者不相似)。我不会深入解释这个公式的原理,因为它在论文的Section3.3以及我们的代码中(https://github.com/joenot443/crAIg/blob/master/NEAT/util/calculateCompatibilityDistance.lua)已经被解释得相当好了。

如果一个基因组与任何一个候选基因组都有太大的区别,它会被立为另一个独立物种。通过这个过程,所有在通用池中的基因组都被重新归类到一个物种中。

一旦这个过程完成,新一代就搞定了,于是我们就开始着手重新计算其中每一个基因组的适应度了。

感想

虽然创造crAIg意味着在YHack比赛中只能有很少的睡眠时间,这是非常值得的,因为以下这些原因:

首先,NEAT算法是一个很复杂的算法。学习如何将一个复杂的算法融合到自己的算法中、同时又要保持自己不在它的复杂中迷失,这对于代码整洁性是一次很好的练习,虽然因为编程马拉松的原因我们在时间方面压力很大。

创造一个大部分基于一篇论文的算法,与创造一个有示范代码的算法不同,这也是一件非常有趣的事情。通常这意味着仔细查看论文中的用词,以此决定我在代码中是应该用“>”还是“>=”之类的事情。

这个项目中最困难的部分是,当我在编程的时候,我不能测试它。本质上所有的代码都是我在毫无测试的情况下编写的,然后当编写完成以后才能够测试和调试。这是有原因的:一部分是因为编程马拉松的时间限制,一部分是因为这个算法作为一个整体有许多互相串联的部分,意味着它们都需要做好准备以后我才能对代码进行测试。

整体来说,我和Joe能够在短短36小时内应对住压力、从零开始创造一个如此深度和复杂的项目,我为这件事感到高兴和自豪。我们不仅享受了这场比赛、对名次也很开心,我们也很高兴能够成功教会crAIg一些酷炫的技能,比如在第一关中跳过第二根水管:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2015-12-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 新智元 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
用GPT生成《超级马里奥》游戏关卡,近9成关卡可玩
机器之心报道 编辑:赵阳、张倩 AIGC 正在变革游戏产业。 最近一年来,生成式 AI 在绘画、文本、代码等创作领域的表现越来越成熟,OpenAI 的聊天机器人 ChatGPT 更是将这一趋势推向舆论顶点。而 AIGC 在游戏领域的进展也备受关注,投资公司 a16z 不久前发表过一篇研究文章《AIGC 在游戏中的革命》,认为在所有娱乐类目中,游戏会是生成式 AI 影响最大的领域。 在之前的报道中,我们提到过 AIGC 在游戏音乐、剧情生成中的一些应用案例(见文末「相关阅读」)。此外,还有不少研究者专注于关
机器之心
2023/02/23
6560
用GPT生成《超级马里奥》游戏关卡,近9成关卡可玩
开发 | 机器学习小白入门指引,开年也要规划好小目标
网按:本文为Cookie Engineer写就,主要对机器学习进行了简单的介绍,AI科技评论编译,未经许可不得转载。 经常有人问我如何开始学习机器学习,他们面临的最大困难就是机器学习背后的数学原理。我承认其实我也不喜欢数学。数学是对事物的一种抽象描述,用数学来描述机器学习,会过于抽象,且不容易理解。因此在这个系列的文章中,我尝试使用伪代码或者JavaScript来描述我所讲述的内容。 我在GitHub上创建了项目仓库,我会将一些实验代码同步到代码库中,以便您可以跟随我的步骤,或者在这些实验代码之上实现自己的
AI科技评论
2018/03/09
7960
开发 | 机器学习小白入门指引,开年也要规划好小目标
别的AI还在打游戏,这个AI已经当上“超级马里奥”游戏策划了|GECCO最佳论文
AI打游戏已经不是什么新鲜事了,“沉迷”Dota 2、星际争霸、LOL的AI一个接一个的出现。
量子位
2018/08/08
7080
别的AI还在打游戏,这个AI已经当上“超级马里奥”游戏策划了|GECCO最佳论文
神经进化:一种不一样的深度学习
编者按:近年来,神经网络借鉴了生物学策略的相关理论知识,实现了大飞跃,完成了之前无法完成的任务。神经进化作为人工智能的一个研究领域,试图通过进化算法而非随机梯度下降来设计和构建神经网络。本文作者Paul Pauls,作为机器学习GDE和开源爱好者,他在Medium上写了一篇关于神经进化算法的文章,详细介绍了神经进化算法的基本概念,以及这几年重要的研究成果。
AI科技评论
2020/02/20
4960
马里奥 AI 实现方式探索 :神经网络+增强学习(下)
接《马里奥 AI 实现方式探索 :神经网络+增强学习(上)》 马尔可夫决策过程(MDP) 一提到马尔科夫,大家通常会立刻想起马尔可夫链(Markov Cha
肖力涛
2017/08/18
2.4K1
马里奥 AI 实现方式探索 :神经网络+增强学习(下)
谷歌、哈佛联手绘出「百万分之一」人脑神经3D连接图!天量数据竟可塞满14亿块1T硬盘
去年夏天,哈佛大学和谷歌的研究人员联合发布了第一张部分人脑的连接图。针头大小的组织被保存下来,用重金属染色,切成5000片,并在电子显微镜下成像。
新智元
2021/12/13
6080
谷歌、哈佛联手绘出「百万分之一」人脑神经3D连接图!天量数据竟可塞满14亿块1T硬盘
Nature子刊:最先进的人工神经网络离人类水平还有多远?
尽管近年来人工智能取得了许多进步,但人工神经网络仍远未接近人类的智能。ANN可以在国际象棋和围棋等游戏中打败人类对手,但在大多数维度上——语言、推理和常识——它们甚至没有达到四岁儿童的认知能力。
新智元
2019/08/27
5890
Nature子刊:最先进的人工神经网络离人类水平还有多远?
老司机养成:教神经网络变身《马里奥赛车》高手 | 论文+代码
问耕 编译整理 量子位 出品 | 公众号 QbitAI 神经网络持续在游戏界立功,这次拿下的是经典游戏:《马里奥赛车64》,而且只需要很小的计算力就能完成。 先来看看成果,这段视频是训练两天半之后的表
量子位
2018/03/27
9000
老司机养成:教神经网络变身《马里奥赛车》高手 | 论文+代码
教遗传算法人工智能玩超级马里奥大陆
这是教授 AI 为 GameBoy 玩超级马里奥乐园系列的第一篇文章,在这里我将向您展示如何开发遗传算法 AI 以使用 Python 玩超级马里奥乐园。(完整代码文末)
deephub
2021/07/23
8450
教遗传算法人工智能玩超级马里奥大陆
学界 | NEAT学习:教机器自我编程
选自medium 机器之心编译 参与:Nurhachu Null、路雪 本文介绍了一种机器学习方法:通过增强拓扑的进化神经网络(Evolving Neural Networks through Augmenting Topologies,NEAT)。该方法受到进化过程的启发,能够将复杂问题分解,进而解决问题。 在这篇文章中我要阐述一种机器学习方法,叫作「通过增强拓扑的进化神经网络」(Evolving Neural Networks through Augmenting Topologies,NEAT)。
机器之心
2018/05/10
1.2K0
深度学习之后,或可从进化论中找到新的突破口
开放的环境与物种间的竞争是达尔文进化论中实现自然进化的两个重要的驱动力,而这两个驱动力在最近的 AI 模型演进方法的研究工作中却没有体现出来,在同一个世代中,更快的黑斑羚和更快的猎豹比它们更慢的同类更容易生存下来——由此进化出更快的黑斑羚和猎豹品种。基于基因和自然选择理论的这些原理可以帮助AI获得大的进步么?
AI科技评论
2019/11/07
6740
深度学习之后,或可从进化论中找到新的突破口
使用神经网络+遗传算法玩转Flappy Bird | 教程
问耕 编译整理 量子位 出品 | 公众号 QbitAI 震惊!《Flappy Bird》火了这么多年,竟然没有中文名字。 没事。这不妨碍各路AI大触用这款游戏练手。比方说今天这个HTML5教程,就是教你使用神经网络+遗传算法,搭建一个玩转小鸟的AI。 提前说一下,教程最后有这个AI的代码下载。所有的代码都是使用Phaser框架使用HTML5完成的。另外,神经网络使用了突触神经网络(Synaptic Neural Network)库,而不是从零开始搭建。 Demo 上面是Demo演示的截图,访问下面这
量子位
2018/03/27
2.1K0
使用神经网络+遗传算法玩转Flappy Bird | 教程
教会机器“自动编程”? 来看看NEAT学习方法!
作者 | Murat Vurucu 编译 | 聂震坤 什么是NEAT? NEAT全称是增强拓扑神经网络(Neuroevolution of augmenting topologies),描述了在人类进
用户1737318
2018/07/20
9200
一条命通关,这个AI算法玩超级马里奥操作秀翻天丨视频+开源代码
从1-1到7-1,只要一条命,就能全部通过,而且操作几乎没有迟疑,如行云流水一般。
量子位
2019/06/03
6920
开发 | 如何从零训练神经网络玩游戏?这里有一段详细的解读视频
AI科技评论消息,最近,Youtube 上的知名游戏博主 SethBling 训练了一个叫 MariFlow 的神经网络来玩 Mario Kart 游戏。在进行15个小时的游戏训练并做了一些针对性的改进后,这个神经网络在 50cc Mushroom Cup 中获得了金牌。 这并不是 SethBling 第一次在游戏中应用神经网络“通关”。此前 SethBling 曾经创建了另一个神经网络MarI/O,通过训练,这个神经网络自己演变成玩“超级马里奥世界”(Super Mario World)的高手。SethB
AI科技评论
2018/03/14
1.5K0
开发 | 如何从零训练神经网络玩游戏?这里有一段详细的解读视频
如何用人工智能秒杀超级马里奥游戏
关键时刻,第一时间送达! 近日,Einfach nerdig 在 Youtube 上发起了一个直播:通过人工智能学习系统来播放“超级马里奥”。目前这个直播仍然很受欢迎。 人工智能系统 MarI/O
企鹅号小编
2018/02/07
1.6K0
如何用人工智能秒杀超级马里奥游戏
DeepMind深度强化学习实践:教计算机玩超级马里奥(代码)
【新智元导读】AlphaGo 的主要设计人 David Silver 曾说过,游戏是人工智能绝好的测试台。让算法学会玩游戏,对创造能够与真实世界进行复杂互动的人工智能非常重要。新智元介绍过很多 DeepMind 使用深度强化学习,训练算法玩经典 Atari 游戏的文章。现在,有一位程序员在他们的基础上,修改代码,教算法玩超级马里奥。你也可以自己动手实践,“在游戏中学习”。 训练好的算法是这样玩超级马里奥的~ (文/ehrenbrav)今年早些时候我碰巧看见了 Seth Bling 训练计算机玩超级马里奥的视
新智元
2018/03/23
1.9K0
Science:人类在实验室创建了微型“大脑”,含祖先基因的那种
来自加州大学圣地亚哥分校的科学家们,将古基因变体引入人类多功能干细胞,最终生成了大脑器官体。
量子位
2021/02/26
2790
Science:人类在实验室创建了微型“大脑”,含祖先基因的那种
马里奥 AI 实现方式探索 :神经网络+增强学习(上)
导语 在深圳的研发部培训中,我们组给定一个有趣的课题便是:马里奥游戏的智能通关,本文就神经网络和增强学习两个点进行整理,并将我们最后用的NEAT算法以及扩展找到的DRL算法进行了简单梳理。如果能够在游
肖力涛
2017/08/16
2.5K1
马里奥 AI 实现方式探索 :神经网络+增强学习(上)
如何丝滑地入门神经网络?写个AI赛车游戏,只训练4代就能安全驾驶
一开始,它们什么都不懂,刚开局就GG。但有了进化算法 (Evolution) ,AI可以在一代一代更迭中,掌握强大的游戏技能。
量子位
2019/04/24
1K0
如何丝滑地入门神经网络?写个AI赛车游戏,只训练4代就能安全驾驶
推荐阅读
用GPT生成《超级马里奥》游戏关卡,近9成关卡可玩
6560
开发 | 机器学习小白入门指引,开年也要规划好小目标
7960
别的AI还在打游戏,这个AI已经当上“超级马里奥”游戏策划了|GECCO最佳论文
7080
神经进化:一种不一样的深度学习
4960
马里奥 AI 实现方式探索 :神经网络+增强学习(下)
2.4K1
谷歌、哈佛联手绘出「百万分之一」人脑神经3D连接图!天量数据竟可塞满14亿块1T硬盘
6080
Nature子刊:最先进的人工神经网络离人类水平还有多远?
5890
老司机养成:教神经网络变身《马里奥赛车》高手 | 论文+代码
9000
教遗传算法人工智能玩超级马里奥大陆
8450
学界 | NEAT学习:教机器自我编程
1.2K0
深度学习之后,或可从进化论中找到新的突破口
6740
使用神经网络+遗传算法玩转Flappy Bird | 教程
2.1K0
教会机器“自动编程”? 来看看NEAT学习方法!
9200
一条命通关,这个AI算法玩超级马里奥操作秀翻天丨视频+开源代码
6920
开发 | 如何从零训练神经网络玩游戏?这里有一段详细的解读视频
1.5K0
如何用人工智能秒杀超级马里奥游戏
1.6K0
DeepMind深度强化学习实践:教计算机玩超级马里奥(代码)
1.9K0
Science:人类在实验室创建了微型“大脑”,含祖先基因的那种
2790
马里奥 AI 实现方式探索 :神经网络+增强学习(上)
2.5K1
如何丝滑地入门神经网络?写个AI赛车游戏,只训练4代就能安全驾驶
1K0
相关推荐
用GPT生成《超级马里奥》游戏关卡,近9成关卡可玩
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档