介绍html
目前,对于全球的科学家而言,“如何去学习一种新技能”已经成为最基本的研究课题之一。解决这个问题的意愿显而易见——若是可以解决这个问题,那么人类就有望作到某些从未想过的事情。换句话说,咱们能够训练机器去作更多本来人类要作的工做,迎来真正的人工智能时代。python
虽然,对于上述问题,目前咱们尚未一个完整的回答,但有一些事情是十分明确的。不考虑技能方面的学习,咱们首先的是在与环境的交互过程当中进行学习。无论是学习开车,仍是婴儿学习走路,学习的基础都是与环境的交互过程。在互动中学习是全部学习理论以及智力发展理论的最根本的概念。git
强化学习github
今天,咱们将探讨强化学习。其中与环境的交互是深度学习的基础,一般伴有明确的目的。有些人认为,强化学习是实现强人工智能的真正但愿。这么说确实没错,由于强化学习拥有着巨大的潜力。web
目前,有关强化学习的研究正在快速增加,人们为不一样的应用程序生成了各类各样的学习算法。所以,熟悉强化学习的技术变得尤为重要。若是你还不是很熟悉强化学习,那么我建议你能够去看看我之前有关强化学习的文章和一些开源的强化学习平台。算法
若是你已经掌握并理解了强化学习的基础知识,那么请继续阅读这篇文章。读完本文以后,你将会对强化学习以及代码实现过程有一个透彻的了解。网络
注:在代码实现部分,咱们假设你已经有了 Python 的基本知识。若是你还不知道 Python,那么你应该先看看这篇教程。app
https://www.analyticsvidhya.com/blog/2016/01/complete-tutorial-learn-data-science-python-scratch-2/框架
目录dom
强化学习问题的表现形式
与其余机器学习方法的比较
解决强化问题的框架
强化学习的实现
增长强化学习的复杂性
深刻了解强化学习的最新进展
其余资源
强化学习不只须要学习作什么,也须要学习如何根据与环境的交互采起相应的行动。强化学习的最终结果,就是要实现系统回报信号的最大化。学习者事先并不知道要去执行什么行为,须要本身去发现哪一种行动能产生最大的回报。让咱们经过一个简单的例子来解释一下。
咱们以一个正在学习走路的孩子为例进行讲解。
如下是孩子在学习走路时所要采起的步骤:
孩子关注的第一件事,就是观察身边的人是如何走路的。身边的人使用两条腿走路,一次走一步,一步一步按照次序往前走。孩子会抓住这个概念,而后努力去模仿这个过程。
但很快他/她又会明白,在走路以前,必须先站起来!在学习走路的过程当中,站立对于孩子来讲是一个挑战。所以,孩子试图本身站起来,他/她不断跌倒,可是仍然决定站起来。
然而接下来,还有另一个挑战须要应付。站起来是相对容易的,可是要保持站立状态就是另外一个挑战了。在狭小的空间中找到支撑,孩子就能成功保持站立状态。
如今,孩子的真正任务就是开始学习走路了。可是学习走路提及来很容易,而实际作起来就不是那么容易了。在孩子的大脑中须要处理不少事情,好比平衡身体、决定接下来放哪一个脚、放在哪里。
这听起来像是一个很困难的任务,对吗?事实上,这确实是一个挑战,先要学习站立,而后才能学习行走。可是,如今咱们不都学会了走路嘛,不再会被这个问题所困扰了。如今你应该能够明白,为何学习走路对于孩子来讲很是困难了。
让咱们用具体的形式来表述上面的例子。例子所要陈述的问题是“走路问题”,其中孩子是一个试图经过采起行动(走路)来操纵环境(在地上走路)的智能体,他/她试图从一个状态(即,他/她走的每一步)转移到另外一个状态。当他/她完成任务的一个子模块(即孩子走了几步)时,孩子会得到奖励(好比,一些巧克力),可是当他/她不会走路时,他/她不会收到任何巧克力(这是一个负反馈过程)。这就是对强化学习问题的简单描述。
下面的连接,是介绍强化学习的很好的视频。
https://youtu.be/m2weFARriE8
强化学习是机器学习算法中的一类。如下是有关机器学习算法类型的描述。
让咱们比较一下强化学习算法和其余类型算法之间的区别:
监督学习与强化学习:在监督学习中,其外部有一个“监督主管”,这个“监督主管”拥有环境方面的知识,而且与智能体一块儿共享这个知识,从而帮助智能体完成任务。可是这存在一些问题,由于存在如此多的子任务之间的组合,智能体要实现其目标的话,这些组合都是能够利用的。因此,建立一个“监督主管”几乎是不切实际的。例如,在象棋游戏中,存在数万个移动方法。所以,建立玩法知识库的任务将会单调而乏味。有一个更加合理可行的方法,就是设法从本身的经历中学习,并以此得到所需的知识。这就是强化学习和监督学习的主要区别。在监督学习和强化学习中,输入和输出之间都存在映射。可是在强化学习中,存在的是对智能体的奖励反馈函数,而不是像监督学习同样,直接告诉智能体最终的答案。
无监督学习与强化学习:在强化学习中,有一个从输入到输出的映射过程,可是这个过程在无监督学习中是不存在的。在无监督学习中,主要任务是找到一种最基本的模式,而不是映射关系。例如,若是任务是向用户推荐新闻文章,那么无监督学习算法首先将会查看该人之前读过的相似文章,并把它们推荐给其余人。而强化学习算法则是,经过用户阅读的某文章,不断得到用户的反馈,从而构建一个“知识图谱”,推测用户喜欢的文章。
还有第四种类型的机器学习,称为半监督学习。半监督学习本质上是监督学习和无监督学习的组合。它不一样于强化学习,而是与监督学习相相似。半监督学习会直接给出参照答案,而强化学习不会。
为了理解解决强化学习问题的过程,让咱们经过一个经典的例子来解释一下强化学习问题——多臂赌博机。首先,咱们须要了解探索与开发的基本问题,而后去定义解决强化学习问题的框架。
如上图中的老虎机,假设你已经在老虎机上面玩了不少次了。
如今你想作的是从老虎机上面得到最大的回报,而且尽量快地得到这个回报。你会怎么作呢?
一个比较天真的想法是,只选择一个老虎机,而后一成天都去玩它。这听起来很是无聊,但老虎机确实可能会给你一些“回报”,即让你赢钱。使用这种方法,你可能中奖的几率大约是0.00000.....1。也就是说,大多数时间你可能知识坐在老虎机面前亏钱。正式说明一下,咱们能够将其定义为一种纯粹的开发方法。可是这是最佳选择吗?答案固然是否认的。
让咱们看看另一种方法。咱们能够拉每一个老虎机的拉杆,而且向上帝祈祷,让咱们至少打中一个。固然,这是另外一种天真的想法,它只会让你一天都在拉动拉杆,但只是给你一点点报酬。正式说明一下,这种方法只是一种纯粹的探索方法。
这两种方法都不是最优的,咱们必须在它们之间找到适当的平衡点,以得到最大的回报。这就是强化学习中“探索VS开发”的两难选择。
首先,咱们来正式地定义一下解决强化学习问题的框架,而后列出可能的方法来解决这个问题。
马尔科夫决策过程
在强化学习场景中,用于解决问题的数学框架叫作马尔科夫决策过程。这能够被设计为:
状态集合:S
动做集合:A
奖励函数:R
策略:π
价值:V
要想从开始状态转变到结束状态(S),咱们必须采起必定的行动(A)。每当咱们采起一个行动以后,咱们都会获得必定的回报做为奖励。固然,所得到的奖励的性质(正面奖励仍是负面奖励)是由咱们的行动决定的。
策略集合(π)取决于咱们的动做集合,而咱们获得的回报将会决定咱们的价值(V)。在这里,咱们的任务就是选择正确的策略来最大化咱们的价值。因此咱们必须最大化下面的方程:
在时间点t,咱们必须最大化S中全部可能的值。
旅行推销员问题
让咱们经过另一个例子来讲明一下。
这个问题是一系列旅行商(TSP)问题的表明。任务是以尽量低的成本从地点A到达地点F。两个字母之间的每条边上的数字表示两地之间的花费。若是这个值是负数,那么表示通过这条路,你会获得必定的报酬。这里咱们定义的价值(Value)是运用选择的策略走完整个路程时,所得到的总价值。
这里说明一下符号:
全部状态的集合至关于图中的节点:{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的话,你大概会一直选择这条路线了。
其余旅游方式?
你能猜出咱们的策略是属于哪一个类别(纯粹的探索VS纯粹的开发)吗?
请注意,咱们采起的策略并非最佳的策略。要想寻找最佳的策略,咱们必须更具“探索精神”。在这里,咱们采起的方法是局域策略学习,咱们的任务是在全部可能的策略中找到最佳的策略。有不少的方法均可以解决这个问题,在这里,我简要的列出一些主要的内容:
策略优先:咱们的重点是找到最佳的策略
回报优先:咱们的重点是找到最佳的回报价值,即累计奖励
行动优先:咱们的重点是在每一个步骤上采起最佳行动
在之后的文章中,我会深刻讨论强化学习算法。到那时,你能够参考这篇关于强化学习算法的调研论文
https://www.jair.org/media/301/live-301-1562-jair.pdf
接下来,咱们将使用深度Q学习算法。Q学习是一种基于策略的学习算法,它的函数表示和神经网络近似。Google就是采用了这种算法战胜了Atari游戏。
让咱们看看Q学习的伪代码:
初始化价值表 ‘Q(s, a)’。
观察当前的状态值 ‘s’。
基于动做选择一个策略(例如,epsilon贪婪)做为该状态选择的动做。
根据这个动做,观察回报价值 ’r’ 和下一个新的状态 ‘s’。
使用观察到的奖励和可能的下一个状态所得到的最大奖励来更新状态的值。根据上述公式和参数进行更新。
将状态设置为新的状态,而且重复上述过程,直到达到最终状态。
Q学习的简单描述能够总结以下:
咱们首先来了解一下 Cartpole 问题,而后再继续编写咱们的解决方案。
当我仍是一个孩子的时候,我记得我会挑选一根木棍,并试图用一只手指去使它保持平衡。过去,我和个人朋友有过这样一个比赛:谁能让木棍保持平衡的时间更久,谁就能获得一块巧克力做为奖励。
如下连接是一个简短的视频,描述的是真正的 Cart-Pole 系统。
https://youtu.be/XiigTGKZfks
让咱们开始编写代码吧!
在开始编写以前,咱们须要先安装几个软件。
步骤一:安装keras-rl包
在终端中,你能够运行如下命令:
git clone https://github.com/matthiasplappert/keras-rl.git
cd keras-rl
python setup.py install
步骤二:为CartPole环境安装依赖程序
咱们假设你已经安装好了pip,那么你只须要使用如下命令进行安装:
pip install h5py
pip install gym
步骤三:开始编写代码
首先咱们须要导入一些咱们须要的模块。
import numpy as np
import gym
from keras.models import Sequential
from keras.layers import Dense, Activation, Flatten
from keras.optimizers import Adam
from rl.agents.dqn import DQNAgent
from rl.policy import EpsGreedyQPolicy
from rl.memory import SequentialMemory
而后,设置相关变量。
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)
下图是模型的输出结果:
瞧,你刚刚就创建了一个强化学习机器人!
如今,你已经看到了一个强化学习的基本的实现过程,让咱们开始学习更多的问题吧,每次增长一点点复杂性。
汉诺塔问题
有些人可能还不知道汉诺塔问题:汉诺塔问题是在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 魔方问题
虽然我能够为你解决这个问题,可是我想让你本身去解决这个问题。你能够按照我上述提到的思路来进行,应该就能够解决了。
从定义开始状态和结束状态开始,接下来,定义全部可能的状态、转换过程、奖励和策略。最后,你应该就可使用相同的方法来构建本身的解决方案了。
你可能已经意识到,魔方的复杂性要比汉诺塔问题高出不少倍,可供选择的数量要比汉诺塔问题多得多!如今,让咱们来想象一下棋类游戏中的状态和选择的策略数量吧,好比围棋。最近,Google DeepMind公司建立了一个深度强化学习算法,而且战胜了李世石。
在深度学习不断取得成功的过程当中,人们关注的焦点正逐渐发生变化,视图应用深度学习来解决强化学习问题。最近有一则消息,如洪水般向咱们涌来:由Google DeepMind建立的深度强化学习算法战胜了李世石。在视频游戏中也出现了相似的状况,深度强化学习算法达到了人类水平的准确性,甚至在某些游戏中,超越了人类。研究和实践仍然须要共同发展,工业界和学术界须要共同努力,以创建出更好地、能自我学习的机器人。
http://www.tomshardware.com/news/alphago-defeats-sedol-second-time,31377.html
如下是几个已经应用强化学习的重要领域:
博弈论和多个智能体交互
机器人
计算机网络
车载导航
医学
工业物流
咱们能够看到,仍然有许许多多的领域还没有得以开发,加之人们对深度学习的热情很是高涨,我相信之后确定会有更多的突破!
下面是一则最近的消息:
我但愿你如今可以深刻了解强化学习的工做原理。这里仍是一些额外的资源,能够帮助你学习更多有关强化学习的内容。
有关强化学习的视频
https://www.analyticsvidhya.com/blog/2016/12/21-deep-learning-videos-tutorials-courses-on-youtube-from-2016/
有关强化学习的书籍
https://webdocs.cs.ualberta.ca/~sutton/book/bookdraft2016sep.pdf
GitHub上有关强化学习的资料库
https://github.com/aikorea/awesome-rl
David Silver的强化学习课程
https://www.youtube.com/playlist?list=PLV_1KI9mrSpGFoaxoL9BCZeen_s987Yxb
本文做者 Faizan Shaikh
是 AnalyticsVidhya 的数据科学实习生,目前致力于研究深度学习,目标是利用本身的技能,推进AI研究的进展。