程序员带你一步步分析AI如何玩Flappy Bird

本文介绍了如何使用卷积神经网络(CNN)、Deep Q Network(DQN)和TensorFlow实现AI玩Flappy Bird游戏。通过CNN模型处理游戏屏幕截图,DQN算法进行强化学习训练,最终实现AI自动玩游戏。文章涵盖了游戏展示、模型构建、算法原理和TensorFlow代码实现,展示了深度学习在游戏控制中的应用。
摘要由CSDN通过智能技术生成

以下内容来源于一次部门内部的分享,主要针对AI初学者,介绍包括CNN、Deep Q Network以及TensorFlow平台等内容。由于笔者并非深度学习算法研究者,因此以下更多从应用的角度对整个系统进行介绍,而不会进行详细的公式推导。

* 关于Flappy Bird *
Flappy Bird(非官方译名:笨鸟先飞)是一款2013年鸟飞类游戏,由越南河内独立游戏开发者阮哈东(Dong Nguyen)开发,另一个独立游戏开发商GEARS Studios发布。—— 以上内来自《维基百科》
Flappy Bird操作简单,通过点击手机屏幕使Bird上升,穿过柱状障碍物之后得分,碰到则游戏结束。由于障碍物高低不等,控制Bird上升和下降需要反应快并且灵活,要得到较高的分数并不容易,笔者目前最多得过10分。

本文主要介绍如何通过AI(人工智能)的方式玩Flappy Bird游戏,分为以下四个部分内容:
1. Flappy Bird 游戏展示
2. 模型:卷积神经网络
3. 算法:Deep Q Network
4. 代码:TensorFlow实现

一、Flappy Bird 游戏展示

在介绍模型、算法前先来直接看下效果,上图是刚开始训练的时候,画面中的小鸟就像无头苍蝇一样乱飞,下图展示的是在本机(后面会给出配置)训练超过10小时后(训练步数超过2000000)的情况,其最好成绩已经超过200分,人类玩家已基本不可能超越。

训练数小于10000步(刚开始训练)
训练步数大于2000000步(10小时后)

由于本机配置了CUDA以及cuDNN,采用了NVIDIA的显卡进行并行计算,所以这里提前贴一下运行时的日志输出。

关于CUDA以及cuDNN的配置,其中有一些坑包括:安装CUDA之后循环登录,屏幕分辨率无法正常调节等等,都是由于NVIDIA驱动安装的问题,这不是本文要讨论的主要内容,读者可自行Google。

  • 加载CUDA运算库

加载CUDA运算库

  • TensorFlow运行设备* /gpu:0 *

TensorFlow运行设备/gpu:0

* /gpu:0 *这是TensorFlow平台默认的配置方法,表示使用系统中的第一块显卡。

本机软硬件配置:
系统:Ubuntu 16.04
显卡:NVIDIA GeForce GTX 745 4G
版本:TensorFlow 1.0
软件包:OpenCV 3.2.0、Pygame、Numpy、…

细心的朋友可能发现,笔者的显卡配置并不高,GeForce GTX 745,显存3.94G,可用3.77G(桌面占用了一部分),属于入门中的入门。对于专业做深度学习算法的朋友,这个显卡必然是不够的。知乎上有帖子教大家怎么配置更专业的显卡,有兴趣的可以移步。

二、模型:卷积神经网络

神经网络算法是由众多的神经元可调的连接权值连接而成,具有大规模并行处理、分布式信息存储、良好的自组织自学习能力等特点。人工神经元与生物神经元结构类似,其结构对比如下图所示。

生物神经元
人工神经元

人工神经元的输入(x1,x2…xm)类似于生物神经元的树突,输入经过不同的权值(wk1, wk2, ….wkn),加上偏置,经过激活函数得到输出,最后将输出传输到下一层神经元进行处理。

单神经元输出函数

激活函数为整个网络引入了非线性特性,这也是神经网络相比于回归等算法拟合能力更强的原因。常用的激活函数包括sigmoid、tanh等,它们的函数表达式如下:
sigmoid函数

tanh双曲正切函数

这里可以看出,sigmoid函数的值域是(0,1),tanh函数的值域是(-1,1)。

