教程:用强化学习玩转恐龙跳跳

摘要: 本文用强化学习作一个相似障碍跑的小游戏

DeepMind在2013年发表了一篇题为《用深度强化学习玩Atari》的文章,介绍了一种新的用于强化学习的深度学习模型,并展现了它仅使用原始像素做为输入来掌握Atari 2600计算机游戏难度控制策略的能力。在本教程中,我将使用Keras实现本文。咱们将从加强学习的基础开始,而后深刻代码中进行实践性的理解。python

clipboard.png

AI玩游戏git

我在2018年3月初开始了这个项目,并取得了一些不错的成果。可是,只有CPU的系统是学习更多功能的瓶颈。强大的GPU极大地提高了性能。github

在咱们运行模型以前,咱们须要了解许多步骤和概念。算法

步骤:chrome

在浏览器(JavaScript)和模型(Python)之间构建双向接口
捕获和预处理图像
训练模型
评估
源代码:https://github.com/Paperspace...浏览器

入门

要按照原样训练和玩游戏,请在设置环境后克隆GitHub存储库网络

Git克隆:https://github.com/Paperspace...架构

并在jupyter notebook上工做。框架

Reinforcement Learning Dino Run.ipynb机器学习

确保你第一次运行init_cache()来初始化文件系统结构。

强化学习

对许多人来讲,这多是一个新词,但咱们每一个人都已经学会了使用强化学习(RL)的概念,这就是咱们的大脑仍然工做的方式。奖励系统是任何RL算法的基础。若是咱们回到儿童走路的比喻,积极的奖励将是来自父母的鼓掌或可以获得糖果,而负面奖励将是没有糖果。孩子在开始走路以前首先学会站起来。就人工智能而言,代理商的主要目标(在咱们的案例中是Dino)是经过在环境中执行特定的操做序列来最大化某个数值奖励。RL中最大的挑战是缺少监督(标记数据)来指导代理人。它必须本身探索和学习。代理从随机执行行动开始,观察每一个行动带来的回报,并学习如何在面临相似环境情况时预测最佳行动。

clipboard.png

一个普通的强化学习框架

Q-learning

咱们使用Q-learning, RL的一种技术,在这里咱们尝试去近似一个特殊的函数,它能够驱动任意环境状态序列的动做选择策略。Q- Learning是一种没有模型的强化学习的实现,它根据每一个状态、所采起的行动和所产生的奖励来维护一个Q值表。一个示例q表应该告诉咱们数据是如何构造的。在咱们的例子中,状态是游戏截图和动做,什么都不作,而后跳转[0,1]。

clipboard.png

样本Q表

咱们利用深度神经网络经过回归来解决这个问题,并选择具备最高预测Q值的动做。有关Q-learning的详细了解,请参阅Tambet Matiisen撰写的这篇使人惊叹的博客文章。你也能够参考我之前的文章,了解全部Q-learning特有的超参数。

创建

让咱们设置咱们的环境来开始训练过程。

1.选择虚拟机:

咱们须要一个完整的桌面环境,在这里咱们能够捕获和利用屏幕截图进行培训。我选择了一个Paperspace ML-in-a-box(MLIAB)Ubuntu镜像 MLIAB的优点在于它预装了Anaconda和许多其余ML库。clipboard.png

clipboard.png

盒子中的机器学习

2.配置和安装Keras以使用GPU:

咱们须要安装keras和tensorflow的GPU版本。Paperspace的虚拟机具备这些预先安装的,可是若是不安装它们的话

pip install keras

pip install tensorflow

另外,确保GPU能够被设置识别。执行下面的python代码,你应该看到可用的GPU设备

from keras import backend as K

K. tensorflow_backend._get_available_gpus()

3.安装依赖项

Selenium pip install selenium

OpenCV pip install opencv-python

http://chromedriver.chromium....

游戏框架

你能够经过将浏览器指向chrome://dino或只要拔掉网络插头来启动游戏。若是咱们想修改游戏代码的话,另外一种方法是从chromium的开源存储库中提取游戏。

