获取更多资讯,赶快关注上面的公众号吧!
本章内容将介绍强化学习的基本概念、工作原理和监督、非监督学习的不同,并说明如何使用开发和比较强化学习算法的工具Gym。
当我们思考学习的本质时,我们首先想到的是通过与环境交互来学习。当婴儿玩耍,挥舞手臂或四处张望时,他没有明确的老师,但他可以通过直接的感觉运动与环境联系。他可以通过这种联系获得大量关于因果关系,行为结果结果,以及如何实现目标的信息。在我们的生活中,这样的互动无疑是对环境和我们自己的主要知识来源。无论我们是学开车还是交谈,我们都可以敏锐地意识到我们的环境对我们所做的事情将作出什么样的反应,并且我们试图通过我们的行为来影响所发生的事情。从交互中学习是几乎所有学习和智能理论的基本思想。
在这里,我们探索了一种从交互中学习的计算方法。我们不直接对人或动物如何学习进行理论分析,而是探索理想化的学习情境,评估各种学习方法的效率。也就是说,我们采用人工智能研究人员或工程师的角度。我们去探索设计在科学或经济学领域可以有效解决学习问题,并通过数据分析和计算实验来评估这些设计。我们将这种方法称为强化学习,其与其他机器学习方法相比,更侧重于目标导向的交互学习。
强化学习就是学习怎么做,即如何建立情境-动作映射,以最大化数值奖励信号。学习器并没有被告知采取什么动作,而是通过不断尝试去发现能最大奖励的动作。在最有趣和最具挑战性的情况中,动作不仅影响瞬时报酬,还会影响下一场景,并由此影响后续的奖励。试错搜素和延迟奖励是强化学习最重要的两个特征。
强化学习与监督学习不同,后者是目前机器学习领域研究较多的一种学习方式。监督学习是从由专家提供的一组带标签的训练集中学习的。每个示例都是对一个情境和说明即标签的描述,该标签就是系统在该情境应该采取的正确动作,通常用于标识该情境所属的类别。这类学习的目的是让系统推断或概括它的响应,以便在未知训练集上也能正确工作。这是一种重要的学习,但仅凭这一点不足以从交互中学习。在交互问题中,代理需要在所有情境中采取正确的典型的可选动作,而获取这样的例子通常是不切实际的。在一个未知的领域,若要使学习收益最大化,代理必须能够从自己的经验中学习。
强化学习也不同于机器学习研究人员所说的无监督学习,后者通常是发现隐藏在未标记数据集合中的结构。监督学习和非监督学习这两个术语似乎囊括了机器学习的范式,但它们并没有。尽管人们可能会倾向于认为强化学习是一种无监督学习,因为它不依赖于正确行为的例子,但强化学习试图最大化奖励信号,而不是试图寻找隐藏的结构。在一个代理的经验中发现结构对于强化学习当然是有用的,但它本身并不能解决最大化奖励信号的强化学习问题。因此,我们认为强化学习是第三种机器学习范式,与监督学习、非监督学习以及其他范式并列,如图1所示。
• 直升机特技飞行;
• 在西洋双陆棋比赛中击败世界冠军;
• 管理投资组合;
• 控制发电站;
• 让一个人形机器人走路;
• 很多不同的雅达利游戏中玩得比人类更好。
除了代理和环境,强化学习系统一般有四个主要元素:策略,奖励信号,值函数,和一个可选的环境模型。
策略定义了学习代理在给定时间内的行为方式。粗略地说,策略是将环境中感知的状态映射为在这些状态下采取的行动。它对应于心理学中所谓的一系列刺激反应规则或关联。在某些情况下,策略可能是一个简单的函数或查找表,而在其他情况下,它可能涉及到大量的计算,如搜索过程。该策略是强化学习代理的核心,因为它本身就足以确定行为。一般来说,策略可能是随机的,指定了采取每个动作的概率。
奖励信号定义了强化学习问题的目标。在每一个时间步,环境发给代理的单一数字称为奖励。代理的唯一目标是最大化其长期获得的总奖励。因此,奖励信号定义了对代理而言的好坏事件。在生物系统中,我们可能认为奖励是类似于快乐或痛苦的经历。它们是代理所面临问题的直接精确的特征。奖励信号是改变策略的主要依据;如果策略选择的动作之后是得到了低回报,那么策略可能会被改变,以便在未来的情况下选择其他动作。总之,奖励信号可能是环境状态和所采取的行动的随机函数。
虽然奖励信号表明什么是直接意义上的好东西,但价值函数指明了长期内什么是好的。粗略地说,一个状态的价值是从该状态开始在未来可以预期累积的总奖励。鉴于奖励体现了环境状态的直接价值,价值则考虑了后续状态及奖励,从而反映了状态长期价值。例如,一个状态的瞬时奖励可能很低,但因为其后续状态具有高额奖励,因而也具有很高的价值,反之亦然。以人类作类比,奖励有点像快乐(如果是高的)和痛苦(如果是低的),而价值则对应于特定状态下一种更为精确和远见的对于满意与不满意的判断。
从某种意义上说,奖励是主要的,而价值作为奖励的预测是次要的。没有奖励就没有价值,估计价值的唯一目的是获得更多的奖励。然而,在制定和评估决策时,我们最关心的是价值。行动选择是基于价值判断的。我们寻求带来最高价值的动作,而不是最高奖励的,因为这些行动从长远来看对我们的回报最大。不幸的是,确定价值要比确定奖励难得多。奖励基本上是由环境直接给予的,但是价值必须通过一个代理在其整个生命周期中进行的一系列观察来评估和重新评估。事实上,我们所考虑的几乎所有强化学习算法中最重要的组成部分是一种有效估计值的方法。价值评估的中心作用可以说是我们在过去60年中学习强化学习的最重要的东西。
一些强化学习系统具有第四个也是最后一个要素,既环境模型。这是对环境的模拟,或者说,它对环境的行为做出推断。例如,给定一个状态和动作,该模型可以预测生成的下一个状态和下一个奖励。模型用于规划,规划指的是在实际经历之前考虑未来可能发生的情况来决定行动路线的任何方式。使用模型和规划解决强化学习问题的方法被称为基于模型的方法。更简单的无模型方法正好相反,它通过试错学习。
强化学习是一种理解和自动进行目标导向学习和决策的计算方法。它与其他计算方法不同之处在于它强调了代理通过与环境的直接交互进行学习,而不依赖于监督或完整的环境模型。在我们看来,第一个认真处理从与环境的交互中学习以实现长期目标中出现的计算问题的领域就是强化学习。
强化学习使用马尔可夫决策过程的正式框架来定义学习代理与其环境之间的交互作用,包括状态、动作和奖励。这个框架用简单的方法来表示人工智能问题的基本特征。这些特征包括因果性、不确定性和不确定性,以及目标的存在性。
奖励和价值函数的概念是大多数强化学习方法的主要特征。我们认为,在策略空间中,价值函数对于有效搜索是非常重要的。价值函数的使用区分了强化学习方法和根据整个策略的评估直接在策略空间中搜索的进化方法。
Gym是一个开发和比较强化学习算法的工具包。它对代理的结构没有任何假设,并且兼容于任何数值计算库(如TensorFlow或Theano)。
Gym库中包含许多可以用于制定强化学习算法的测试问题(即环境),这些环境有共享接口,允许编写通用的算法。
首先,需要安装Python 3.5+,只需使用pip安装gym:
pip install gym
这里需要更新pip至19.2.2版本,直接用以下命令即可:
python -m pip install --upgrade pip
如果喜欢的话,也可以直接克隆gym git库,当需要更改gym或者添加新的环境时这非常有用。用以下进行下载和安装:
git clone https://github.com/openai/gym
cd gym
pip install -e .
为了安装整个环境集,需要先安装部分系统包。
MuJoCo安装教程见https://github.com/openai/mujoco-py#obtaining-the-binaries-and-license-key。
Pip版本
要求Pip版本至少为1.5.0,可执行pip install --ignore-installed pip进行pip升级。
之后(mujoco-py需要单独安装)可以运行以下命令对所有环境进行完成安装:
pip install -e .[all]
下面是运行程序的简单案例,运行环境CartPole-v0 1000步,每一步都渲染环境,然后弹出的窗口将呈现经典的小车倒立摆问题。
import gym
env = gym.make('CartPole-v0')
env.reset()
for _ in range(1000):
env.render()
env.step(env.action_space.sample()) # take a random action
env.close()
如果想看到其他环境的运行效果,可以将上面的CartPole-v0替换为MountainCar-v0、MsPacman-v0(需要Atari依赖)或Hopper-v1(需要MuJoCo依赖)。
如果想要在每一步比随机行为做的更高,就需要知道采取的动作是如何在环境中进行交互的。
环境的step函数返回的值就是我们所需要的,实际上,每一步环境都会返回四个值:
一个经典的强化学习智能体与环境交互的过程可以被描述成如下方式:每次迭代,智能体选择一个动作,这个动作输入到环境中去,智能体会得到下一个观察(也就是下一个状态)和奖励。
程序开始时先调用reset(),它会返回一个初始的观测值,一个合适的方式编写代码如下所示:
import gym
env = gym.make('CartPole-v0')
for i_episode in range(20):
observation = env.reset()
for t in range(100):
env.render()
print(observation)
action = env.action_space.sample()
observation, reward, done, info = env.step(action)
if done:
print("Episode finished after {} timesteps".format(t+1))
break
env.close()
通过运行这段代码,可以输出以下视频和结果,可以清楚地看到在哪进行了reset。
在上面的例子中,我们一直在从环境的动作空间中随机抽取动作。但这些动作究竟是什么呢?每个环境都有一个action_space和一个observation_space。这些属性属于Space类型,它们描述了有效动作和观察的格式:
import gym
env = gym.make('CartPole-v0')
print(env.action_space)
#> Discrete(2)
print(env.observation_space)
#> Box(4,)
离散空间允许一个固定的非负数范围,所以在这种情况下有效的动作为0或1。Box空间表示一个n维的box,因此有效的观察值将是一个由4个数字组成的数组。可以通过以下来检查动作的边界范围:
print(env.observation_space.high)
#> array([ 2.4 , inf, 0.20943951, inf])
print(env.observation_space.low)
#> array([-2.4 , -inf, -0.20943951, -inf])
这种方式可以很有效地帮助我们编写不同环境下的代码,Box和离散的space是最常见的space。你可以从space中进行采样,或者查看一些信息:
from gym import spaces
space = spaces.Discrete(8) # Set with 8 elements {0, 1, 2, ..., 7}
x = space.sample()
assert space.contains(x)
assert space.n == 8
Gym配有多种从难到易的环境,也包含多种不同类型的数据,full list of environments中可以查看概览。
gym的主要目的是提供大量的环境集合,这些环境暴露了一个公共接口,并进行了版本控制以便进行比较。要列出已安装可用的环境,只需询问gym.env .registry:
from gym import envs
print(envs.registry.all())
#> [EnvSpec(DoubleDunk-v0), EnvSpec(InvertedDoublePendulum-v0), EnvSpec(BeamRider-v0), EnvSpec(Phoenix-ram-v0), EnvSpec(Asterix-v0), EnvSpec(TimePilot-v0), EnvSpec(Alien-v0), EnvSpec(Robotank-ram-v0), EnvSpec(CartPole-v0), EnvSpec(Berzerk-v0), EnvSpec(Berzerk-ram-v0), EnvSpec(Gopher-ram-v0), ...
这将给出EnvSpec对象的列表。这些对象定义了特定任务的参数,包括要运行的试验数量和最大步数。例如,EnvSpec(Hopper-v1)定义了一个环境,其中的目标是让一个2D模拟机器人跳跃:EnvSpec(Go9x9-v0)在9x9棋盘上定义了围棋游戏。
这些环境id被视为不透明的字符串。为了确保将来进行有效比较,环境永远不会以影响性能的方式更改,只会被更新的版本替换。我们现在给每个环境加上一个v0后缀,以便将来的替换可以自然地称为v1、v2等。将
将自己的环境添加到注册表中非常容易,从而使它们对gym.make()
可用。make():只需在加载时注册register()
它们。
强化学习(RL)是机器学习中涉及决策和电机控制的子领域。它研究代理如何在复杂、不确定的环境中学习如何实现目标。令人兴奋的原因有两个:
RL非常普遍,包括所有涉及到做出一系列决策的问题:例如,控制机器人的马达使其能够跑和跳;做出商业决策,如定价和库存管理;或玩视频游戏和棋盘游戏。RL甚至可以应用于具有顺序或结构化输出的监督学习问题。
RL算法已经开始在许多困难的环境中取得良好的效果。RL有着悠久的历史,但直到最近在深度学习方面取得的进展之前,它还需要许多针对特定问题的工程。DeepMind的Atari results、Pieter Abbeel小组的BRETT和AlphaGo都使用了深度RL算法,这些算法没有对环境做太多假设,因此可以应用于其他设置。
然而,RL的研究也受到两个因素的影响:
Gym正试图解决这两个问题。