做者:Angel_Kittypython
来源:http://www.cnblogs.com/ECJTUACM-873284962/git
1、介绍github
目前,对于全球科学家而言,“如何去学习一种新技能”成为了一个最基本的研究问题。为何要解决这个问题的初衷是显而易见的,若是咱们理解了这个问题,那么咱们可使人类作一些咱们之前可能没有想到的事。或者,咱们能够训练去作更多的“人类”工做,常遭一个真正的人工智能时代。算法
虽然,对于上述问题,咱们目前尚未一个完整的答案去解释,可是有一些事情是能够理解的。先不考虑技能的学习,咱们首先须要与环境进行交互。不管咱们是学习驾驶汽车仍是婴儿学习走路,学习都是基于和环境的相互交互。从互动中学习是全部智力发展和学习理论的基础概念。网络
2、强化学习并发
今天,咱们将探讨强化学习,这是一种基于环境相互交互的学习算法。有些人认为,强化学习是实现强人工智能的真正但愿。这种说法也是正确的,由于强化学习所拥有的潜力确实是巨大的。app
目前,有关强化学习的研究正在快速增加,人们为不一样的应用程序生成各类各样的学习算法。所以,熟悉强化学习的技术就变得尤为重要了。若是你还不是很熟悉强化学习,那么我建议你能够去看看我之前有关强化学习文章和一些开源的强化学习平台。框架
一旦你已经掌握和理解了强化学习的基础知识,那么请继续阅读这篇文章。读完本文以后,你会对强化学习有一个透彻的了解,而且会进行实际代码实现。dom
注:在代码实现部分,咱们假设你已经有了Python的基本知识。若是你还不知道Python,那么你应该先看看这篇教程。机器学习
1. 肯定一个强化学习问题
强化学习是学习如何去作,如何根据与环境的交互采起相应的行动。最终的结果就是使得系统的回报信号数值最大化。学习者不会被告知去执行哪一个行动,而是要他本身去发现哪一种行动将产生最大的回报。让咱们经过一个简单的例子来解释一下:
咱们将一个正在学习走路的孩子做为一个例子。
如下是孩子在学习走路时所要采起的步骤:
1.孩子会观察的第一件事,就是注意你是如何走路的。你使用两条腿,一次走一步,一步一步往前走。孩子会抓住这个概念,而后试图去模仿你。
2.但很快他/她又会明白,在走路以前,孩子必须先站起来!在学习走路的时候,这对于孩子来讲是一个挑战。所以,孩子试图本身站起来,他/她不断跌倒,可是任然不断地站起来。
3.然而还有另一个挑战须要应付。站起来是相对容易的,可是要保持站立状态就是另外一个挑战了。在一个狭小的空气中,找到支撑,孩子设法保持站立。
4.如今,孩子的真正任务就是开始学习走路了。可是学习走路提及来很容易,而实际作起来就不是那么容易了。在孩子的大脑中须要处理不少事情,好比平衡身体,决定哪一个脚是下一次须要放下的,放在哪里。
这听起来像是一个很困难的任务,对吗?它实际上确实是一个挑战,先要学习站立,而后才能学习行走。可是,如今咱们不都学会了走路嘛,不再会被这个问题所困扰了。如今,你能够明白,为何这对于孩子是多么困难的缘由了。
让咱们形式化上面的例子。例子所要陈述的问题是“走路问题”,其中孩子是一个试图经过采起行动(走路)来操纵环境(在地上走路)的智能体,他/她试图从一个状态(即,他/她走的每一步)转移到另外一个状态。当他/她完成任务的一个子模块(即,孩子走了几步)时,孩子会得到奖励(好比,一些巧克力),可是当他/她不会走路时,他/她不会收到任何巧克力(这是一个负反馈过程)。这就是像话学习问题的简单描述。
这是一个有关强化学习很好的介绍视频。
2. 与其余机器学习方法的比较
强化学习属于更打雷的机器学习算法。如下是有关机器学习算法类型的描述。
让咱们比较一下强化学习算法和别的类型算法之间的区别:
监督学习与强化学习:在监督学习中,在外部有一个“监督主管”,它拥有全部环境的知识,而且与智能体一块儿共享这个知识,从而帮助智能体完成任务。可是这样存在一些问题,由于在一个任务中,其中存在如此多的子任务之间的组合,智能体应该执行而且实现目标。因此,建立一个“监督主管”几乎是不切实际的。例如,在象棋游戏中,存在数万个能够移动的玩法。所以,去建立一个能够获胜的玩法知识库是一个单调乏味的任务。在这些问题中,从本身的经验中学习,而且得到知识是更加合理可行的。这就是强化学习和监督学习的主要区别。在监督学习和强化学习中,在输入和输出之间都存在映射。可是在强化学习中,存在的是对智能体的奖励反馈函数,而不是像监督学习直接告诉智能体最终的答案。
无监督学习与强化学习:在强化学习中,有一个从输入到输出的映射过程,可是这个过程在无监督学习中是不存在的。在无监督学习中,主要任务是找到一个最基础的模式,而不是一种映射关系。例如,若是任务是向用户推荐新闻文章,则无监督学习算法是先查看该人之前读过的相似文章,并把它们推荐给其余人。而强化学习算法则是,经过用户的一些文章,而且得到用户的不断反馈,从而构建一个“知识图谱”,从而得知用户与文章之间的喜好关系。
还有第四种类型的机器学习,成为半监督学习,其本质上是监督学习和无监督学习的组合。它不一样于强化学习,相似于监督学习和半监督学习具备直接的参照答案,而强化学习不具备。
3.解决强化学习问题的框架
为了理解如何去解决一个强化学习问题,让咱们经过一个经典的例子来讲明一下强化学习问题——多臂赌*博机。首先,咱们须要了解探索与开发的基本问题,而后去定义解决强化学习问题的框架。
Tiger Machine如上图,假设你已经在Tiger Machine上面玩了不少次了。
如今你想作的是从Tiger Machine上面得到最大的回报,而且尽量的快。你会怎么作呢?
一个比较天真的想法是,只选择一个Tiger Machine,而后一成天都在玩它。这听起来很是无聊,但Tiger Machine可能会给你一些“报酬”,即让你赢钱。使用这种方法,你可能中奖的几率大约是0.00000.....1。也就是说,大多数时间你可能知识坐在Tiger Machine面前亏钱。正式说明一下,这能够被定义为一种纯粹的开发方法。可是这是最佳选择吗?答案固然是否认的。
让咱们看看另一种方法。咱们能够拉每一个Tiger Machine的拉杆,而且向上帝祈祷,让咱们至少打中一个。固然,这是另外一种天真的想法,你只会一天都在拉动拉杆,但只是给你一点点报酬。正式说明一下,这种方法只是一种纯粹的探索方法。
这两种方法都不是最优的,咱们必须在它们之间找到适当的平衡点,已得到最大的回报。这被称为强化学习的探索和开发困境。
首先,咱们正式的定义解决强化学习问题的框架,而后列出可能的方法来解决这个问题。
马尔科夫决策过程:
在强化学习场景中,咱们定义问题的数学框架被称之为马尔科夫决策过程。这能够被设计为:
状态集合:S
动做集合:A
奖励函数:R
策略:π
价值:V
咱们必须采起必定的行动(A),让咱们从开始状态移动到结束状态(S)。每当咱们采起一个行动以后,咱们都会获得必定的回报做为奖励。固然,所得到的奖励的性质(正面奖励仍是负面奖励)是由咱们的行动决定的。
咱们的策略集合(π)是由咱们的动做集合来肯定的,而咱们获得的回报肯定了咱们的价值(V)。在这里,咱们的任务就是经过选择正确的策略来最大化咱们的价值。因此咱们必须最大化下面的方程:
对于时间t,全部可能的S。
旅行推销员问题
让咱们经过另一个例子来讲明一下。
这个问题是一系列旅行商(TSP)问题的表明。任务是以尽量低的成本,完成从地点A到地点F。两个字母之间的每条边上的数字表示两地之间的距离花费。若是这个值是负数,那么表示通过这条路,你会获得必定的报酬。咱们定义价值是当你用选择的策略走完整个路程时,所得到的总价值。
这里说明一下符号:
状态节点集合:{A,B,C,D,E,F}
动做集合是从一个地点到另外一个地点:{A->B, C->D, etc}
奖励函数是边上的值
策略函数指的是完整的路径规划,好比: {A -> C -> F}
如今假设你在地点A,惟一你能看见的路就是你下一个目的地(也就是说,你只能看见B,D,C,E),而别的地点你是不知道的。
你能够采起贪心算法,去获取当前状态下最有利的步骤,也就是说你从{A -> (B,C,D,E)}中选择采起 {A->D} 这种方法。一样,如今你所在的地点是D,想要到达地点F。你能够从{D -> (B, C, F)} 中采起 {D -> F} 这个方法,可让你获得最大的报酬。所以,咱们采起这一条路。
至此,咱们的策略就是采起{A -> D -> F},咱们得到的回报是-120。
恭喜!你刚刚就实现了强化学习算法。这种算法被称之为 epsilon 贪婪算法。这是一种逐步测试从而解决问题的贪婪算法。如今,若是见你(推销员)想再次从地点A到地点F,你老是会选择这一条路了。
其余旅游方式?
你能猜出咱们的策略是属于哪一个类别(纯粹的探索仍是纯粹的开发)吗?请注意,咱们采起的策略并非一个最佳策略。咱们必须“探索”一点,而后去寻找最佳的策略。在这里,咱们采起的方法是局域策略的而学习,咱们的任务是在全部可能的策略中找到最佳的策略。有不少的方法均可以解决这个问题,在这里,咱们简要的列出一些主要类别:
策略优先:咱们的重点是找到最佳的策略
回报优先:咱们的重点是找到最佳的回报价值,即累计奖励
行动优先:咱们的重点是在每一个步骤上采起最佳行动
在之后的文章中,我会深刻讨论强化学习算法。到那时,你能够参考这篇关于强化学习算法调研的论文。
4.强化学习的实现
接下来,咱们将使用深度Q学习算法。Q学习是一种基于策略的学习算法,它具备和神经网络近似的函数表示。这个算法被Google使用,而且战胜了Atari游戏。
让咱们看看Q学习的伪代码:
1.初始化价值表 ‘Q(s, a)’.2.观察当前的状态值 ‘s’.3.基于动做选择一个策略(例如,epsilon贪婪)做为该状态选择的动做.4.根据这个动做,观察回报价值 ’r’ 和下一个新的状态 s.5.使用观察到的奖励和可能的下一个状态所得到的最大奖励来更新状态的值。根据上述公式和参数进行更新。6.将状态设置为新的状态,而且重复上述过程,直到达到最终状态。
Q学习的简单描述能够总结以下:
咱们首先来了解一下 Cartpole 问题,而后继续编写咱们的解决方案。
当我仍是一个孩子的时候,我记得我会选择一根木棍,并试图用一只手指去使它保持平衡。我和个人朋友过去有这样一个比赛,看谁能让木棍保持平衡的时间更多,谁就能获得一块巧克力做为奖励。
这里有一个简单的视频来描述一个真正的 Cart-Pole 系统。
让咱们开始编写代码吧!
在开始编写以前,咱们须要先安装几个软件。
步骤一:安装 keras-rl包
在终端中,你能够运行如下命令:
git clone https://github.com/matthiasplappert/keras-rl.gitcd keras-rlpython setup.py install
步骤二:安装CartPole环境的依赖
咱们假设你已经安装好了pip,那么你只须要使用如下命令进行安装:
pip install h5pypip install gym
步骤三:开始编写代码
首先咱们须要导入一些咱们须要的模块
import numpy as np import gym from keras.models importSequentialfrom keras.layers importDense,Activation,Flattenfrom keras.optimizers importAdamfrom rl.agents.dqn importDQNAgentfrom rl.policy importEpsGreedyQPolicyfrom rl.memory importSequentialMemory
而后,设置相关变量
ENV_NAME = 'CartPole-v0'# Get the environment and extract the number of actions available in the Cartpole problem env = gym.make(ENV_NAME) np.random.seed(123) env.seed(123) nb_actions = env.action_space.n
以后,咱们来构建一个很是简单的单层神经网络模型。
model =Sequential() model.add(Flatten(input_shape=(1,) + env.observation_space.shape)) model.add(Dense(16)) model.add(Activation('relu')) model.add(Dense(nb_actions)) model.add(Activation('linear'))print(model.summary())
接下来,咱们配置和编译咱们的智能体。咱们将策略设置为 Epsilon 贪婪,咱们还将咱们的存储空间设置为序列存储,由于咱们要须要存储咱们执行操做的结果和每个操做所得到的奖励。
policy =EpsGreedyQPolicy() memory = SequentialMemory(limit=50000, window_length=1) dqn = DQNAgent(model=model, nb_actions=nb_actions, memory=memory, nb_steps_warmup=10, target_model_update=1e-2, policy=policy) dqn.compile(Adam(lr=1e-3), metrics=['mae'])# Okay, now it's time to learn something! We visualize the training here for show, but this slows down training quite a lot. dqn.fit(env, nb_steps=5000, visualize=True, verbose=2)
如今,让咱们来测试一下咱们的强化学习模型
dqn.test(env, nb_episodes=5, visualize=True)
下图是模型的输出结果:
瞧,你刚刚就创建了一个强化学习机器人!
5.增长复杂性
如今,你已经看到了强化学习的一个基本实现,让咱们开始学习更多的问题吧,每次增长一点点复杂性。
汉诺塔问题
对于那些不知道比赛的人来讲,汉诺塔问题是在1883年发明的。它是由3根木棍和一系列大小不一的圆盘组成的(好比,上图中的3个)。从最左侧的木棍开始,目的是以最少的移动次数,把最左边的圆盘移动到最右边的圆盘上。
若是咱们要处理这个问题,那么咱们先从处理状态开始:
初始状态:三个圆盘都在最左边的木棍上(从上到下,依次编号为1,2,3)
结束状态:三个圆盘都在最右边的木棍上(从上到下,依次编号为1,2,3)
全部可能的状态:
这里是咱们可能获得的27种状态:
其中,(12)3* 表示,圆盘1和圆盘2在最左边的木棍上面(从上往下编号),圆盘3在中间那个木棍上面,最右边的木棍没有圆盘。
数值奖励:
因为咱们想要以最少的移动步数解决这个问题,因此咱们能够给每一个移动赋予 -1 的奖励。
策略:
如今,若是咱们不考虑任何的技术细节,那么前一个状态可能会存在几种下一个状态。好比,当数值奖励为-1时,状态 (123)会转移到状态 (23)1,或者状态 (23)1 。若是你如今看到了一个并发进行的状态,那么上面提到的这27个状态的每个均可以表示成一个相似于旅行商问题的图,咱们能够经过经过实验各类状态和路径来找到最优的解决方案。
3 x 3 魔方问题
虽然我能够为你解决这个问题,可是我想让你本身去解决这个问题。你能够按照我上述一样的思路,你应该就能够解决了。
从定义开始状态和结束状态开始,接下来,定义全部可能的状态及其转换,以及奖励和策略。最后,你应该就可使用相同的方法来构建本身的解决方案了。
6.深刻了解强化学习的最新进展
正如你所认识到的,一个魔方的复杂性比汉诺塔问题要高不少倍。如今,让咱们来想象一下棋类游戏中的状态和选择的策略数量吧,好比围棋。最近,Google DeepMind公司建立了一个深度强化学习算法,而且战胜了李世石。
最近,随着在深度学习方面的成功。如今的重点是在慢慢转向应用深度学习来解决强化学习问题。最近洪水通常的消息就是,由Google DeepMind建立的深度强化学习算法战胜了李世石。在视频游戏中也出现了相似的状况,开发的深度强化学习算法实现了人类的准确性,而且在某些游戏上,超越了人类。研究和实践仍然须要一同前进,工业界和学术界共同策划努力,以实现创建更好地自适应学习机器人。
如下是几个已经应用强化学习的主要领域:
还有这么多的领域没有被开发,结合目前的深度学习应用于强化学习额热潮,我相信之后确定会有突破!
End