首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >DeepMind深度强化学习实践:教计算机玩超级马里奥(代码)

DeepMind深度强化学习实践:教计算机玩超级马里奥(代码)

作者头像
新智元
发布2018-03-23 15:20:56
1.8K0
发布2018-03-23 15:20:56
举报
文章被收录于专栏:新智元新智元

【新智元导读】AlphaGo 的主要设计人 David Silver 曾说过,游戏是人工智能绝好的测试台。让算法学会玩游戏,对创造能够与真实世界进行复杂互动的人工智能非常重要。新智元介绍过很多 DeepMind 使用深度强化学习,训练算法玩经典 Atari 游戏的文章。现在,有一位程序员在他们的基础上,修改代码,教算法玩超级马里奥。你也可以自己动手实践,“在游戏中学习”。

训练好的算法是这样玩超级马里奥的~

(文/ehrenbrav)今年早些时候我碰巧看见了 Seth Bling 训练计算机玩超级马里奥的视频。Seth 使用的是生成算法,表现超凡。不过,那是 15 年前的算法了。大约在同一时间,我看见了谷歌 DeepMind 用算法教计算机玩经典 Atari 游戏的视频。

令我印象深刻的有两点:①他们只用了像素以及得分作为网络的输入,②每一局都使用相同的算法。这感觉有些接近万能算法(Universal Algorithm):一个过程能够适用于无数的任务。

我尤其喜欢谷歌的强化学习方法——机器并不需要了解它所学习的内容。重要的就是它所看见的像素、它能采取的行动,以及因此而得到的奖励(或惩罚)。为什么不用深度Q网络(DQN)学习玩超级马里奥呢?

背景说明

谷歌的 Atari 项目使用了街机学习环境(Arcade Learning Environment,ALE)训练和测试模型。因此,我首先要做的,就是开发类似的模拟器,用于玩超级马里奥。

我使用开源的 FCEUX 模拟器构建任天堂娱乐系统(相关代码在这里:https://github.com/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, a; θ)

还有概率值ε,也不是在执行行动,而是在随机选择行动。

那么这一学习过程到底是怎么运行的?

Q 函数开始时拥有一个随机的权重,所以,从某处程度上说,这些需要调整的权重能让马里奥开始学习。每一个行动展开时,计算机会存储几件事:行动开始前的时间点(t)的状态,行动用a 表示,行动之后的游戏状态是st+1,回报是r。所有的这些称为一个实验,组合起来叫回放记忆。在马里奥进行游戏的过程中,他的每一个动作都会从回放记忆中随机选择这些实验,使用他们提升自己忘了的精度(这是谷歌的一个创新)。

这是Q学习的核心算法:某个时间点的状态表示为t(叫st,记得状态包含过去的几个游戏画面),每一个可能的行动价值等同于回报(r),这是我们期待从行动和结果状态(st+1)折扣的最佳行动价值中获得的。未来状态的价值被用一个叫gamma(γ)的数量打折,是因为未来的回报的价值并没有立即获得的价值高。如果我们把gamma设为1,机器会把未来的价值等于现有的回报价值。Gamma设置得很低,会让你的计算机变成一个“享乐主义”者,只关心即刻的最佳回报,而不考虑未来更大的回报。用数学公式来表达,这个过程可以表示为:

r + γmaxaS(st+1, a; θ)

这让我们获得了一个评估行动状态的方法。对于每一个学习步骤来说, 机器把自己基于经验的预测和真实的未来回报结合起来。神经网络的权重使用一个叫静态梯度下降的算法,把二者拉近。

网格改变自身权重的频率叫学习率(learning rate)。首先,高的学习率对于我们这些没有耐心的人来说简直是完美,因为越快当然越好,不是吗?这里的问题是,网络可能会在不同的策略间来回跳动,从不会真的平静下来。

随着你从头至尾走完了整个过程,希望你的网络已经学会如何这个游戏。通过足量的观察这些状态-行动-结果记忆。我们希望机器会开始把这些连接起来,形成一个通用的战略,能处理短期和长期的目标。

训练中的算法,动作稍显迟缓,但已经有模有样

在实际中,这一起意味着,你有大量的手段可用。这也是机器学习的吸引力所在,因为你可以无穷尽地调整这些参数,来获得更好的结果。但是,每一次运行这个网络都会花费很长时间,有太多的数据需要处理,即使学习率已经尽可能地快了。

GPU帮了大忙,因为它可以并行计算,但是即便是这样,其速度也只是赶上通用的硬件速度。在这个项目中,我试着在亚马逊云上运行,但是,即使是用目前可用的最强大的工具,也比不上我自己家里面的机器。所以,如果你是谷歌或者亚马逊的研究员,可以获得强大的计算能力,那你可以做得很好。如果只是普通黑客,你可能要耐心等等了。

原文地址:http://www.ehrenbrav.com/2016/08/teaching-your-computer-to-play-super-mario-bros-a-fork-of-the-google-deepmind-atari-machine-learning-project/

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
GPU 云服务器
GPU 云服务器(Cloud GPU Service,GPU)是提供 GPU 算力的弹性计算服务,具有超强的并行计算能力,作为 IaaS 层的尖兵利器,服务于深度学习训练、科学计算、图形图像处理、视频编解码等场景。腾讯云随时提供触手可得的算力,有效缓解您的计算压力,提升业务效率与竞争力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档