DeepMind深度强化学习实践:教计算机玩超级马里奥(代码)
我的图书馆
DeepMind深度强化学习实践:教计算机玩超级马里奥(代码)
1 新智元编译1&来源:&译者:王楠、弗格森【新智元导读】AlphaGo 的主要设计人 David Silver 曾说过,游戏是人工智能绝好的测试台。让算法学会玩游戏,对创造能够与真实世界进行复杂互动的人工智能非常重要。新智元介绍过很多 DeepMind 使用深度强化学习,训练算法玩经典 Atari 游戏的文章。现在,有一位程序员在他们的基础上,修改代码,教算法玩超级马里奥。你也可以自己动手实践,“在游戏中学习”。训练好的算法是这样玩超级马里奥的~(文/ehrenbrav)今年早些时候我碰巧看见了 Seth Bling 训练计算机玩超级马里奥的视频。Seth 使用的是生成算法,表现超凡。不过,那是 15 年前的算法了。大约在同一时间,我看见了谷歌 DeepMind 用算法教计算机玩经典 Atari 游戏的视频。令我印象深刻的有两点:①他们只用了像素以及得分作为网络的输入,②每一局都使用相同的算法。这感觉有些接近万能算法(Universal Algorithm):一个过程能够适用于无数的任务。我尤其喜欢谷歌的强化学习方法----机器并不需要了解它所学习的内容。重要的就是它所看见的像素、它能采取的行动,以及因此而得到的奖励(或惩罚)。为什么不用深度Q网络(DQN)学习玩超级马里奥呢?背景说明谷歌的 Atari 项目使用了街机学习环境(Arcade Learning Environment,ALE)训练和测试模型。因此,我首先要做的,就是开发类似的模拟器,用于玩超级马里奥。我使用开源的 FCEUX 模拟器构建任天堂娱乐系统(相关代码在这里:/ehrenbrav/FCEUX_Learning_Environment),然后修改了谷歌 DeepMind 的代码,让程序运行超级马里奥(下文简称“超级玛丽”)。一开始结果堪忧。超级玛丽比大多数 Atari 游戏复杂多了,而且奖励往往在实际动作发生了之后一会儿才进行,当然这也是强化学习由来已久的一个问题。渐渐地,对于机器来说应该过了整整几星期,我调整参数,有了些起色。但即使如此,很多时间玛丽就是站着,动也不动。由此,我决定当他向右边移动就给个奖励,向左移动就进行惩罚。我原本不想这么做,因为这有悖于我打算只使用得分计算奖励的初衷。但后来我想通了----人在玩超级玛丽的时候,一开始也是拼命往右边走,尽量活得长久,玩到了一定程度后,比较熟悉游戏了,才开始想要怎么多得分。我这么做了以后,成效显著。但必须指出,相比谷歌 DeepMind 纯粹依靠分数训练的方法,我的已经不那么纯粹了。此外,我发现玛丽还有个缺点----他毫不在意死亡,一次一次一次一次……又一次地撞上那些喽?。因此,我增加了一条死亡则进行惩罚的设置。有了这些设定以后,根据超级玛丽这款游戏的特点,我不断调整参数,提升表现,比如将第三层卷积层从 64 调整为 128。篇幅有限,新智元编译到这里,具体设置请看原文(链接见文末)。没有经过训练的算法深度 Q 学习(DQN)详解简单介绍一下我使用的神经网络,这是从谷歌 DeepMind 的基础上修改而来的:输入:八 84x84 灰度帧;第 1 层(卷积):32 8x8 核,stride = 4 像素,后跟非线性整流器第 2 层(卷积):64 4x4 核,stride = 2 像素,后跟非线性整流器第 3 层(卷积):128 3x3 核,stride = 1 像素,后跟非线性整流器第 4 层(全连接):512个整流器输出:15步可能步骤的值有了这一个神经网络,使用权重θ (写作Q(s,a;θ))来逼近我在上面描述的函数,我们可以开始处理这一问题。在经典的“监督”学习任务中,由人通过展示每个带有不同标签的样本来训练机器。这就是 ImageNet 比赛中的图像分类的方法:该学习算法被给予大量的图片,图片被人为地分为2000个种类。机器在这些数据中进行训练,然后进行选择,看最后的匹配度是多少。监督学习中的一个问题是,你需要真的有人来打标签。在我们的例子中,你会需要为数不清的场景中的最佳行动打标签,这几乎是不可能完成的。所以,我们需要让机器自己找到这些行动。那么,人类是如何学习玩超级玛丽的?首先,你肯定从游戏手柄上的各个按钮一个个尝试开始的。一旦你发现游戏中的一些行为起了作用,你就会玩了。其中的风险是,你是以一种特定的方法学习玩游戏,所以你在受阻时,需要说服自己重新开始。在计算机科学的术语中,这叫做 Explore/Exploit Dilemma:你花在探索新技巧上的时间VS深入你已经知道的技巧的时间。如果你把所有的时间都花在探索上,那么你的分数就不会很高,如果你一直在深入,那么你可能会陷入死局(在计算机科学中,称为局部最小值)。在深度Q学习中,这可以用一个叫Epsilon的参数来捕捉 (ε):这理解起来很简单,你玩的是一个随机动作,而不是神经网络推荐的动作。当游戏开始时,(随机)设置是到100%。随着游戏进行,你的经验在增加,这一数字开始不断下降。至于下降的速度有多快,这就是深度Q学习的一个关键参数。尝试改变参数,看看会发生什么。所以,当马里奥需要选择自己行动时,他把现有的状态 t 输入到Q函数中,然后选择能够获得最大分数的行动(at)。用数学公式来表示,马里奥的选择是:at = maxaQ(s, θ)&还有概率值ε,也不是在执行行动,而是在随机选择行动。那么这一学习过程到底是怎么运行的? Q 函数开始时拥有一个随机的权重,所以,从某处程度上说,这些需要调整的权重能让马里奥开始学习。每一个行动展开时,计算机会存储几件事:行动开始前的时间点(t)的状态,行动用a 表示,行动之后的游戏状态是st 1,回报是r。所有的这些称为一个实验,组合起来叫回放记忆。在马里奥进行游戏的过程中,他的每一个动作都会从回放记忆中随机选择这些实验,使用他们提升自己忘了的精度(这是谷歌的一个创新)。这是Q学习的核心算法:某个时间点的状态表示为t(叫st,记得状态包含过去的几个游戏画面),每一个可能的行动价值等同于回报(r),这是我们期待从行动和结果状态(st 1)折扣的最佳行动价值中获得的。未来状态的价值被用一个叫gamma(γ)的数量打折,是因为未来的回报的价值并没有立即获得的价值高。如果我们把gamma设为1,机器会把未来的价值等于现有的回报价值。Gamma设置得很低,会让你的计算机变成一个“享乐主义”者,只关心即刻的最佳回报,而不考虑未来更大的回报。用数学公式来表达,这个过程可以表示为:r γmaxaS(st 1, θ)这让我们获得了一个评估行动状态的方法。对于每一个学习步骤来说, 机器把自己基于经验的预测和真实的未来回报结合起来。神经网络的权重使用一个叫静态梯度下降的算法,把二者拉近。网格改变自身权重的频率叫学习率(learning rate)。首先,高的学习率对于我们这些没有耐心的人来说简直是完美,因为越快当然越好,不是吗?这里的问题是,网络可能会在不同的策略间来回跳动,从不会真的平静下来。随着你从头至尾走完了整个过程,希望你的网络已经学会如何这个游戏。通过足量的观察这些状态-行动-结果记忆。我们希望机器会开始把这些连接起来,形成一个通用的战略,能处理短期和长期的目标。训练中的算法,动作稍显迟缓,但已经有模有样在实际中,这一起意味着,你有大量的手段可用。这也是机器学习的吸引力所在,因为你可以无穷尽地调整这些参数,来获得更好的结果。但是,每一次运行这个网络都会花费很长时间,有太多的数据需要处理,即使学习率已经尽可能地快了。GPU帮了大忙,因为它可以并行计算,但是即便是这样,其速度也只是赶上通用的硬件速度。在这个项目中,我试着在亚马逊云上运行,但是,即使是用目前可用的最强大的工具,也比不上我自己家里面的机器。所以,如果你是谷歌或者亚马逊的研究员,可以获得强大的计算能力,那你可以做得很好。如果只是普通黑客,你可能要耐心等等了。原文地址:/2016/08/teaching-your-computer-to-play-super-mario-bros-a-fork-of-the-google-deepmind-atari-machine-learning-project/【号外】由中国自动化学会和新智元联合主办的AI全球年度盛典『AI WORLD 2016世界人工智能大会』即将盛大开幕。大会官网:/
TA的最新馆藏
喜欢该文的人也喜欢安全检查中...
请打开浏览器的javascript,然后刷新浏览器
< 浏览器安全检查中...
还剩 5 秒&