用深度强化学习玩FlappyBird

简介: 用深度强化学习玩FlappyBird

1. 前言


   作为深度强化学习的一个很好的入门学习教程,用深度强化学习玩FlappyBird这个示例一直是个很火的代码,网上也有不少的文章介绍。不过其大多从代码角度介绍,如果需要输入了解其理论与原理我们则需要更多论文资料。这里我翻译整理了相关论文并加入些自己的理解写在这篇博文中,详细可参考论文Deep Reinforcement Learning for Flappy Bird,具体关于深度强化学习的代码介绍将在后面的博文中介绍。


2. 简介及问题定义


   FlappyBird是一款游戏,玩家控制的对象是游戏中的“小鸟”,在游戏运行瞬间有两个可以采取的动作:按下“上升”键,使得小鸟向上跳跃,而未按下任何按键时小鸟则以恒定速率下降。

   如今,深度学习通过组合低层特征形成更加抽象的高层表示属性类别或特征,以发现数据的分布式特征表示,使得机器学习模型可以直接学习概念,如直接从原始图像数据进行物体类别分类。深层卷积神经网络采用平铺分层卷积滤波器层来模拟视野接受域的影响,在处理计算机视觉问题上,如分类和检测问题,获得了很大成功。本文目的是开发一个深层神经网络模型,具体地,是利用图像中的不同对象训练卷积神经网络,进行基于游戏画面场景状态分析进行图像识别分类。从原始像素中学习游戏的特性,并决定采取相应行动,本质上是一个对游戏场景中特定状态的模式识别过程,在此设计了一个强化学习系统,通过自主学习来玩这款游戏。

   当通过很少预定的行为进行编程不能充分解决问题时,可采用强化学习方式,这是一种通过进行场景训练,使算法在输入未知和多维数据(如彩色图片)时做出正确的决策方式。通过这种方式,可以进行在线学习,而且算法可以学会自动对图像进行特征提取,对于训练中未出现的场景和状态也同样可以进行分类和预测。




图1.FlappyBird游戏


3. 相关工作与实现方法


3.1 相关工作


   谷歌DeepMind利用深度学习技术玩游戏的影响,为从一个完全不同的视角去看待人工智能问题铺平了道路。其最新成果人工智能AlphaGo,在其与围棋大师的激烈竞争中向人们展示了深度学习的巨大潜力。DeepMind以前仅仅根据游戏原始图片就能学习和玩2600种雅达利游戏。Mnih等人,使用强化学习成功训练玩这些游戏的模型,在多种游戏[1],[2]中超过了人类专家级别。他们提出了一种新的模型,即结合了深层神经网络的强化学习的深度Q网络(DQN)模型,以深层神经网络作为近似函数代表Q学习中的Q值(动作值)。他们还论述了一些提高训练效率和稳定性的技术,使用以前经验的“经验回放”,从中随机抽取小批量来更新网络,以便将模型得到的经验和延迟更新联系起来,从而获得目标值(稍后详细介绍)以提高稳定性。该通道的另一个优点是完全无需标记的数据,该模型通过与游戏模拟器的交互,并随着时间的推移学会做出很好的决策。正是这种简单的学习模型以及在玩Atari游戏时的惊人结果,启发我们采用一个类似的算法来完成本文所涉及的项目。


3.2 实现方法


   本文是通过训练一个深度卷积神经网络模型(深度Q学习网络)进行特定游戏状态下图像的识别与分类。深度Q学习网络是一个经改进过的Q学习算法训练得到的卷积神经网络,其输入是原始的游戏画面,输出是一个评价未来奖励的价值函数。人工智能系统的任务是提取游戏运行的图像,并输出从可采取的操作集合中提取的必要执行动作。这相当于一个分类问题,不过与常见的分类问题不同,这里没有带标记的数据来训练模型。可以采用强化学习,根据执行游戏并基于所观察到的奖励来评价一个给定状态下的动作,以此来进行模型训练。


3.3 构建模型


   游戏中小鸟可以采取的动作是煽动翅膀向上飞(a=1)或不做任何动作(a=0)。当前状态(框架)是由经预处理的当前帧原始图像(Xt)与有限数量的先前帧图像(Xt−1, Xt−2,…)构成。这样,每一个状态都将唯一地对应小鸟运动到某一位置所遵循的运动轨迹,从而向模型提供实时信息,先前存储的帧数成为超参数。理想情况下,St是从t=1开始的所有帧的函数,不过为了减少状态空间,只使用有限的数量帧。如前所述,当鸟撞到管道或屏幕边缘时,可以给其一个负面奖励,如果通过了间隙,可得到一个正面的奖励。这样可以像人类玩家一样,尽量避免死亡并尽可能多得分。因此,有两个奖励,分别是rewardPass和rewardDie。折扣系数(γ)为0.9,用于从未来动作贴现的奖励。


