Python玩CartPole(DQN)

2018-08-06 18:20:04 浏览数 (11888)

本文转载至知乎ID:Charles(白露未晞)知乎个人专栏

下载W3Cschool手机App,0基础随时随地学编程>>戳此了解

导语

利用Python搭建简单的深度强化学习网络(DQN)玩CartPole这个小游戏。。。

这是来自PyTorch官方教程的一个简单实例。

感觉还是挺有意思的~~~

直接进入正题吧~~~

内容较长,做好心理准备~~~


相关文件

百度网盘下载链接: https://pan.baidu.com/s/1G-Z_Mpdd4aXnsTqNKvZbZw

密码: xf7x

参考文献

官方英文教程链接:

http://pytorch.org/tutorials/intermediate/reinforcement_q_learning.html

另外:

对英文文献阅读有困难的同学也不必担心,我已经把这个教程翻译为中文放到了相关文件中。

同时,我也在微信公众号“Charles的皮卡丘”底部菜单栏“资料共享”→“整理汇总”中分享了(即强化学习实例1)。

整理汇总”中也有翻译自官方文档的PyTorch60分钟快速入门教程,以及我自己结合一些讲座和tutorials整理的强化学习基础教程。


开发工具

系统:Windows10

Python版本:3.6.4

相关模块:

gym模块;

numpy模块;

matplotlib模块;

PIL模块;

torch模块;

torchvision模块;

以及一些Python自带的模块。

其中PyTorch版本为:

0.3.0


环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

补充说明:

PyTorch暂时不支持直接pip安装。

有两个选择:

(1)安装anaconda3后在anaconda3的环境下安装(直接pip安装即可);

(2)使用编译好的whl文件安装,下载链接为:

https://pan.baidu.com/s/1dF6ayLr#list/path=%2Fpytorch


原理介绍

(1)增强学习

为了便于大家更好地理解,我决定从增强学习开始讲起,当然只讲其主要思想,不作深入讨论。

在AI领域,我们一般使用Agent来表示一个具备行为能力的物体,例如最近比较火的无人车。那么增强学习考虑的问题就是Agent和环境environment之间交互的任务。比如假设我们有一只AI皮卡丘:

现在我们要让这只皮卡丘去捡左上角的饭团。那么皮卡丘周围的物体包括饭团就是环境,皮卡丘通过外部的比如摄像头来感知环境(不妨假设皮卡丘的眼睛就是一对摄像头),然后皮卡丘需要输出一系列的动作来实现捡起饭团这个任务。

当然你也可以让皮卡丘去完成其他任务。

不过,不管是什么样的任务,都包含了一系列的动作action观察observation还有反馈值Reward

所谓的Reward就是Agent执行了动作与环境进行交互后,环境会发生变化,变化的好与坏就是Reward来表示的。比如上面的例子:

如果皮卡丘离饭团变近了,那么Reward就应该是正的,否则就应该是负的。

接下来这里用了Observation观察一词而不是环境那是因为Agent不一定能得到环境的所有信息,比如皮卡丘上的摄像头就只能得到某个特定角度的画面。因此,只能用Observation来表示Agent获取的感知信息。事实上,人与环境交互也是如此。

在每个时间点,Agent都会从可以选择的动作集合A中选择一个action执行。这个动作集合可以是连续的也可以是离散的,动作集合的数量将直接影响整个任务的求解难度。

那么知道了整个过程,任务的目标就出来了,那就是要能获得尽可能多的Reward。没有目标,控制也就无从谈起,因此,获取Reward就是一个量化的标准,Reward越多,就表示执行地越好。每个时间片,Agent都是根据当前的观察来确定下一步的动作。每次的观察就作为Agent的所处状态state。因此,状态state和动作Action存在映射关系,也就是一个state可以对应一个action,或者对应不同动作的概率(常常用概率表示)。那么state到action的过程就称之为一个策略Policy。当然,也可以是之前的一系列的状态动作集合到action的映射。

综上所述,增强学习的任务就是找到一个最优的策略policy从而使reward最多。

当然,我们一开始并不知道最优的策略是什么,因此往往从随机的策略开始,使用随机的策略进行试验,就可以得到一系列的状态、动作和反馈。也就是一系列的样本Sample。增强学习的算法就是需要根据这些样本来改进policy,从而使得得到的样本的reward更好。正是这种让reward越来越好特性,该算法才被称为增强学习。

(2)Q-Learning

由于增强学习的样本是一个时间序列,因此将增强学习的问题模型化,就引入了马尔科夫决策过程。

