本文转载自1024开发者社区
虽然没有谷歌强大的集和DeepMind变态的算法的团队,但基于深度强化学习(Deep Q Network DQN )的自制小游戏AI效果同样很赞。先上效果图:
下面分四个部分,具体给大家介绍。
/1/背景介绍
2013年DeepMind团队发表论文“Playing Atari with Deep Reinforcement Learning”,用Q-Network模型成功让AI玩起了Atari系列游戏。并于2015年在Nature上发表了一篇升级版,“Human-level control through deep reinforcement learning”,自此,在这类游戏领域,人已经无法超过机器了。AI玩游戏的姿势是这样的:
后来的故事大家都很熟悉了,AlphaGo击败世界冠军,星际争霸2职业选手也被打败,连大家接触较多的王者荣耀也不能幸免。
/2/深度强化学习模型
看完了轻松的部分,下面简单介绍一下模型。DQN是DRL的一种算法,它将卷积神经网络(CNN)和Q-Learning结合起来。
Q-learning是强化学习的一种,原理图如下:
也就是Agent在观察得到当前的状态state和回报reward的基础上,选取输出一个动作action,进而影响环境,使环境状态和回报都产生变化。通过不断循环让Agent学习如何在环境中获得更高的回报。
卷积神经网络CNN是图像处理领域非常经典的神经网络模型,在本模型中,输入是原始图像数据,输出为每个动作action对应的评估值。
因此DQN总体结构是这样的:
图比较简单,但原理很清晰,是将Agent中的模型用CNN来代替,环境的State为游戏界面截图,输出为AI的动作,在飞机大战中就是飞机向左、向右还是不动。回报reward具体为,在一次循环中没有被击中为0.1,被击中为-1,击中敌机为1。图中回放记忆单元、当前网络和目标网络都是为了将CNN这种需要大量样本的监督学习融合在强化学习模型中的手段。篇幅限制这里只是概述性的介绍,后期会专门讲。
/3/模型实现
3.1程序的总体结构
程序主函数在PlaneDQN.py中,与DQN模型相关的函数在BrainDQN_Nature.py中,游戏模型在game文件夹中,训练过程保存的训练值在saved_networks文件夹中。
3.2主函数搭建
大家注意看while循环里的结构,其实非常明确:
- getaction()为在当前的Q值下选取动作
- framestep()为运行环境,并输出观测值
- process()为对图像数据进行处理的函数
- setPerception()根据图像和回报,对网络进行训练
3.3 游戏类GameState和framestep
通过pygame实现游戏界面的搭建,分别建立子弹类、玩家类、敌机类和游戏类,结构代码所示。
其中GameState中的framestep()函数,是整个DQN运行一次使环境发生变化的基础函数,该函数运行一次,会根据inputaction进行动作实施,接着会在该时段对界面上的元素进行移动,并判断是否撞击。最后通过get_surface获取界面图像,最后返回环境的image_data,reward和游戏是否停止的terminal。本文游戏效果图为:
为提高模型收敛速度,在实际运行时将背景图片去掉。
3.4 DQN模型类
该部分为DQN模型的核心,主要有根据参数建立CNN网络的createQNetwork(),进行模型训练的trainQNetwork(),进行动作选择的getAction()。
3.5图像处理
图像预处理调用cv2库函数,对图像进行大小和灰度处理。
/4/环境搭建
- 系统:Ubuntu16.04、win10
- Python3.5
- pygame 1.9.4
- TensorFlow1.11(GPU版)
- OpenCV-Python
公众号中回复“AI飞机”,获取代码,包含训练500000次的结果。本程序对硬件要求不高,显存2GB以上就可运行。