4. Q学习算法


   强化学习的目标是使总回报(奖励)最大化。在Q学习中,它是非策略的,迭代更新使用的是贝尔曼方程

Qi+1(s,a)=r+γmaxa′Qi(s′,a′)

   其中s′和a′分别是下一帧的状态和动作,r是奖励,γ是折扣因子。Qi(s,a)是为(s,a)矩阵在第i次迭代的Q值。这种更新迭代将收敛得到一个最佳的Q函数。为了防止学习僵化,这个动作值函数可以用一个函数(这里为深度学习网络)近似,以便能更好概括不可预见的状态。学习算法的输入点由st, at, rt, st+1,的列表构成,函数能够通过这些输入点来构建一个能最大限度提高整体回报并以此预测动作的模型。将这里的函数构建为一个卷积神经网络,并使用上述方程中的更新规则更新其参数。以下两个方程为使用损失函数及其梯度来模拟这个函数。

L=∑s,a,r,s′(Q(s,a;θ)−(r+γmaxa′Q(s′,a′;θ−)))2

ΔθL=∑s,a,r,s′−2(Q(s,a;θ)−(r+γmaxa′Q(s′,a′;θ−)))ΔθQ(s,a;θ)

   其中,θ是训练后的DQN参数, θ−(在后面的章节中解释)是Q值函数的非更新参数。因此,可以简单地使用上述损失函数的随机梯度下降法和反向传播算法更新神经网络权重(θ)。算法1是为训练而设计的算法,是一种加强探索的ε贪婪算法。当训练进行时,有ε的概率会随机选择动作或选择最优动作aopt=argmaxa′Q(s,a′;θ),其中ε随着更新次数的增加逐渐减小到0。


4.1 预处理


   Flappy Bird游戏直接输出的像素是284×512的,但为了节省内存将其缩小为84×84大小的图像,每帧图像色阶都是0-255。此外,为了提高卷积神经网络的精度,在这一步去除背景层并用纯黑色背景代替,以去除噪声,如图2所示。依次对所得游戏图像进行缩放、灰度化以及调整亮度处理。在当前帧进入一个状态之前,处理几帧图像叠加组合的多维图像数据(如在模型构建部分提到的),当前帧与先前帧重叠时,灰度稍有降低,当我们远离最新帧时强度降低。因此,这样输入的图像将提供关于小鸟当前所在轨迹的良好信息,其处理过程如图3所示。



图2.去除游戏背景



图3. 图像处理流程图(其中红色块代表卷积层,绿色块代表最大池化层,蓝色部分代表全连接层)


4.2 DQN结构


   如图4所示,在当前模型结构中,有3个隐藏层。首先有两个卷积层,然后是两个完全连接层,最终完全连接层的输出是两个动作的得分,结果由损失函数得出。改进的损失函数自动进行Q学习参数设置。遵循空间批量规范,在每个卷积层后都添加ReLu和最大池化层。此外,在第一个仿射层(该批规范输出反馈到最终的仿射层)后是一个ReLu激活函数和批量处理标准层。卷积层采用32个大小为3,步长为1,带有2×2最大池化核的滤波器。输入图像的大小84×84,每个时刻有两种可能的输出操作,每次动作将会获得一个得分值,以此决定最佳动作。


表1. 各层参数变化情况



Layer

Input

Filter size

Stride

Num filters

Activation

Output

conv1

84×84×4

8×8 4

32

ReLU

20×20×32

pooling1

20×20×32    





10×10×32

conv2

10×10×32

3×3

1

64

ReLU

8×8×64

pooling2

8×8×64    





4×4×64

conv3

4×4×64

3×3

1

64

ReLU

2×2×64

pooling3

2×2×64





1×1×64

Fc1

1×1×4    





64×1

Fc2

1×64





2×1

 

   考虑到模型处理的精度,可以适当提高模型的复杂度,这里将卷积层的数目改进为3个,同时有3个池化层,两个全连接层,开始时叠加连续4帧预处理后的图像作为输入,表1详细列出了后的模型在每个步骤上的数据尺寸变化及各层参数。



图4. 卷积神经网络结构图