* 卷积神经网络*起源于动物的视觉系统,主要包含的技术是:

  1. 局部感知域(稀疏连接);
  2. 参数共享;
  3. 多卷积核;
  4. 池化。

    • 1. 局部感知域(稀疏连接)

全连接网络的问题在于:
1. 需要训练的参数过多,容器导致结果不收敛(梯度消失),且训练难度极大;
2. 实际上对于某个局部的神经元来讲,它更加敏感的是小范围内的输入,换句话说,对于较远的输入,其相关性很低,权值也就非常小。

人类的视觉系统决定了人在观察外界的时候,总是从局部到全局。

比如,我们看到一个美女,可能最先观察到的是美女身上的某些部位(自己体会)。

因此,卷积神经网络与人类的视觉类似,采用局部感知,低层的神经元只负责感知局部的信息,在向后传输的过程中,高层的神经元将局部信息综合起来得到全局信息。

全连接与局部连接的对比(图片来自互联网)

从上图中可以看出,采用局部连接之后,可以大大的降低训练参数的量级。

  • 2. 参数共享

虽然通过局部感知降低了训练参数的量级,但整个网络需要训练的参数依然很多。

参数共享就是将多个具有相同统计特征的参数设置为相同,其依据是图像中一部分的统计特征与其它部分是一样的。其实现是通过对图像进行卷积(卷积神经网络命名的来源)。

可以理解为,比如从一张图像中的某个局部(卷积核大小)提取了某种特征,然后以这种特征为探测器,应用到整个图像中,对整个图像顺序进行卷积,得到不同的特征。
卷积过程(图片来自互联网)

每个卷积都是一种特征提取方式,就像一个筛子,将图像中符合条件(激活值越大越符合条件)的部分筛选出来,通过这种卷积就进一步降低训练参数的量级。

  • 3. 多卷积核

如上,每个卷积都是一种特征提取方式,那么对于整幅图像来讲,单个卷积核提取的特征肯定是不够的,那么对同一幅图像使用多种卷积核进行特征提取,就能得到多幅特征图(feature map)

不同的卷积核提取不同的特征(图片来自互联网)

多幅特征图可以看成是同一张图像的不同通道,这个概念在后面代码实现的时候用得上。

  • 4. 池化

得到特征图之后,可以使用提取到的特征去训练分类器,但依然会面临特征维度过多,难以计算,并且可能过拟合的问题。从图像识别的角度来讲,图像可能存在偏移、旋转等,但图像的主体却相同的情况。也就是不同的特征向量可能对应着相同的结果,那么池化就是解决这个问题的。

池化过程(图片来自互联网)

池化就是将池化核范围内(比如2*2范围)的训练参数采用平均值(平均值池化)或最大值(最大值池化)来进行替代。

终于到了展示模型的时候,下面这幅图是笔者手画的(用电脑画太费时,将就看吧),这幅图展示了本文中用于训练游戏所用的卷积神经网络模型。

卷积神经网络模型

图像的处理过程

  1. 初始输入四幅图像80×80×4(4代表输入通道,初始时四幅图像是完全一致的),经过卷积核8×8×4×32(输入通道4,输出通道32),步距为4(每步卷积走4个像素点),得到32幅特征图(feature map),大小为20×20;
  2. 将20×20的图像进行池化,池化核为2×2,得到图像大小为10×10;
  3. 再次卷积,卷积核为4×4×32×64,步距为2,得到图像5×5×64;
  4. 再次卷积,卷积核为3×3×64*64,步距为2,得到图像5×5×64,虽然与上一步得到的图像规模一致,但再次卷积之后的图像信息更为抽象,也更接近全局信息;
  5. Reshape,即将多维特征图转换为特征向量,得到1600维的特征向量;
  6. 经过全连接1600×512,得到512维特征向量;
  7. 再次全连接512×2,得到最终的2维向量[0,1]和[1,0],分别代表游戏屏幕上的是否点击事件。

可以看出,该模型实现了端到端的学习,输入的是游戏屏幕的截图信息(代码中经过opencv处理),输出的是游戏的动作,即是否点击屏幕。深度学习的强

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值