简单的说,就是我们可以假设:

Agent的下一个状态仅取决于当前的状态和当前的动作。注意这里的状态是完全可观察的全部的环境状态。也就是说,只要我们有一个初始状态,后继状态就是全部确定的(绝大多数的增强学习都可以模型化为马尔科夫决策问题。

当然现实情况环境一般不完全可观察,然后有一些随机性,那么只能进行估计。

既然一个状态对应一个动作,或者动作概率,而有了动作,下一个状态也就确定了。这就意味着每个状态可以用一个确定的值来进行描述。可以由此判断一个状态是好的状态还是不好的状态。比如之前的皮卡丘往左上角走肯定是好的状态,往右下角走肯定是不好的状态。那么状态的好坏其实等价于对未来回报的期望。因此我们可以引入回报Return来表示某个时间的状态将具备的回报。另外我们再引入一个概念估值函数,用估值函数来表示一个状态未来的潜在价值,也就是变成了皮卡丘向左上角看感觉那边是饭团然后左上角的估值就高了。也就是说估值函数是回报的期望值。定义出估值函数接下来就是如何求解的问题了

这部分我决定一带而过而不是放上一堆公式来吓人。

实际上,求解估值函数只需要从定义出发进行简单的推导即可。最后可以证明估值函数是可以通过迭代来进行计算的。

考虑到每个状态之后都有多种动作可以选择,每个动作之下的状态又都不一样,我们更关心某个状态下的不同动作的估值。即根据每个动作的估值来选择最好的一个去执行,这就是动作估值函数Q。需要注意的是这里的reward是执行完动作之后得到的reward,而之前的reward是state对应的reward即多种动作对应的reward的期望值。

显然,现在我们要求解的是最优动作估值函数。这可以利用估值迭代的方法进行求解,其核心思想是每次根据新得到的reward和原来的Q值来更新现在的Q值。Q-Learning的思想完全根据估值迭代得到。

但是实际情况下,我们没有办法遍历所有的状态还有所有的动作,我们只能得到有限的样本,于是Q-Learning提出了一种类似梯度下降的方法来减少估值误差,即每次朝着目标迈进一小步,最后可以收敛到最优的Q值。

(3)DQN

说白了就是用一个深度神经网络来作为Q值的网络。

(4)最后来看我们的CartPole小游戏

我们需要控制下面的cart移动使连接在上面的杆保持垂直不倒。这个任务简化到只有两个离散动作,即向左或者向右用力。

如果杆子过于倾斜,或者cart移出一个范围,那么游戏结束。

具体的建模和实现过程可以参考我翻译的官方文档。

这里我只讲下主要思路。

一开始,我们什么也不知道,也就是DQN网络中的超参数是完全随机的。实践是检验真理的唯一标准,我们需要实践,因此我们将根据当前的状态选择下一步的action,action的选择方式为:

① 利用DQN网络选择一个action(当然此时的DQN网络没啥子用,因为它所有的超参数都是随机生成的);

② 随机选择一个action。

为什么要有随机选择呢?简单而言就是为了探索新世界,如果我们一味地跟着模型走,而没有创新,显然我们永远也不可能进步。

选择了action之后,我们就可以得到environment反馈的reward。同时我们也进入了新的state。

如果新的状态并没有使游戏over,那么我们就继续。

如果游戏over了,那么我们就重新开始。

在这个过程中,我们DQN网络是一直在更新的,更新的目标当然是要使得在不同的state下采取的action获得最佳的reward。

这样,除了第一次DQN是在瞎选外,之后的选择还是有一定的经验根据的。

随着一次又一次的行动,我们的模型最终会变得越来越优秀,毕竟失败是成功之母嘛,吸取经验教训还是很重要的吧~~~

That's ALL。


使用演示

一般的CartPole(即完全随机行动):



我们可以发现它毫无章法,很快就Over了。

DQN玩CartPole(参照官网写的):

刚开始训练时:


训练一段时间后:


这是我根据官网教程写的源码,做了比较详细的备注~~~

我们可以看到随着训练次数的增加,其存活下来的时间也呈上升趋势。

另外:

源代码中也提供了一份来自某YouTube主的源码,他精简了官网的源代码,供有需要者参考。

更多

T_T文章部分内容来源自我整理的DQN入门资料(资料基本都来自于国外相关学科的大佬讲座和一些tutorials)。

就这样吧,如果有什么不对的地方也可以给我留言,我会更正的~~~