咱们的模型是用python编写的,游戏是用JavaScript构建的,咱们须要一些接口工具让它们相互通讯。

【Selenium是一种流行的浏览器自动化工具,用于向浏览器发送操做,并获取当前分数等不一样的游戏参数。】

如今咱们有一个接口来发送动做到游戏中,咱们须要一种机制来捕获游戏屏幕。

【Selenium和OpenCV分别为屏幕捕获和图像预处理提供了最佳性能,实现了6-7 fps的降低帧率。】

咱们每一个时间帧只须要4帧,足以将速度做为一项功能来学习。

游戏模块

咱们使用这个模块实现了Python和JavaScript之间的接口。下面的代码片断会给你一个关于模块中发生的事情的要点。

clipboard.png

代理模块

咱们使用代理模块来封装全部的接口。咱们使用此模块控制Dino,并获取环境中的代理状态。

clipboard.png

游戏状态模块

要将操做发送到模块并得到环境做为该操做的结果转换为的结果状态,咱们使用游戏状态模块。它经过接收和执行动做、决定奖励和返回经验元组来简化过程。

clipboard.png

图像管道

图像捕捉

咱们能够经过多种方式捕获游戏屏幕,例如使用PIL和MSS python库截取整个屏幕和裁剪区域。 然而,最大的缺点是对屏幕分辨率和窗口位置的敏感度。幸运的是,游戏使用了HTML Canvas。咱们可使用JavaScript轻松得到base64格式的图像。咱们使用selenium来运行这个脚本。

clipboard.png

clipboard.png

从画布中提取图像

clipboard.png

图像处理

所捕获的原始图像的分辨率约为600x150,有3个(RGB)通道。咱们打算使用4个连续的屏幕截图做为模型的一个输入。这就使得咱们对尺寸600x150x3x4的单个输入。这在计算上是昂贵的,并非全部的功能均可用于玩游戏。因此咱们使用OpenCV库来调整大小、裁剪和处理图像。最终的处理输入仅为80x80像素和单通道(灰度)。

clipboard.png

clipboard.png

图像处理

模型架构

咱们获得了输入和一种利用模型输出来玩游戏的方法,让咱们来看看模型架构。

咱们使用了一系列的三层卷积层,而后将它们压平为密集层和输出层。仅限CPU的模型不包含池化层,由于我已经删除了许多功能,而且添加池化层会致使已稀疏功能的显着损失。但借助GPU的强大功能,咱们能够容纳更多功能,而不会下降帧频。

【最大池图层显着改善了密集特征集的处理。】

clipboard.png

模型架构

咱们的输出图层由两个神经元组成,每一个神经元表明每一个动做的最大预测回报。而后咱们选择最大回报(Q值)。

clipboard.png

训练

这些是训练阶段发生的事情:

以无动做开始并得到初始状态(s_t)
观察游戏步数
预测并执行操做
在回放记忆中存储经验
从回放记忆中随机选择一个批次并在其上训练模型
从新开始游戏结束
这个代码很长,但很容易理解

clipboard.png

clipboard.png

请注意,咱们正在从回放记忆中抽取32次随机经验回放,并使用批量的训练方法。其缘由是游戏结构中的动做分配不平衡,以及避免过分拟合。

结果

咱们应该可以经过使用这个体系结构获得好的结果。GPU显著改善告终果,经过平均分数的提升能够验证。下图显示了训练开始时的平均成绩。每10场游戏的平均分在训练结束时都保持在1000分以上。

clipboard.png

每10场游戏的平均分数

最高的记录是4000+,远远超过了以前250的模型(也远远超出了大多数人的能力!)图中显示了训练期间游戏最高分数的进度(比例= 10)。

clipboard.png

每10场游戏最高得分

Dino的速度与分数成正比,这使得它更难以检测并以更快的速度进行动做。所以整个游戏都是在恒定的速度下进行的。本博客中的代码片断仅供参考。请参考GitHub repo中的函数代码,并添加其余设置。

本文做者:【方向】

阅读原文

本文为云栖社区原创内容,未经容许不得转载。

相关文章
相关标签/搜索