“如何学习新技能?”这是一个全球科学家都在研究的基础问题。为什么会想要知道这个问题的答案呐,答对了好处都有啥呢?
因为一旦我们能够理解这一点,就可以实现一些前人难以想象的事情。 比如让机器自己学习来完成许多“人类才能完成的任务”,从而制造出真正的人工智能。
不过目前为止对上述问题大家都还没有一个完整的答案,但有一些事儿我们倒是清楚的。即无论什么样的技能,首先都是通过个体与环境之间的交互来学习的。无论是我们学习开车还是婴儿学习走路,整个过程都是基于与环境的互动来完成的。
因此,倒是可以得出一个结论,即从互动中学习是所有关于学习和智力理论的一个基本思路。
今天,我们将研究一下增强学习——一种基于与环境互动的面向目标的学习模式。增强学习据说是人工智能的真正的希望。这么说听起来有些唬人,其实倒也没错,因为增强学习确实拥有巨大的潜力。
增强学习目前正在迅速发展,为不同的应用创造出了各种各样的学习算法。因此,熟悉增强学习的套路很重要。如果你现在对增强学习还没啥概念,建议先阅读这一篇介绍关于增强学习和开源的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)。这样我们就得到了一个增强学习问题的简化描述。
增强学习本身从属于一个更大的机器学习算法的分类。下图是关于一个机器学习主要方法的介绍。
机器学习主要分支
让我们来比较一下增强学习与其他学习:
还有第四种称为半监督学习的机器学习方法,其本质上是监督和无监督学习的组合。 与增强学习不同之处在于监督和半监督学习都有一个类似地直接映射,而增强学习则不具备这一点。
为了理解如何解决增强学习问题,我们还是通过一个经典的例子来说明-多臂赌博机问题。这个例子可以帮助我们明白勘探还是开采(exploration vs exploitation)这个基本问题,然后我们再来具体定义解决增强学习的框架。
老虎机
假设你有许多老虎机并且每台的收益都是随机的。
现在我们想要尽可能快地从老虎机获得最多的奖金。该怎么做呐?
一种naive的方法是只选择一台老虎机,并且一整天都只拉一个老虎机的杠杆。听起来很无聊,但它可能会给你“一些”回报。用这种方法,你可能会遇到大奖(概率接近0.00000 ... .1),但大部分情况下只是坐在老虎机前面丢钱。用术语来说,这是一种“纯开采”方法(pure exploitation approach)。但这是最佳选择吗?显然不是。
于是就有另一种方法。我们可以拉动每一个老虎机的杠杆,并向上天祈祷,至少中一个大奖。这是另一种天真的做法,让你一整天都拉动杠杆,但给你一个次优的回报。用术语来说,这种方法是一种“纯勘探”方法(pure exploration approach)。
这两种方法都不是最佳的策略,我们必须从中寻找到一个适当的平衡来获得最大的回报。这叫做增强学习中的开采与勘探困境(exploration vs exploitation dilemma)。
赌博机问题作为一个经典问题,帮助我们正式确立了增强学习问题的框架,在下面列出了解决问题的可能方法。
在增强学习场景中定义解决方案的数学框架被称为马尔可夫决策过程。 由以下参数来定义:
我们必须采取行动(A)来一步步从我们的起始状态转移到我们的最终状态(S)。作为回报,我们采取的每个行动都会获得奖励(R)。我们的行动可能导致积极抑或消极的回报。
我们采取的一系列行动定义了我们的策略,根据策略得到的回报定义了价值(V)。 我们的任务则是通过选择正确的策略来最大化我们的奖励。 所以我们要做的是对于给定时间t的所有可能状态最大化我们的奖励期望:
再来举一个例子来说明一下。
上图是旅行商问题的一个简单表示。任务是从A到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学习的简单描述可以归纳如下:
我们先来看看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 h5py
pip 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被打败的新闻让这个消息显得不那么引人注目,类似的突破也出现了游戏中,其中研究的算法可以达到以至超过人类能达到的准确度。研究仍然是平等的,工业界和学者共同努力,以实现建立更好的自学机器人的目标。
增强学习应用的一些主要领域如下:
还有有很多事情没有探索,将目前的深度学习热潮适用于增强学习,肯定会迎来更大的突破!
我希望现在你对增强学习的工作有了一个较为深入的了解。这里还有一些额外的资源可以帮助您更多地了解增强学习。