转自:http://blog.csdn.net/revolver/article/details/50177219html
今年上半年(2015年2月),Google在Nature上发表了一篇论文:Human-level control through deep reinforcement learning。文章描述了如何让电脑本身学会打Atari 2600电子游戏。Atari 2600是80年代风靡美国的游戏机,总共包括49个独立的游戏,其中不乏咱们熟悉的Breakout(打砖块),Galaxy Invaders(小蜜蜂)等经典游戏。Google算法的输入只有游戏屏幕的图像和游戏的得分,在没有人为干预的状况下,电脑本身学会了游戏的玩法,并且在29个游戏中打破了人类玩家的记录。前端
Google究竟是如何作到的呢?答案固然是深度学习了。算法
先来看看Google给出的神经网络架构。后端
网络的最左边是输入,右边是输出。游戏屏幕的图像(其实是4幅连续的图像,能够理解为4个通道的图像)通过2个卷积层(论文中写的是3个),而后通过2个全链接层,最后映射到游戏手柄全部可能的动做。各层之间使用ReLU激活函数。网络
这个网络怎么看着这么眼熟?这和咱们识别MNIST数字时用的卷积神经网络是同样同样的。数据结构
但是转念又一想,仍是不对。咱们识别MNIST数字的时候,是Supervised Learning(监督学习)。每一个图像对应的输出是事先知道的。但是在游戏中并非这样,游戏环境给出的只是得分。算法须要根据得分的变化来推断以前作出的动做是否是有利的。架构
这就像训练宠物同样。当宠物作出了指定动做以后,咱们给它一些食物做为奖励,使它更加坚信只要作出那个动做就会获得奖励。这种训练叫作Reinforcement Learning(强化学习)。app
强化学习并无指定的输出,环境只对算法作出的动做给出相应的奖励,由算法来主动发现什么时间作出什么动做是合适的。强化学习的难处在于,奖励每每是有延时的。好比在一个飞机游戏中,玩家指挥本身的飞机在合适的时机发射子弹,相应的奖励要等到子弹击中敌机才会给出。从发射子弹到击中敌机之间有一个时间延迟。那么算法如何跨越这个时间延迟,把击中敌机所获得的奖励映射到以前发射子弹的这个动做上呢?框架
要解释这个问题,咱们须要首先来谈一下强化学习是怎么一回事。机器学习
Reinforcement Learning(强化学习)
先借用一下维基百科的描述:
强化学习是机器学习中的一个领域,强调如何基于环境而行动,以取得最大化的预期利益。其灵感来源于心理学中的行为主义理论,即有机体如何在环境给予的奖励或惩罚的刺激下,逐步造成对刺激的预期,产生能得到最大利益的习惯性行为。 |
在强化学习的世界里,咱们的算法(或者说人工智能)被称为Agent,它与环境发生交互。Agent从环境中获取状态(state),并决定本身要作出的动做(action)。环境会根据其自身的逻辑给Agent予以奖励(reward)。这个奖励有正向和反向之分。好比动物生活在大天然中,吃到食物便是一个正向的奖励,而挨饿甚至失去生命就是反向的奖励。动物们靠着本身的本能趋利避害,增大本身获得正向奖励的机会。若是反过来讲,就是避省得到反向的奖励,而挨饿什么的最终会致使死亡。因此动物生存的惟一目的其实就是避免死亡。
在电子游戏世界(特指Atari 2600这一类的简单游戏。不包括推理解密类的游戏)中:
插播:
为何不包括推理解密类游戏呢?其实Google把游戏简单分为两类:Perfect Information和Imperfect Information。
Perfect Information类的游戏能够经过当前屏幕上的画面了解到全部的状态信息,如打砖块,小蜜蜂,各类棋类都属于这一类游戏。这类游戏又能够叫作Markov游戏。Google这篇论文就是主要针对这一类。
Imperfect Information类的游戏不但要看当前屏幕上的画面,还要记住全部的历史画面。如扑克牌等。要解决这类游戏也不是没有可能,只须要在神经网络里加入闭环反馈就能够了。这就是Recurrent Neural Network(RNN)递归神经网络。关于RNN,请参考个人另外一篇笔记:深度学习笔记(五)用Torch实现RNN来制做一个神经网络计时器
Q-Value
上面说到策略能够用动做的价值Q-value(其实是Quality-Value)来表示。但这个价值到底表明什么呢?咱们学政治课的时候都知道,商品的价值是凝结在商品中的无差异的人类劳动。那么这个动做的价值又凝结了什么东西呢?这个价值又是以什么单位来衡量的呢?
因为咱们算法的目的只有一个,那就是尽可能多的得到奖励(Reward)。因此动做的价值毫无疑问就是以Reward的多少来衡量的。一个动做的价值等于作了这个动做以后一段时间以内Agent所能得到的最大的奖励。
举个例子,假设你面临跳槽,若是跳到新公司,从此五年内的预期收入是500万。若是留在原来的公司,从此五年的预期收入为300万。那么你”跳槽“这个动做的Q-value就是500万,而“不跳槽”这个动做的Q-value为300万。
所谓价值,固然是要根据设定的时间段而定的。为了计算方便,咱们通常不会设定为“5年”这样一个固定的时间段。而是给将来的Reward打一个折扣。好比明年的预期收入要打一个0.9折,后年的预期收入打0.9的二次方折,大后年的预期收入打0.9的三次方的折。这样,越遥远的收入就显得越不重要,其实也起到了限制时间段的做用。
Q-Value Tabular Representation(Q函数的表格形式)
前面说到,策略能够用一个记录着Q-value的二维表格来表示。咱们来举一个实际的例子吧。
假设咱们有一张地图,地图上有6个格子。游戏开始时你会出如今任意一个蓝色的格子里,你的任务是走到End终点。由于你的口袋上漏了一个洞,你每踏上一个蓝色的格子,你的口袋会掉出一块钱,而你走到终点的那一刻,你会获得10块钱,同时游戏结束。若是你试图走出边界,你会留在原来的那个格子里,并失去1块钱。
好了,游戏规则很是简单。为了要获取最大的利益,你须要找出一个最佳策略。在这么简单的游戏设定下,你能够用Q的表格形式来表示你的策略。我已经帮你把表格画好了,你只须要把合适的数字填进去。(为了计算方便,咱们不对将来的奖励作打折处理)
假设你身处状态C,那么向下走会获得10块钱。因此C状态的向下的动做Q-value等于10。一样,E状态向右的动做也等于10。
若是你身处B状态,向下能够走到E,经过E能够走到终点并得到10块钱,可是在路过E的时候要损失1块钱,因此总的预期是9元。一样B状态向右也是9。
若是你身处D,最好的方法是向右走到E,再经过E走到终点。这样的预期一样是9元。
若是你身处A,那么你能够向下走到D,而后经过E走到终点,这样预期是8元。固然也能够向右走到B,而后选择经过C或E走到终点,预期一样是8元。因此A状态的向下和向右的动做都是8。
还有一些空格没有填。好比从E向左走,很明显这不是最佳的走法。不过若是你硬要这么走的话,你还能够从D走回E而后走到终点。但你走了一些冤枉路,你的收入将会是8。
按照这种逻辑,咱们能够把其余的格子填满。
这样,咱们就获得一个策略。按照这个策略,当你身处某个状态的时候,你能够选择四个动做中Q-value最高的那个来执行。
如今,策略咱们是定出来了。但是这个策略是以咱们人脑的智慧高屋建瓴的来完成的,对于电脑来说该怎么办呢?先别着急,这一节的目的只是讲如何用二维的表格来表示一个策略。至于如何用算法找出最佳策略,咱们后面再讲。
Q-Value Function Approximation(Q函数拟合形式)
在大多数Atari游戏中,状态的个数几乎能够说是无限多的。画面每变化一点点,就是一个新的状态。咱们不可能为每一个状态指定一个最佳的动做,而是须要把相近的状态概括到一块儿。好比,咱们能够这样描述某个策略:“当子弹从左边射向个人飞机时,我应该向右移动;当子弹从右边射向个人飞机时,我应该向左移动“。这个策略实际上把全部可能的屏幕状态分红了两类,分别把他们映射到手柄的向左和向右键。这种对局部图像进行描述从而进行分类的任务,用卷积神经网络来作是最合适不过的了。
具体来说有两种方式:1. 将状态和动做作为输入,相应动做的Q-value作为输出;2. 将状态做为输入,一次性输出每一个动做的Q-value。
在Google的论文里,就使用了相似第二种的网络形式把游戏画面映射到按键动做。网络的输入端是4帧连续的图像,通过3个卷积层和2个全链接层映射到18个输出节点,每一个节点表明一个手柄按键动做的价值(Q-value)。
Temporal difference(时间差分)
直到如今,咱们最大的一个疑问其实还未解决:咱们上面提到的那个卷积神经网络究竟是怎么在没有监督的状况下训练出来的呢?答案就是本身向本身学习,并且是向将来的本身学习。是否是很神奇?这就是Temporal Difference。其实就是根据Agent在连续时间点之间作出判断的差值来实现学习的目的。
扩展知识:
通常对于计算机算法而言,想要从环境中学习到经验并找出最佳策略,有三种不一样的方法能够选择:
1. 动态规划(Dynamic Programming)方法。计算机专业的同窗确定不会陌生。在地图上找出两点之间的最短路径(也算是一种学习)用的就是这种方法。但这种方法的缺点在于,环境必须是已知的。若是要算出最短路径(最佳策略),最起码要把地图(环境)告诉Agent才能够。而Google并无告诉算法任何关于Atari2600游戏的知识,因此动态规划并不能解决这类问题。
2. 蒙特卡罗(Monte-Carlo)方法。蒙特卡罗是摩纳哥的一个赌城,这种方法说白了就是随机瞎猜的方法。不断的改变策略,并在环境中不断尝试,直到找出回报最多的策略。实际上,生物在天然界的进化就是遵循这样一种方法。每种生物都把不可胜数的后代散播到咱们这个地球上,每一个后代的个体都在基因上有微小的差异。基因优秀的生存下来,继续繁衍后代。听起来这种方法是不错的。可是每学习一次都要以物种个体的死亡为代价,这样学习的代价太大,学习的速度也太慢。另外,经过这种方法学习的经验是不具备推理性的。由于它没法判断究竟是以前的具体是哪一个动做致使了死亡的结果,只能把从出生到死亡之间的时间段里作出的全部动做当成一个总体策略来处理,这个策略由个体的基因决定。而算法选择总体保留或者总体销毁这个基因样本。
3. TD(Temporal difference)方法。Google就是用的这种方法。
咱们先来举一个例子:
假设咱们要根据从周一到周日的天气情况来预测周日的天气。咱们从周一开始观察,周一夜咱们给出一个预测,这个预测会很不许确。周二晚上的时候,因为咱们已经观察了两天,并且时间离周日又接近了一些,因此咱们的预测会比周一准确一些。一直到周六晚上,咱们的预测会愈来愈准确。直到时间到达周日,咱们的预测变成100%准确,由于实际上咱们已经知道答案了。
这就是Temporal Difference的基本假设:下一时刻对于结果的预测必定会比上一时刻的预测更准确。
因此咱们的方法就是让周一的预测向周二靠近,周二的预测向周三靠近......周六的预测向周日靠近。周日就不用再靠近了,由于当天的天气就是标准答案。
具体到算法上,流程大概是这样的:
1. 首先咱们须要有一个神经网络(或者是别的什么预测器),它的输入是当天的日期和当天观测到的一些数据,输出是对周日天气的预测。用数字来表示:1为晴天,0为雨天。这个神经网络的初始状态是随机的,处于一种混沌状态,它给出的预测值也能够当作是随机数。
2. 咱们开始从周一开始收集观察数据,把收集到的数据放进神经网络,它吐出一个结果。固然这个结果没有任何意义,由于它是随机生成的。
3. 时间来到周二,咱们又收集到了一些数据。把周二的数据放进神经网络,又吐出一个结果。这个结果仍然是随机的没有任何意义。但总算是和周一的结果有些差异。
4. 把周一的日期和观察数据和周二的预测结果组成一对样本,用来训练咱们的神经网络。注意,这时候咱们的训练转变成了监督学习。因为咱们会选择一个很小的learning rate,咱们的神经网络会改变一点点,使得下一次若是咱们又在周一这天观察到和这个周一相似的数据时,咱们的预测会更加接近这个周二的结果了。等等,刚才不是说周二的预测结果只是个随机数吗?那这样的学习还有什么意义呢?先不要着急......
5. 咱们一每天的观察和学习,直到来到了周日。今天,咱们要把周六的日期和观察数据和周日的预测结果(其实就是ground truth)组成一对样原本训练网络了。此次的训练才真正开始有意义了。当咱们下一次遇到和周六相似的状况时,咱们就能更加准确的预测周日的天气了。这样,一周的观察和学习生活就结束了。
6. 咱们又开始了新的一周,从新从周一开始预测周日的天气。此次咱们有了上一周的经验(所谓经验,就是上一周留下来的那个神经网络)。在这一周的学习中,前几天的学习仍然是很盲目的。但从周六开始,这种自我学习就开始有了一些方向性。由于周六给出的预测已是有一些根据的。因此它有能力给周五的神经网络一些指导性意见。
7. 时间一周一周的过去了。周六的网络老是可以学习到Ground Truth。而周五的网络老是能向周六的网络学习......周一的网络老是向周二的网络学习。随着时间的推移,全部的网络都不一样程度的学习到了Ground Truth。
是否是有一点感受了?让咱们再看一下以前的那个例子。
此次咱们要遵循一个严格的算法来获得最佳策略。用这种方法叫作Q-learning。这是一个迭代的过程。首先,把全部动做的Q-value初始化为0。而后,遵循下面的规则进行迭代:
某个状态下某个动做的Q-value = 该动做致使的直接奖励 + 该动做致使的状态中最有价值动做的Q-value
这个公式其实有个名字叫作Bellman Equation。这个公式很是很是重要,是整个Reinforcement Learning的理论核心。用通俗的话讲就是:若是你要作出一个选择,你须要考虑两个方面,一是你作出选择后当即获得的回报是多少,二是你的选择致使的一系列变化在将来能给你多少回报。将这二者加起来,就是你某项选择的价值。
若是有人给你一亿让你吃屎,你吃吗?很明显,当即回报是一亿,吃完以后名誉受损可能影响别人对你的见解,吃不吃你本身考虑吧。
咱们来实际操做一下。首先在咱们的表格里把全部的Q-value初始化为0。
而后按照Bellman Equation进行迭代。
第一次迭代以后,全部没有踏上终点的动做都变成了-1,只有C的向下和E的向右变成了10。咱们来看看为何。
拿A状态的向右动做为例。这个动做致使的结果是B状态,并得到-1的奖励。而B状态的后续动做的价值都是0(初始化的值)。因此此次迭代的结果是-1加上0,等于-1。
再拿C状态的向下动做举例。这个动做致使的结果是游戏结束,并得到+10的奖励。游戏结束后也没有后续的奖励了。因此迭代的结果是+10。
继续往下迭代:
咱们发现全部能致使E或C的动做都变成了9。
拿B状态举例,B状态后续到c的价值为-1,由c到end的价值为+10 ,b的状态值=b到c的价值(-1)+c到end的价值(+10)=9
而后是第三次迭代:
第四次迭代:
通过四次迭代,咱们的表格已经收敛,继续迭代也不会发生变化了。这就说明,咱们已经找到了最佳策略。这个策略和咱们凭人脑制定的策略是同样的。
进入真正的Atari游戏
通过上面的讲解,咱们了解到几条事实:
因为本文并不涉及如何编写代码,因此我只想用文字来描述一下,在训练的过程当中到底发生了些什么。
假设咱们选择了Breakout(打砖块)游戏。
起初,咱们创建了一个卷积神经网络,这就是AI的大脑。网络前端接受屏幕传来的图像,网络后端只有三个输出节点,分别表明向左移动,向右移动和不移动。网络的内部参数是随机初始化的,网络末端的Q-value也基本是随机的。这个大脑里面是一片混沌,它不会根据眼前的画面作出判断,只会随机的移动屏幕最下方的“球拍”。
咱们打开开关,游戏开始运行。小球开始从上方掉下来。咱们的“球拍”几乎不可能接到小球。每次小球掉落下去以后游戏就结束了。但立刻又从新开始。
在这个过程当中,屏幕图像源源不断的从神经网络的前端传进来,经过无数随机权重的神经脉络,链接到最后端的三个输出节点上。
"大脑“在作出随机动做的同时也在不停的学习。因为根本没有得到Reward,”大脑“只是单纯的拿n+1帧的图像对应的3个Q-value做为第n帧图像的学习目标。
这时的学习实际上是盲目的。用随机初始化的网络随机的生成一些数据来训练,获得的结果也必然是一片混乱。因此,在这个阶段,神经网络跟没有学习到任何有意义的东西。
直到......
小球偶尔也会落在球拍上反弹回去。击中球拍并不会得到Reward,因此网络的训练仍然和以前同样无动于衷。
当小球向上击中一个砖块的时候,游戏给出1分做为Reward。从这时开始,“训练”才真正变得有意义了。在小球击中砖块的瞬间,砖块消失不见。因为神经网络接受的是4帧连续的图像,其实是一个小动画,记录了砖块消失的过程。在这一帧发生的训练,其输入样本用的是上一帧的4幅图像(小球立刻要击中砖块),而输出样本是击中砖块后的图像经过网络所生成的3个Q-value再加上刚才获得的1分。
这一帧的训练意义非同寻常,它告诉“大脑”:在小球立刻要击中砖块这样一种状态下,不论你作出什么动做,都会获得比随机水平高出1分。
这一过程不断的重复,当“大脑”经历过屡次击中砖块的瞬间,它脑中的卷积核就会试图找出这些画面中有哪些共同点。终于有一天,当击中过足够屡次砖块以后,“大脑”终于明白,这些画面的共同点是:画面的某处都存在一个相同的pattern——小球和砖块很是接近并且小球正在向砖块飞去。“大脑”终于明白了它人生中的第一件事。
之后的每帧图像,它都会在图像中寻找这样的pattern,若是找到了,就会在输出端的3个动做节点给出3个比平时高一点的Q-value。
这时,“大脑”并无将得分和动做联系在一块儿。这3个动做对它来讲价值没有什么区别。它仍然是随机的给出一些动做。
“大脑”也会发现击中砖块前两帧的图像会“致使”前一帧的图像。在小球接近砖块的过程当中,算法会不断的把下一帧的Q-value拿过来做为前一帧的图像的结果来训练。
渐渐地,“大脑”会认为全部小球飞向砖块的图像都应该对应较高的Q-value。也就是说,这些状态都是“有利”的。
下一步,“大脑”会继续领悟:是小球与球拍的碰撞“致使”了小球向上运动,并有很大多是飞向砖块。因此小球与球拍的碰撞是“有利”的。
到目前为止,“大脑”仍是没有搞清楚这3个动做到底有什么区别。
游戏继续,“大脑”继续随机的发出动做。
有时候,小球会贴着球拍的边缘掉下去。只有在这个时候,才能体现出动做带来的好处。好比,小球落到球拍左边缘时,若是这时碰巧发出了一个向左的动做,那么就会引起碰撞,不然小球就会跌落下去。在引起碰撞的状况下,“大脑”会把“碰撞”的Q-value(比较高)赋给向左这个动做。而向右和不移动这两个动做获得的却只是小球落下去的Q-value(比较低)。
长此以往,“大脑”就会明白当小球将要从左边略过球拍的时候,向左的动做比较有利;将要从右边略过的时候,向右的动做比较有利。
这样推广开来,“大脑”就会慢慢的找出合适的策略,越玩越好,逐渐达到完美的程度。
总结
说到这里,相信你已经能对强化学习有了一个大体的了解。接下来的事情,应该是如何把这项技术应用到咱们的工做中,让它发挥出其巨大的潜能,创造出前人没法想象的价值。
自从Google发表了那篇惊世骇俗的论文以来,在个人心里里,人工智能的大门已经正式向人类打开,美好的将来也在向咱们招手。从某种意义上讲,其巨大的影响力已经让咱们手头的工做变得毫无价值,而咱们应该抓紧时间去认真研究这新出现的技术,尽快的发挥它的巨大势能。正如KK的比喻那样:你正用一把铁铲在挖水渠,但你却忽然据说明天会有人租一台挖掘机来过来,这时你还会继续挖下去吗?