4.3 经验回放与稳定性


   在Q学习中,以连续方式记录的经验数据是高度相关的。若使用相同的顺序更新DQN参数,训练过程就会受到干扰。与从一个标记的数据集中采样小批量训练分类模型类似,这里同样应该在抽取出的获得更新的DQN经验中引入一定的随机性。为此设置一个经验回放存储器,用来存储每帧游戏画面的经验数据(st,at,rt,st+1),直到达到其最大存储容量。重现的经验数据填充到一定的数量,随机抽取小批经验并用于进行DQN参数上的梯度下降。以固定的时间间隔更新DQN参数。由于小批量选择结果的随机性,用于更新DQN参数的数据是去相关的。

   为了提高损失函数收敛的稳定性,使用方程2中提到的带参数θ−的贝尔曼更新方程重现DQN模型。参数θ−是每次DQN的C值更新之后θ的更新值,用来计算算法1中yj的值。


4.4 训练设计


   整个DQN训练流程如算法1所示。如本节前面部分提到的,经验数据都存储在回放存储器中,每隔一段时间,从存储器随机采样出一小批样本,用于对DQN参数进行梯度下降运算。同网络参数θ−一样,必要时需要适当更新探索的概率。



   游戏输出的得分作为唯一的评价指标,为了使结果具有健壮性,取几次游戏的平均得分而不是一次的得分。设置一个衰减值,使ε因子在测试和训练中逐渐减小为零。这是在更多的训练和学习时,进行模型决策的保证。


5. 实验与结果


5.1 训练参数


   模型参数:Flappy Bird游戏每秒播放10帧,最近的4帧图像处理后进行组合,生成一个状态;贴现因子γ设置为0.9;奖励设置:rewardPass = + 1.0, rewardDie=-1.0。

   DQN参数:探索概率ε在600000更新中从0.6线性下降到0。回放存储器的大小设置为20000,每有500次经验,就对存储器数据进行一次小批量采样。每次C更新到100时,目标模型θ−的参数更新一次。小批量的32次经验数据中,随机抽取每5帧更新DQN参数。

   训练参数:来更新DQN参数的梯度下降更新法是学习率为1e−6,β1=0.9,β2=0.95的Adam优化器。在试错基础上选择这些参数,用来观察损失值的收敛性。卷积权重初始化为均值为0,方差为1e−2的正态分布。


5.2 结果与分析


   训练结束后,用模型测试了一些游戏状态,以检测是否能得出合理的结果。图5示出了一些游戏场景及其相应的预测分数,其结果显示模型准确地对状态进行了分类。



图5. 示例游戏场景及其相应的分数。(5a是一个鸟必须跳起来的场景,5b是一个鸟儿必须往下走的场景)

   为了更好地理解经过训练的卷积神经网络模型的工作原理,输出图像5b在经过卷积层后的图像,以实现可视化。可以看出,大多数激活显示出空隙和鸟的边缘处清晰的斑块(图6)。可以明显地推断,神经网络在学习寻找小鸟与空隙的相对位置。



图6. 卷积层激活


   在大多数的在雅达利游戏上所做得实验[3],采用L2的损失函数。这里尝试了L1的损失函数(下式)来引入一些正则化。这使得学习率的图像一开始就非常陡峭,如图7所示。通过这两种情况可以看出,平均得分稳步上升,表明该模型正在稳步学习。

