两分钟demo:强化学习玩Flappy bird

两分钟demo:强化学习玩Flappy bird

这次的两分钟深度学习demo要讲的是强化学习的一个方向 Deep Q-learning 和它用来自主学习玩Flappy bird无限续命。计时开始。

Demo 演示

系统要求:X11,python,MXNet。这个 Demo 需要 MXNet 作为深度学习平台运行,请按照安装说明自行安装,github 传送门 github.com/dmlc/mxnet

DQN Flappy bird github 传送门 github.com/li-haoran/DR 感谢 li-haoran 老师的辛勤工作。在 git clone 之后,执行 python FlappyBirdDQN.py 就可以看到如题图所示的训练画面,在坚强的小鸟失败几万次之后,它就能学会飞翔了。视频链接 weibo.com/tv/v/EdctuiQS

注意:如果之前没有安装 pygame 这个软件包,请使用 pip install pygame 安装。

li-haoran 老师提供的代码使用CPU训练。如果你的电脑有支持CUDA的nVidia显卡并已安装CUDA和MXNet,可以在 BrainDQN_mx.py 的 22 行把 ctx=mx.cpu() 改成 ctx=mx.gpu(0) 即可转换成GPU训练,速度快很多。这里的参数0是GPU设备序号,如果你像我一样有一些4卡GPU的机器,可以自行指定GPU设备。


理论知识


什么是强化学习?它是机器学习的一个方向,“强调如何基于环境而行动,以取得最大化的预期利益。” [1] 在这个demo里,我们用 Q-learning 的方法,定义 Q 函数为需要优化的预期利益(value),通过智能体尝试执行一系列动作使智能体从一个状态转移到另外一个状态,得到一个由动作结果产生的奖励(reward),并更新 Q 函数。比如说 Flappy bird 这个游戏里,周围环境定义为很多管子,动作定义为“跳一下”,状态定义为当前小鸟的位置、与周围环境的位置、速度、角度等的组合,奖励就是小鸟是不是撞墙死了。通过不断尝试在不同状态(小鸟的位置等)上执行“跳一下”这个动作并得到“死了没有”的奖励,最终 Q-learn 可以学习到一套基于周围环境的的行动方法,取得的最大化利益就是长久不死,无限 +1s。想知道关于更多 Q-learning 的数学背景,请参考 wikipedia

那么 Deep 何来?在DeepMind的Atari游戏论文里,他们把 Q-learning 的 Q 函数求值和深度卷积网络结合,用当前状态的图像(像素数组)作为一个卷积网络的输入,用这个网络输出当前的 Q value,并由此结合动作+衰减+收益得到损失函数。具体实现请有兴趣的观众朋友参见 BrainDQN_mx.py 代码的 56 行开始的sym函数。

思考题

  1. MXNet通过什么方法指定计算设备是CPU还是GPU?如果有多个GPU怎么选择哪个GPU?
  2. li-haoran 老师提供的代码是一个通用方法,不只是可以玩Flappy bird,还可以玩打乒乓球等。在Flappy bird里,动作被定义为“跳一下”,如果是 DeepMind论文里的打弹珠球,动作被定义为什么?(加分题)你能否通过修改 li-haoran 老师的代码实现 DeepMind 论文里的自动打弹珠球?如果你有用MXNet等深度学习实现的自动玩弹珠球的代码,请评论留言,我会去给你点赞的。

两分钟阅读时间结束。这是后记。写这个专栏的想法是介绍一些用MXNet实现的有趣的深度学习demo给感兴趣的观众朋友们,这个demo本身并不能在两分钟内把任何一个人教成深度学习专家。用两分钟的时间运行起来一个小demo,顺便学习里面提到的知识点比如今天的强化学习、DQN等可以从链接的wikipedia和github开始自我探索学习,我觉得这是感兴趣的观众朋友入门的好方法。观众朋友们对于本文提到的知识点有任何问题或建议,请在下面留言讨论。


当然了,搞深度学习还是要用最好用的平台 MXNet

参考文献

  1. 强化学习的 wikipedia 简介, Q-learning 的 wikipedia 简介
  2. DRL flappy bird的MXNet实现基于 yenchenlin 老师的 TensorFlow 实现 github.com/yenchenlin/D 并感谢评论指出原作者@Flood Sung 一并感谢辛勤工作
  3. MXNet 文档Awesome MXNet 范例列表
编辑于 2016-11-30 00:09