本文共 7799 字,大约阅读时间需要 25 分钟。
向AI转型的程序员都关注了这个号???
大数据挖掘DT数据分析 公众号: datadw
“如何学习新技能?”这是一个全球科学家都在研究的基础问题。为什么会想要知道这个问题的答案呐,答对了好处都有啥呢?
因为一旦我们能够理解这一点,就可以实现一些前人难以想象的事情。 比如让机器自己学习来完成许多“人类才能完成的任务”,从而制造出真正的人工智能。
不过目前为止对上述问题大家都还没有一个完整的答案,但有一些事儿我们倒是清楚的。即无论什么样的技能,首先都是通过个体与环境之间的交互来学习的。无论是我们学习开车还是婴儿学习走路,整个过程都是基于与环境的互动来完成的。
因此,倒是可以得出一个结论,即从互动中学习是所有关于学习和智力理论的一个基本思路。
今天,我们将研究一下增强学习——一种基于与环境互动的面向目标的学习模式。增强学习据说是人工智能的真正的希望。这么说听起来有些唬人,其实倒也没错,因为增强学习确实拥有巨大的潜力。
增强学习目前正在迅速发展,为不同的应用创造出了各种各样的学习算法。因此,熟悉增强学习的套路很重要。如果你现在对增强学习还没啥概念,建议先阅读这一篇介绍关于增强学习和开源的RL平台的文章https://www.analyticsvidhya.com/blog/2016/12/getting-ready-for-ai-based-gaming-agents-overview-of-open-source-reinforcement-learning-platforms/
一旦你对于增强学习有了一个基本的认识,请继续阅读本文。在本文末尾,你将彻底了解增强学习及其实际应用。
小提示:为了实现增强学习算法,需要有一些Python的基础,可以从本站的其他文章入门。
确定一个增强学习问题
与其他机器学习方法的比较
解决增强学习问题的框架
增强学习的一个实现
增加复杂性
窥探最近的增强学习进展
其他资源
增强学习算法学习动作本身,以及如何将具体状态映射到某种特定动作。最终我们想要达到的结果是使以数字形式表示的奖励信号尽可能地大。而在这一过程中,学习者一开始不知道要采取哪些行动才能达成这个目标,必须要自己发现哪种行动会在未来产生最大的回报。话很绕口,让我来举个简单例子。
一个孩子学习走路
孩子首先注意你如何走路。发现你用两条腿,一步接一步地走。了解这个概念之后,孩子会试图复制你的行为。
不过没过一会儿,他/她就发现,要想走路,首先得站起来!这是在尝试走路时遇到第一个的挑战,于是孩子得先想办法站起来,虽然晃晃悠悠地还不时会滑倒,孩子最终还是站了起来。
但事情远远没完,还有另一个挑战。站起来很容易,保持稳定则是另一项艰巨的任务!只要功夫深,铁杵磨成针,孩子慢慢学会了找到支点,站住了脚跟。
现在孩子的任务总算变成了开始走路。不过说起来容易做起来难。有太多事情需要时刻记住,比如身体重心的移动,该移动哪一只脚并且选择落点。
所有这一切听起来都像是一个艰巨的任务。事实上从站起来到开始学会走路对于任何孩子都是个挑战,但对于你而言,这件事早就习以为常了,因此你并不会被这个任务所困扰。不过你应该可以理解学会走路对于一个孩子来说还是挺不容易的。
现在让我们把上面的例子变得正式一点,例子中出现的“问题”就是走路,孩子作为一个主体(agent),试图通过采取行动(action),在这个例子里是行走,来与环境(environment)互动(这里指是行走时的路面),他/她试图从一个状态(state)走到另一个。当他/她完成一个任务的子模块(比如说走两步)时,孩子得到奖励(reward),这里让我们用巧克力来代表,并且当他/她不能走路时不会收到任何巧克力(a.k.a negative reward)。这样我们就得到了一个增强学习问题的简化描述。
增强学习本身从属于一个更大的机器学习算法的分类。下图是关于一个机器学习主要方法的介绍。
机器学习主要分支
让我们来比较一下增强学习与其他学习:
监督学习与增强学习: 在监督学习中,存在一个“监督者”(supervisor),拥有关于环境的信息,这些知识可以被共享给agent来完成任务。但是在某些问题中,agent为了实现目标,其执行的子任务之间存在太多的组合。此时用一个“监督者”来了解所有的可能情况是不切实际的。例如,在象棋游戏中,可供执行的操作是数以万计的,创建一个知识库来统计所有可以执行的操作是一项繁琐的工作。对于这些问题,更加可行的一种方案是从自身的经验中去不断学习,来获取知识。这一点即是增强学习和监督学习的主要区别。在监督学习和增强学习中,都存在一个输入和输出之间的映射(mapping)。但是在增强学习中,有一个奖励函数(reward function)不断反馈给主体,这点和监督学习很不相同。
非监督学习与增强学习: 在增强学习中,有一个从输入到输出的映射,而这在无监督学习中是没有的。 因为无监督学习的主要任务是找到底层模式而不是映射。 比如一个任务是向用户推送个性化的文章,无监督学习算法将会查看与该用户之前已经阅读过的类似的文章,然后从中进行推荐。 而增强学习算法将通过推送少量的新闻文章来获得来自用户的不断反馈(喜欢或者不喜欢),在这个过程中不断构建一个“知识图”关于哪种文章用户会喜欢。
还有第四种称为半监督学习的机器学习方法,其本质上是监督和无监督学习的组合。 与增强学习不同之处在于监督和半监督学习都有一个类似地直接映射,而增强学习则不具备这一点。
为了理解如何解决增强学习问题,我们还是通过一个经典的例子来说明-多臂赌博机问题。这个例子可以帮助我们明白勘探还是开采(exploration vs exploitation)这个基本问题,然后我们再来具体定义解决增强学习的框架。
老虎机
假设你有许多老虎机并且每台的收益都是随机的。
现在我们想要尽可能快地从老虎机获得最多的奖金。该怎么做呐?
一种naive的方法是只选择一台老虎机,并且一整天都只拉一个老虎机的杠杆。听起来很无聊,但它可能会给你“一些”回报。用这种方法,你可能会遇到大奖(概率接近0.00000 ... .1),但大部分情况下只是坐在老虎机前面丢钱。用术语来说,这是一种“纯开采”方法(pure exploitation approach)。但这是最佳选择吗?显然不是。
于是就有另一种方法。我们可以拉动每一个老虎机的杠杆,并向上天祈祷,至少中一个大奖。这是另一种天真的做法,让你一整天都拉动杠杆,但给你一个次优的回报。用术语来说,这种方法是一种“纯勘探”方法(pure exploration approach)。
这两种方法都不是最佳的策略,我们必须从中寻找到一个适当的平衡来获得最大的回报。这叫做增强学习中的开采与勘探困境(exploration vs exploitation dilemma)。
赌博机问题作为一个经典问题,帮助我们正式确立了增强学习问题的框架,在下面列出了解决问题的可能方法。
在增强学习场景中定义解决方案的数学框架被称为马尔可夫决策过程。 由以下参数来定义:
状态集,S
动作集,A
奖励函数,R
策略, π
价值,V
我们必须采取行动(A)来一步步从我们的起始状态转移到我们的最终状态(S)。作为回报,我们采取的每个行动都会获得奖励(R)。我们的行动可能导致积极抑或消极的回报。
我们采取的一系列行动定义了我们的策略,根据策略得到的回报定义了价值(V)。 我们的任务则是通过选择正确的策略来最大化我们的奖励。 所以我们要做的是对于给定时间t的所有可能状态最大化我们的奖励期望:
再来举一个例子来说明一下。
上图是旅行商问题的一个简单表示。任务是从A到F,且将成本控制得尽可能低。两个位置之间连线旁的数字代表穿过这段距离所需的费用。其中负的成本实际上是一些收益。 我们定义价值是执行策略时的总累积奖励。
于是就有,
状态集为各个节点{A,B,C,D,E,F}
可选择的动作为从一个点到其他点,比如{A ->B,C ->D,...}
奖励函数为每个边所代表的值,即费用
策略是完成这个任务的路径,比如{A ->C ->F}
现在假定你在位置A,你现在只能看到的路径只有到下一个目的地之间所有可能的路径,其他的信息在这个阶段都无法得知。
你可以采取一种贪婪方法,即永远只选择奖励最好的下一步。这是即是在{A ->(B,C,D,E)}的子集中选择{A ->D}。于是现在你在D,想去F,你可以从{D->(B,C,F)}中选择。我们看到{D ->F}成本最低,因此我们选择了这条路。
所以在这里,我们的策略是{A ->D ->F},我们所选择的策略的价值是-120。
恭喜! 你刚刚已经实现了一种增强学习算法。 这个算法被称为epsilon贪婪算法(epsilon greedy),就如同其字面意思,这个方法采取一种贪心的方法来解决问题。 现在,如果你(旅行商)想要从A到F,你总是会选择同样的路径。
能猜出来我们的策略属于哪个类别吗(纯勘探与纯开采)?
请注意,我们采取的贪婪算法并不是最优策略。我们必须一点一点的“勘探”出最优的策略。我们在这里采取的方法是基于策略的学习,我们的任务是在所有可能的策略中找到最佳策略。对这个问题有不同的方法来解决,我将简要列出主要类别
基于策略, 关注于找到最优策略
基于价值, 关注于找到最优价值
基于动作, 关注于找到最优的动作并且在每一步执行它们
我将尝试在未来的文章中涵盖深入的增强学习算法。目前,您可以先参考这篇对于增强学习算法调查的研究。
https://www.jair.org/media/301/live-301-1562-jair.pdf
我们将使用深度Q学习算法。Q学习算法是一种基于策略的学习算法,用函数逼近器来作为神经网络。这种算法已经被Google使用在Atari游戏中战胜了人类选手!
我们来看看Q-learning的伪代码:
初始化价值表'Q(s,a)'.
观察当前状态 's'.
根据策略(比如贪心算法)选择一个动作'a'.
执行这个动作,观察奖励'r'和新状态's'.
使用观察到的奖励和下一个状态可能的最大奖励来更新状态的价值。更新是基于上述公式和参数。
将状态设置为新状态,并重复该过程,直到达到终端状态。
Q学习的简单描述可以归纳如下:
我们先来看看Cartpole问题,然后用代码来解决这个方案
我记得我小时候,会捡一根木棍,然后试着用一只手来立着平衡它。我和我的朋友曾经比赛看谁能保持更长时间的平衡,获胜者会得到一个“奖励”,一块巧克力。下面让我们放码过来:
不过为了执行我们的代码,必须先安装一些东西。
第一步:安装keras-rl库
在终端运行如下命令:
# 从git上clone下keras-rl库并安装git clone https://github.com/matthiasplappert/keras-rl.git cd keras-rlpython setup.py install
第二步:安装CartPole环境的依赖包
我们假定你已经装好了pip,你需要安装下面这些库
pip install h5pypip install gym
第三步:开始
首先让我们载入相关必要模块
import numpy as npimport gymfrom keras.models import Sequentialfrom keras.layers import Dense, Activation, Flattenfrom keras.optimizers import Adamfrom rl.agents.dqn import DQNAgentfrom rl.policy import EpsGreedyQPolicyfrom rl.memory import SequentialMemory[/amalthea_sample_code][/amalthea_exercise]
# 设定相关变量ENV_NAME = 'CartPole-v0'# 设定问题环境和动作空间 env = gym.make(ENV_NAME)np.random.seed(123) env.seed(123)nb_actions = env.action_space.n
然后我们来搭建一个非常简单的含单层隐藏层的神经网络。
# 利用keras搭建神经网络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())
接下来,让我们配置和编译我们的agent。 我们将策略设定为Epsilon Greedy,同时我们的内存设置为顺序内存,因为我们想要存储执行动作的结果以及每个动作获得的回报。
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'])dqn.fit(env, nb_steps=5000, visualize=True, verbose=2)
现在可以测试下我们的增强学习模型:
dqn.test(env, nb_episodes=5, visualize=True)
我们的模型会有如下输出:
万事大吉,你刚刚造出了一个增强学习机器人!
既然我们已经完成了一个增强学习的基本实现,那么让我们开始多涉及一些别的问题,一点一点增加复杂度。
它是在1883年发明的,由3根杆组成,包括从最左边的杆开始的多个顺序大小的盘。目的是将所有的盘从最左边的杆移动到最右边的杆,移动次数最少。
如果我们要映射这个问题,必须从一些状态开始:
开始状态 三张盘子按顺序排列在最左边的杆上
结束状态 三张盘子按顺序排列在最右边的杆上
所有可能状态:
下面是27种可能状态:
所有盘子在一根杆上 | 一个盘子一根杆 | (13)盘子在一根杆上 | (23)盘子在一根杆上 | (12)盘子在一根杆上 |
---|---|---|---|---|
(123)** | 321 | (13)2* | (23)1* | (12)3* |
*(123)* | 312 | (13)*2 | (23)*1 | (12)*3 |
**(123) | 231 | 2(13)* | 1(23)* | 3(12)* |
132 | *(13)2 | *(23)1 | *(12)3 | |
213 | 2*(13) | 1*(23) | 3*(12) | |
123 | *2(13) | *1(23) | *3(12) |
(12)3*代表1号盘和2号盘在最左边的杆上,3号盘在中间的杆上,最右边的杆上没有盘子
数值奖励:
我们希望能在最短的移动步数里解决问题,所以我们可以将奖励设为每一步为 -1
策略:
现在,不讨论任何技术细节,我们可以映射出上述状态之间的可能转换。 例如状态(123)** ->(23)1 *伴随奖励为-1。同时也可以转换为状态(23)* 1
我们现在可以看到一个并行的,上述27个状态中的每一个都可以代表一个与之前旅行商问题类似的图形,我们可以通过实验各种状态和路径找到最优解。
对于这个问题,我希望你可以自己思考。按照上面的思路,应该是没问题的。
首先定义开始状态和结束状态。接下来,定义所有可能的状态及其转换以及奖励和策略。最后,你应该能够使用相同的方法创建一个解决更多维魔方的解决方案。
本文来自 微信公众号 datadw 【大数据挖掘DT数据分析】
你可能意识到,这个魔方问题的复杂性比汉诺塔问题高很多倍。你还可以了解到当数量增加时选择的数量也会剧增。现在,想想国际象棋的数量和选择,然后是围棋。Google DeepMind最近创建了一个深入的增强学习算法,击败了Lee Sedol!
随着深度学习最近的成功,现在关注重点正在慢慢转向应用深度学习来解决增强学习问题。Google DeepMindz正在开发这方面的深层增强学习算法,尽管Lee Sedol被打败的新闻让这个消息显得不那么引人注目,类似的突破也出现了游戏中,其中研究的算法可以达到以至超过人类能达到的准确度。研究仍然是平等的,工业界和学者共同努力,以实现建立更好的自学机器人的目标。
增强学习应用的一些主要领域如下:
游戏理论与多主体交互
机器人
电脑网络
车载导航
医学
工业物流
还有有很多事情没有探索,将目前的深度学习热潮适用于增强学习,肯定会迎来更大的突破!
我希望现在你对增强学习的工作有了一个较为深入的了解。这里还有一些额外的资源可以帮助您更多地了解增强学习。
Videos on Reinforcement Learning
https://www.analyticsvidhya.com/blog/2016/12/21-deep-learning-videos-tutorials-courses-on-youtube-from-2016/
Book on Introduction to Reinforcement Learning
https://webdocs.cs.ualberta.ca/~sutton/book/bookdraft2016sep.pdf
Awesome Reinforcement Learning Github repo
https://github.com/aikorea/awesome-rl
Course on Reinforcement Learning by David Silver
https://www.youtube.com/playlist?list=PLV_1KI9mrSpGFoaxoL9BCZeen_s987Yxb
人工智能大数据与深度学习
搜索添加微信公众号:weic2c
长按图片,识别二维码,点关注
大数据挖掘DT数据分析
搜索添加微信公众号:datadw
教你机器学习,教你数据挖掘
长按图片,识别二维码,点关注
转载地址:http://cpmoj.baihongyu.com/