练成不死鸟 —— 把机器学习应用到Flappy Bird上

本文由 极客范 - dreamtea 翻译自 The Hack。欢迎加入极客翻译小组,同我们一道翻译与分享。转载请参见文章末尾处的要求。

破解

这篇文章是对最近很火的Flappy Bird游戏的一个破解。虽然这款游戏已经从谷歌应用和苹果商店下架,但是这并没有停止人们在网络上去创造更好的复制品。而且人们已经创造了很多有趣的游戏变体,如Flappy Brid Typing Tutor和Flappy Math Saga。

在玩了这个游戏一段时间后,我萌生让我的机器自己去学习怎么玩Flappy Bird的想法。上面的视频展示了训练好的Flappy Bird能够避开全部管道的结果。

怎么做

首先,我想在安卓应用上来实现破解,而且我计划使用Monekyrunner去获得屏幕截图以及发出点击指令。但是获得屏幕截图要有1-2秒的延迟,这肯定使得响应不够迅速。之后,我找到了@mrspeaker的游戏引擎,Omega500和他的Flappy Bird的版本来进行输入练习。我去掉了原有的输入组件并加入了一些javascript的Q学习代码。

增强学习

这里有一条基本的准则:这个例子中的Flappy Bird,在一个状态代理会表现一个确定的动作。之后它会自己找到一个新的状态并且基于这个状态得到一个补偿。在不同的情况下有很多变体可以使用,如:策略迭代法、值迭代法、Q学习等等。

Q学习(Q Learning)

我使用了Q学习是因为它是增强学习的一个免费模型。这意味着我不需要对小鸟的力学特征建模;像如何升高下降,对点击的反应以及其它一些特性。

这里有一个对Q学习的良好精准的描述。下面是算法实现:

RLAlgorithm

  • 输入:
  • S代表一个状态集
  • A代表一个动作集
  • γ代表折扣率
  • α代表迭代步长

 

  • 本地:
  • 实际序列Q/S,A/
  • 前一状态s
  • 前一动作a
  • 任意初始状态Q/S,A/
  • 观察当前状态s

 

  • 重复:
  • 选择和执行一个动作a
  • 观察反馈r和状态s’
  • 2
  • 2直到终止

 

状态空间

我将我的空间通过下面的参数离散化:

  • 到下部管道的垂直距离
  • 到下一组管道的水平距离
  • 生命:存活或者死亡

StateSpace

动作

在每个状态,有两种可能的动作:

  • 点击
  • 什么都不做

 

反馈

反馈的结构仅仅依赖于生命参数:

  • +1如果小鸟儿依旧存活
  • -1000如果小鸟儿死忙

 

学习过程

序列Q被初始化为0而且我总是选择那些能将我所期望的反馈最大化的最优动作。为了打破这种绑定我选择“什么都不做”因为这是一种最常见的动作。

步骤1:观察飞翔的小鸟儿在什么状态然后执行一个最大化期望反馈的动作。

使得游戏引擎执行它的“标记”。飞翔的小鸟儿进入下一个状态。

步骤2:观察新的状态s’得到相关联的反馈。如果小鸟还活着那么+1否则-1000。

步骤3:根据Q学习准则更新Q序列。

2

我选择alpha为0.7是因为我们有一个确定性的状态而且我想要使得学习进度加快。同样的折扣因子和lambda是1。

步骤4:当前状态更新为s’然后重新开始

 

下一个步骤

  • 要达到足够好(得到150分)大约需要6-7个小时来训练飞翔的小鸟儿。这个过程可以通过初始化多个小鸟儿来加快进度而且这可以使得它们的所有“学习”贡献给同一个Q序列。
  • 另一种使得学习过程更快的方式是让使用者提供较好的输入。目前,你可以点击屏幕来使得小鸟进行跳跃。但是,这种输入并不会被学习者考虑。
  • 使得这个能够在移动端工作!!如果任何人有任何想法,请通过评论的方式让我知道J

开发小组

我想要对@mrspeaker表示深深地感谢,因为他开发了Omega500游戏引擎并且完全开源!



原文链接: The Hack 翻译: 极客范 - dreamtea

译文链接: http://www.geekfan.net/8717/

[ 转载请保留原文出处、译者和译文链接。]

浙大计算机小硕一枚@梦如茶DreamTea

1 条评论

  1. vvilp  /  2014 年 6 月 9 日, 下午 8:03 回复

    翻译的不好

    免费模型?有收费模型吗?

    Thumb up 3 Thumb down 0

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">