L=∑s,a,r,s′∣∣∣Q(s,a;θ)−(r+γmaxa′Q(s′,a′;θ−)∣∣∣



图7. 两种不同损失函数的学习曲线

   从表2中可以看出,训练出的DQN模型取得了远超人类水平的良好成绩,在这样一个角色扮演的动画游戏中,可以看到,尽管有时鸟儿会死亡,但它总是力图通过水管间的空隙,最可能撞毁的是在间隙的边缘处。对此可以做的是提高模型的能力,可行的解决方案是使用不同的奖励方案,让小鸟走一条远离管道顶部和底部的路径。而人类玩家在玩游戏时也是尽力使小鸟保持在水管间隙中心位置,这同样可以通过一个精心设计的奖励方案实现。


表2. 两种损失函数下模型测试结果



Human

DQN with L1

DQN with L2

Avg score

4.25

65

72

Max score

21

215

309


5.3 训练时间


表3. 一定学习率时DQN的平均分


Training iterations

Score

99000

43.6

199000

101.8

299000

35.7

399000

201.3


   训练迭代的次数指的是DQN更新的次数,结果如表3所示,可以看出,更多的训练次数并不意味着一定能提高模型预测结果的准确性(这里是对瞬时游戏状态下,最佳执行动作的判断分类)。实际上,更多次的训练存在许多不稳定性以及结果振荡情况,过多次数的训练,模型会出现过拟合情况。这些情况需要在进一步的研究中加以解决,一个可能采取的解决方法是训练时减小学习率或者构建复杂度神经网络模型。

相关文章
|
并行计算 Ubuntu 机器人
计算机视觉教程7-3:Openpose配置与实践
计算机视觉教程7-3:Openpose配置与实践
2409 0
计算机视觉教程7-3:Openpose配置与实践
|
机器学习/深度学习 编解码 算法
【动手学计算机视觉】第九讲:传统目标检测之DPM模型
DPM模型在我心里的印象一直都非常深刻,不仅是因为它非常经典,此外,它是我进入CV领域看的第一篇文章。还记得当初开始做项目时,老师就发给我一篇文章,并反复声明,要认真研究,好好学习。我反复把这篇文章看了很多遍,也把源码看了几遍,真是深深的被这个神作惊叹到了。真不愧为传统目标识别领域的经典之作,虽然时间过去很多年,特征提取加机器学习这一套在效率上远不如深度学习,但是DPM的影响力和思想依然非常有生命力,从后面深度学习模型中经常可以看到DPM的身影,DPM的原文从2009年至今引用已经超过8000次,它的价值可见一斑,下面就来介绍一下这个经典的目标检测模型。
【动手学计算机视觉】第九讲:传统目标检测之DPM模型
|
机器学习/深度学习 算法 计算机视觉
深度学习目标检测系列:一文弄懂YOLO算法|附Python源码
本文是目标检测系列文章——YOLO算法,介绍其基本原理及实现细节,并用python实现,方便读者上手体验目标检测的乐趣。
46239 0
|
3月前
|
人工智能 并行计算 PyTorch
AI计算机视觉笔记十八:Swin Transformer目标检测环境搭建
本文详细记录了Swin Transformer在AutoDL平台上的环境搭建与训练过程。作者从租用GPU实例开始,逐步介绍了虚拟环境的创建、PyTorch安装、mmcv及mmdetection的配置,并解决了安装过程中遇到的各种问题,如cython版本冲突等。最后,通过修改代码实现目标检测结果的保存。如需了解更多细节或获取完整代码,请联系作者。原文链接:[原文链接](请在此处插入原文链接)。
|
3月前
|
人工智能 开发工具 计算机视觉
AI计算机视觉笔记三十:yolov8_obb旋转框训练
本文介绍了如何使用AUTODL环境搭建YOLOv8-obb的训练流程。首先创建虚拟环境并激活,然后通过指定清华源安装ultralytics库。接着下载YOLOv8源码,并使用指定命令开始训练,过程中可能会下载yolov8n.pt文件。训练完成后,可使用相应命令进行预测测试。
|
3月前
|
人工智能 PyTorch 算法框架/工具
AI计算机视觉笔记二十二:基于 LeNet5 的手写数字识别及训练
本文介绍了使用PyTorch复现LeNet5模型并检测手写数字的过程。通过搭建PyTorch环境、安装相关库和下载MNIST数据集,实现了模型训练与测试。训练过程涉及创建虚拟环境、安装PyTorch及依赖库、准备数据集,并编写训练代码。最终模型在测试集上的准确率达到0.986,满足预期要求。此项目为后续在RK3568平台上部署模型奠定了基础。
|
3月前
|
机器学习/深度学习 人工智能 测试技术
AI计算机视觉笔记二十五:ResNet50训练部署教程
该项目旨在训练ResNet50模型并将其部署到RK3568开发板上。首先介绍了ResNet50网络,该网络由何恺明等人于2015年提出,解决了传统卷积神经网络中的退化问题。项目使用车辆分类数据集进行训练,并提供了数据集下载链接。环境搭建部分详细描述了虚拟环境的创建和所需库的安装。训练过程中,通过`train.py`脚本进行了15轮训练,并可视化了训练和测试结果。最后,项目提供了将模型转换为ONNX和PT格式的方法,以便在RK3568上部署。
|
7月前
|
机器学习/深度学习 算法 关系型数据库
【PyTorch深度强化学习】DDPG算法的讲解及实战(超详细 附源码)
【PyTorch深度强化学习】DDPG算法的讲解及实战(超详细 附源码)
2239 1
|
7月前
|
机器学习/深度学习 数据采集 算法
深度强化学习中深度Q网络(Q-Learning+CNN)的讲解以及在Atari游戏中的实战(超详细 附源码)
深度强化学习中深度Q网络(Q-Learning+CNN)的讲解以及在Atari游戏中的实战(超详细 附源码)
217 0
|
机器学习/深度学习 传感器 算法
深度强化学习
深度强化学习
186 0