本文正在参加「金石计划 . 分割6万现金大奖」
1.1 强化学习概述
强化学习(reinforcement learning,RL) 评论的问题是智能体(agent)怎样在杂乱、不确认的环境(environment)中最大化它能取得的奖赏。如图 1.1 所示,强化学习由两部分组成:智能体和环境。在强化学习进程中,智能体与环境一向在交互。智能体在环境中获取某个状况后,它会运用该状况输出一个动作 (action),这个动作也称为决议计划(decision)。然后这个动作会在环境中被履行,环境会依据智能体采纳的动作,输出下一个状况以及当时这个动作带来的奖赏。智能体的意图便是尽或许多地从环境中获取奖赏。
1.1.1 强化学习与监督学习
咱们能够把强化学习与监督学习做一个对比。以图片分类为例,如图 1.2 所示,监督学习(supervised learning) 假定咱们有许多被标示的数据,比方轿车、飞机、椅子这些被标示的图片,这些图片都要满意独立同散布,即它们之间是没有相关关系的。假定咱们练习一个分类器,比方神经网络。为了分辨输入的 图片中是轿车仍是飞机,在练习进程中,需求把正确的标签信息传递给神经网络。 当神经网络做出过错的猜测时,比方输入轿车的图片,它猜测出来是飞机,咱们就会直接告知它,该猜测是过错的,正确的标签应该是轿车。终究咱们依据相似过错写出一个丢失函数(loss function),经过反向传播(back propagation)来练习神经网络。
所以在监督学习进程中,有两个假定:
- 输入的数据(标示的数据)都应是没有相关的。由于假如输入的数据有相关,学习器(learner)是欠好学习的。
- 需求告知学习器正确的标签是什么,这样它能够经过正确的标签来修正自己的猜测。
通常假定样本空间中整体样本服从一个不知道散布,咱们取得的每个样本都是独登时从这个散布上采样取得的,即独立同散布(independent and identically distributed,简称 i.i.d.)。
在强化学习中,监督学习的两个假定其实都不能得到满意。以雅达利(Atari) 游戏 Breakout 为例,如图 1.3 所示,这是一个打砖块的游戏,操控木板左右移 动然后把球反弹到上面来消除砖块。在玩游戏的进程中,咱们能够发现智能体得到的观测(observation)不是独立同散布的,上一帧与下一帧间其实有十分强的 接连性。咱们得到的数据是相关的时刻序列数据,不满意独立同散布。别的,我 们并没有马上取得反响,游戏没有告知咱们哪个动作是正确动作。比方现在把木板往右移,这只会使得球往上或许往左一点儿,咱们并不会得到即时的反响。因 此,强化学习之所以困难,是由于智能体不能得到即时的反响,可是咱们仍然希望智能体在这个环境中学习。
如图 1.4 所示,强化学习的练习数据便是一个玩游戏的进程。咱们从第 1 步开端,采纳一个动作,比方咱们把木板往右移,接到球。第 2 步咱们又做出动作,得到的练习数据是一个玩游戏的序列。比方现在是在第 3 步,咱们把这个序列放进网络,希望网络能够输出一个动作,即在当时的状况应该输出往右移或 者往左移。这儿有个问题,咱们没有标签来阐明现在这个动作是正确仍是过错的,必须比及游戏完毕才或许知道,这个游戏或许 10s 后才完毕。现在这个动作究竟对终究游戏是否能赢有无协助,咱们其实是不清楚的。这儿咱们就面对推迟奖赏(delayed reward) 的问题,推迟奖赏使得练习网络十分困难。
强化学习和监督学习的差异如下。
(1)强化学习输入的样本是序列数据,而不像监督学习里边样本都是独立的。
(2)学习器并没有告知咱们每一步正确的动作应该是什么,学习器需求自己去发现哪些动作能够带来 最多的奖赏,只能经过不停地测验来发现最有利的动作。
(3)智能体取得自己才能的进程,其实是不断地试错探究(trial-and-error exploration)的进程。探究 (exploration)和运用(exploitation)是强化学习里边十分中心的问题。其间,探究指测验一些新的动作, 这些新的动作有或许会使咱们得到更多的奖赏,也有或许使咱们“一无一切”;运用指采纳已知的能够获 得最多奖赏的动作,重复履行这个动作,由于咱们知道这样做能够取得必定的奖赏。因而,咱们需求在探 索和运用之间进行权衡,这也是在监督学习里边没有的状况。
(4)在强化学习进程中,没有十分强的监督者(supervisor),只需奖赏信号(reward signal),并且奖赏信号是推迟的,即环境会在很久今后告知咱们之前咱们采纳的动作究竟是不是有用的。由于咱们没有得到即时反响,所以智能体运用强化学习来学习就十分困难。当咱们采纳一个动作后,假如咱们运用监督学习,咱们就能够马上取得一个指导,比方,咱们现在采纳了一个过错的动作,正确的动作应该是什么。而在强化学习里边,环境或许会告知咱们这个动作是过错的,可是它并没有告知咱们正确的动作是什么。并且更困难的是,它或许是在一两分钟过后告知咱们这个动作是过错的。所以这也是强化学习和监督学习不同的当地。
经过与监督学习的比较,咱们能够总结出强化学习的一些特征。
(1)强化学习会试错探究,它经过探究环境来获取对环境的了解。
(2)强化学习智能领会从环境里边取得推迟的奖赏。
(3)在强化学习的练习进程中,时刻十分重要。由于咱们得到的是有时刻相关的数据(sequential data), 而不是独立同散布的数据。在机器学习中,假如观测数据有十分强的相关,会使得练习十分不稳定。这也 是为什么在监督学习中,咱们希望数据尽量满意独立同散布,这样就能够消除数据之间的相关性。
(4)智能体的动作会影响它随后得到的数据,这一点是十分重要的。在练习智能体的进程中,许多时 候咱们也是经过正在学习的智能体与环境交互来得到数据的。所以假如在练习进程中,智能体不能保持稳 定,就会使咱们收集到的数据十分糟糕。咱们经过数据来练习智能体,假如数据有问题,整个练习进程就 会失利。所以在强化学习里边一个十分重要的问题便是,怎样让智能体的动作一向稳定地提升。
1.1.2 强化学习的比方
为什么咱们关注强化学习,其间十分重要的一个原因便是强化学习得到的模型能够有超人类的体现。 监督学习获取的监督数据,其实是人来标示的,比方 ImageNet 的图片的标签都是人类标示的。因而咱们 能够确认监督学习算法的上限(upper bound)便是人类的体现,标示成果决议了它的体现永久不或许超 越人类。可是关于强化学习,它在环境里边自己探究,有十分大的潜力,它能够取得超越人类的才能的表 现,比方 DeepMind 的 AlphaGo 这样一个强化学习的算法能够把人类顶尖的棋手打败。
这儿给咱们举一些在现实生活中强化学习的比方。
(1)在自然界中,羚羊其实也在做强化学习。它刚刚出生的时分,或许都不知道怎样站立,然后它通 过试错,一段时刻后就能够跑得很快,能够适应环境。
(2)咱们也能够把股票交易当作强化学习的进程。咱们能够不断地买卖股票,然后依据市场给出的反响来学会怎样去买卖能够让咱们的奖赏最大化。
(3)玩雅达利游戏或许其他电脑游戏,也是一个强化学习的进程,咱们能够经过不断试错来知道怎样 玩才能够通关。
图 1.5 所示为强化学习的一个经典比方,即雅达利的 Pong 游戏。游戏中右边的选手把球拍到左面, 然后左面的选手需求把球拍到右边。练习好的强化学习智能体和正常的选手有差异:强化学习的智能领会 一向做无意义的振动,而正常的选手不会做出这样的动作。
在 Pong 游戏里边,其实只需两个动作:往上或许往下。如图 1.6 所示,假如强化学习经过学习一个战略网络来进行分类,那么战略网络会输入当时帧的图片,输出一切决议计划的或许性,比方往上移动的概率。
如图 1.7 所示,关于监督学习,咱们能够直接告知智能体正确动作的标签是什么。但在 Pong 游戏中, 咱们并不知道它的正确动作的标签是什么。
在强化学习里边,咱们让智能体测验玩 Pong 游戏,对动作进行采样,直到游戏完毕,然后对每个动作 进行赏罚。图 1.8 所示为预演(rollout)的一个进程。预演是指咱们从当时帧对动作进行采样,生成许多 局游戏。咱们将当时的智能体与环境交互,会得到一系列观测。每一个观测可当作一个轨道(trajectory)。 轨道便是当时帧以及它采纳的战略,即状况和动作的序列:
终究完毕时,咱们会知道究竟有没有把这个球拍到对方区域,对方有没有接住,咱们是赢了仍是输了。我 们能够经过观测序列以及终究奖赏(eventual reward)来练习智能体,使它尽或许地采纳能够取得终究奖 励的动作。一场游戏称为一个回合(episode) 或许 试验(trial)。
1.1.3 强化学习的前史
强化学习是有必定的前史的,前期的强化学习,咱们称其为规范强化学习。最近业界把强化学习与深度学习结合起来,就形成了深度强化学习(deep reinforcemet learning),因而,深度强化学习 = 深度学习 + 强化学习。咱们可将规范强化学习和深度强化学习类比于传统的计算机视觉和深度计算机视觉。
如图 1.9a 所示,传统的计算机视觉由两个进程组成。
(1)给定一张图片,咱们先要提取它的特征,运用一些规划好的特征,比方方向梯度直方图(histogram of oriental gradient,HOG)、可变现的组件模型(deformable part model,DPM)。
(2)提取这些特征后,咱们再单独练习一个分类器。这个分类器能够是支持向量机(support vector machine,SVM)或 Boosting,然后就能够辨别这张图片是狗仍是猫。
2012年,Krizhevsky等人提出了AlexNet,AlexNet在ImageNet分类竞赛中取得冠军,敏捷引起了人们关于卷积神经网络的广泛关注。
咱们就把特征提取以及分类两者合到一块儿去了,便是练习一个神经网络。这个神经网络既能够做特征提取,也能够做分类,它能够完结端到端练习,如图 1.9b 所示,它的参数能够在每一个阶段都得到极大的优化,这是一个十分重要的突破。
咱们能够把神经网络放到强化学习里边。
-
规范强化学习:比方 TD-Gammon 玩 Backgammon 游戏的进程,其实便是规划特征,然后练习价 值函数的进程,如图 1.10a 所示。规范强化学习先规划许多特征,这些特征能够描绘现在整个状况。 得到这些特征后,咱们就能够经过练习一个分类网络或许别离练习一个价值估量函数来采纳动作。
-
深度强化学习:自从咱们有了深度学习,有了神经网络,就能够把智能体玩游戏的进程改善成一个 端到端练习(end-to-end training)的进程,如图 1.10b 所示。咱们不需求规划特征,直接输入状 态就能够输出动作。咱们能够用一个神经网络来拟合价值函数或战略网络,省去特征工程(feature engineering)的进程。
1.1.4 强化学习的运用
为什么强化学习在这几年有许多的运用,比方玩游戏以及机器人的一些运用,并且能够击败人类的顶 尖棋手呢?这有如下几点原因。首要,咱们有了更多的算力(computation power),有了更多的 GPU,可 以更快地做更多的试错测验。其次,经过不同测验,智能体在环境里边取得了许多信息,然后能够在环境 里边取得很大的奖赏。终究,咱们经过端到端练习把特征提取和价值估量或许决议计划一起优化,这样就能够 得到一个更强的决议计划网络。
接下来介绍一些强化学习里边比较有意思的比方,如图 1.11 所示。
(1)DeepMind 研制的走路的智能体。这个智能体往前走一步,就会得到一个奖赏。这个智能体有不 同的形状,能够学到许多有意思的功用。比方,像人相同的智能体学习怎样在弯曲的道路上往前走。成果 十分有意思,这个智能领会把手举得十分高,由于举手能够让它的身体保持平衡,它就能够更快地在环境 里边往前走。并且咱们也能够增加环境的难度,参加一些扰动,智能体就会变得更鲁棒。
(2)机械臂抓取。由于咱们把强化学习运用到机械臂自动抓取需求许多的预演,所以咱们能够运用多 个机械臂进行练习。散布式体系能够让机械臂测验抓取不同的物体,盘子里边物体的形状是不同的,这样 就能够让机械臂学到一个一致的动作,然后针对不同的抓取物都能够运用最优的抓取算法。由于抓取的物 体形状的差别很大,所以运用一些传统的抓取算法不能把一切物体都抓起来。传统的抓取算法对每一个物 体都需求建模,这样是十分费时的。但经过强化学习,咱们能够学到一个一致的抓取算法,其适用于不同 的物体。
(3)OpenAI 的机械臂翻魔方。OpenAI 在 2018 年的时分规划了一款带有“手指”的机械臂,它能够 经过翻动手指使得手中的木块抵达预期的设定。人的手指其实十分灵敏,怎样使得机械臂的手指也具有这 样灵敏的才能一向是个问题。OpenAI 先在一个虚拟环境里边运用强化学习对智能体进行练习,再把它应 用到实在的机械臂上。这在强化学习里边是一种比较常用的做法,即咱们先在虚拟环境里边得到一个很好 的智能体,然后把它运用到实在的机器人中。这是由于实在的机械臂通常十分简略坏,并且十分贵,一般 状况下没办法大批量地购买。OpenAI 在 2019 年对其机械臂进行了进一步的改善,这个机械臂在改善后 能够玩魔方了。
(4)穿衣服的智能体。许多时分咱们要在电影或许一些动画中完结人穿衣服的场景,经过手写履行命 令让机器人穿衣服十分困难,穿衣服也是一种十分精密的操作。咱们能够练习强化学习智能体来完结穿衣 服功用。咱们还能够在里边参加一些扰动,智能体能够抵抗扰动。或许会有失利的状况(failure case)出 现,这样智能体就穿不进去衣服。
1.2 序列决议计划
1.2.1 智能体与环境
接下来咱们介绍序列决议计划(sequential decision making) 进程。强化学习研讨的问题是智能体与环 境交互的问题,图 1.12 左面的智能体一向在与图 1.12 右边的环境进行交互。智能体把它的动作输出给环境,环境取得这个动作后会进行下一步,把下一步的观测与这个动作带来的奖赏返还给智能体。这样的交 互会发生许多观测,智能体的意图是从这些观测之中学到能最大化奖赏的战略。
1.2.2 奖赏
奖赏是由环境给的一种标量的反响信号(scalar feedback signal),这种信号可显现智能体在某一步采 取某个战略的体现怎样。强化学习的意图便是最大化智能体能够取得的奖赏,智能体在环境里边存在的目 的便是最大化它的希望的累积奖赏(expected cumulative reward)。不同的环境中,奖赏也是不同的。这 里给咱们举一些奖赏的比方。
(1)比方一个象棋选手,他的意图是赢棋,在终究棋局完毕的时分,他就会得到一个正奖赏(赢)或 者负奖赏(输)。
(2)在股票办理里边,奖赏由股票获取的奖赏与丢失决议。
(3)在玩雅达利游戏的时分,奖赏便是增加或减少的游戏的分数,奖赏本身的稀少程度决议了游戏的难度。
1.2.3 序列决议计划
在一个强化学习环境里边,智能体的意图便是选取一系列的动作来最大化奖赏,所以这些选取的动作 必须有长时刻的影响。但在这个进程里边,智能体的奖赏其实是被推迟了的,便是咱们现在选取的某一步动作,或许要比及很久后才知道这一步究竟发生了什么样的影响。如图 1.13 所示,在玩雅达利的 Pong 游戏 时,咱们或许只需到终究游戏完毕时,才知道球究竟有没有被击打过去。进程中咱们采纳的上升(up)或 下降(down)动作,并不会直接发生奖赏。强化学习里边一个重要的课题便是近期奖赏和远期奖赏的权衡 (trade-off),研讨怎样让智能体取得更多的远期奖赏。
在与环境的交互进程中,智能领会取得许多观测。针对每一个观测,智能领会采纳一个动作,也会得到一个奖赏。所以前史是观测、动作、奖赏的序列:
智能体在采纳当时动作的时分会依赖于它之前得到的前史,所以咱们能够把整个游戏的状况当作关于这个前史的函数:
Q:状况和观测有什么关系?
A:状况是对国际的完好描绘,不会躲藏国际的信息。观测是对状况的部分描绘,或许会遗失一些信息。在深度强化学习中,咱们几乎总是用实值的向量、矩阵或许更高阶的张量来表明状况和观测。例如, 咱们能够用 RGB 像素值的矩阵来表明一个视觉的观测,能够用机器人关节的视点和速度来表明一个机器 人的状况。
环境有自己的函数ste=fe(Ht)s_{t}^{e}=f^{e}\left(H_{t}\right) 来更新状况,在智能体的内部也有一个函数sta=fa(Ht)s_{t}^{a}=f^{a}\left(H_{t}\right)来更新状 态。当智能体的状况与环境的状况等价的时分,即当智能体能够观察到环境的一切状况时,咱们称这个环 境是彻底可观测的(fully observed)。在这种状况下面,强化学习通常被建模成一个马尔可夫决议计划进程 (Markov decision process,MDP)的问题。在马尔可夫决议计划进程中,ot=ste=stao_{t}=s_{t}^{e}=s_{t}^{a}。
可是有一种状况是智能体得到的观测并不能包括环境运作的一切状况,由于在强化学习的设定里边, 环境的状况才是真正的一切状况。比方智能体在玩 black jack 游戏,它能看到的其实是牌面上的牌。或许在 玩雅达利游戏的时分,观测到的仅仅当时电视上面这一帧的信息,咱们并没有得到游戏内部里边一切的运 作状况。也便是当智能体只能看到部分的观测,咱们就称这个环境是部分可观测的(partially observed)。 在这种状况下,强化学习通常被建模成部分可观测马尔可夫决议计划进程(partially observable Markov decision process, POMDP)的问题。部分可观测马尔可夫决议计划进程是马尔可夫决议计划进程的一种泛化。 部分可观测马尔可夫决议计划进程仍然具有马尔可夫性质,可是假定智能体无法感知环境的状况,只能知道 部分观测值。比方在自动驾驭中,智能体只能感知传感器收集的有限的环境信息。部分可观测马尔可夫决议计划进程能够用一个七元组描绘:(S,A,T,R,Ω,O,γ)(S,A,T,R,\Omega,O,\gamma)。其间 SS 表明状况空间,为隐变量,AA 为动作空间,T(s′∣s,a)T(s’|s,a) 为状况搬运概率,RR 为奖赏函数,Ω(o∣s,a)\Omega(o|s,a) 为观测概率,OO 为观测空间,γ\gamma 为扣头系数。
1.3 动作空间
不同的环境答应不同种类的动作。在给定的环境中,有用动作的调集常常被称为动作空间(action space)。像雅达利游戏和围棋(Go)这样的环境有离散动作空间(discrete action space),在这个动作 空间里,智能体的动作数量是有限的。在其他环境,比方在物理国际中操控一个智能体,在这个环境中就 有接连动作空间(continuous action space)。在接连动作空间中,动作是实值的向量。
例如,走迷宫机器人假如只需往东、往南、往西、往北这 4 种移动办法,则其动作空间为离散动作空 间;假如机器人能够向 360 ◦ 中的恣意视点进行移动,则其动作空间为接连动作空间。
1.4 强化学习智能体的组成成分和类型
部分可观测马尔可夫决议计划进程(Partially Observable Markov Decision Processes, POMDP) 是一个马尔可夫决议计划进程的泛化。POMDP 仍然具关于一个强化学习 agent,它或许有一个或多个如下的组成成
关于一个强化学习智能体,它或许有一个或多个如下的组成成分。
-
战略(policy)。智能领会用战略来选取下一步的动作。
-
价值函数(value function)。咱们用价值函数来对当时状况进行评价。价值函数用于评价智能体进 入某个状况后,能够对后面的奖赏带来多大的影响。价值函数值越大,阐明智能体进入这个状况越有 利。
-
模型(model)。模型表明智能体对环境的状况进行了解,它决议了环境中国际的运转办法。 下面咱们深入了解这 3 个组成部分的细节。
1.4.1 战略
战略是智能体的动作模型,它决议了智能体的动作。它其实是一个函数,用于把输入的状况变成动作。战略可分为两种:随机性战略和确认性战略。
随机性战略(stochastic policy) 便是 π\pi 函数,即π(a∣s)=p(at=a∣st=s)\pi(a | s)=p\left(a_{t}=a | s_{t}=s\right)。输入一个状况 ss,输出一个概率。
这个概率是智能体一切动作的概率,然后对这个概率散布进行采样,可得到智能体将采纳的动作。比方或许是有 0.7 的概率往左,0.3 的概率往右,那么经过采样就能够得到智能体将采纳的动作。
确认性战略(deterministic policy) 便是智能体直接采纳最有或许的动作,即 a∗=argmaxaπ(a∣s)a^{*}=\underset{a}{\arg \max} \pi(a \mid s)。
如图 1.14 所示,从雅达利游戏来看,战略函数的输入便是游戏的一帧,它的输出决议智能体向左移动或许向右移动。
通常状况下,强化学习一般运用随机性战略,随机性战略有许多长处。比方,在学习时能够经过引入必定的随机性来更好地探究环境;
随机性战略的动作具有多样性,这一点在多个智能体博弈时十分重要。选用确认性战略的智能体总是对相同的状况采纳相同的动作,这会导致它的战略很简略被对手猜测。
1.4.2 价值函数
价值函数的值是对未来奖赏的猜测,咱们用它来评价状况的好坏。
价值函数里边有一个扣头因子(discount factor),咱们希望在尽或许短的时刻里边得到尽或许多的奖赏。比方现在给咱们两个挑选:10天后给咱们100块钱或许现在给咱们100块钱。咱们肯定更希望现在就给咱们 100 块钱,由于咱们能够把这 100 块钱存在银行里边,这样就会有一些利息。因而,咱们能够把扣头因子放到价值函数的界说里边,价值函数的界说为
希望 Eπ\mathbb{E}_{\pi} 的下标是 π\pi 函数,π\pi 函数的值可反映在咱们运用战略 π\pi 的时分,究竟能够得到多少奖赏。
咱们还有一种价值函数:Q 函数。Q 函数里边包括两个变量:状况和动作。其界说为
所以咱们未来能够取得奖赏的希望取决于当时的状况和当时的动作。Q 函数是强化学习算法里边要学习的一个函数。由于当咱们得到 Q 函数后,进入某个状况要采纳的最优动作能够经过 Q 函数得到。
1.4.3 模型
第3个组成部分是模型,模型决议了下一步的状况。下一步的状况取决于当时的状况以及当时采纳的动作。它由状况搬运概率和奖赏函数两个部分组成。状况搬运概率即
奖赏函数是指咱们在当时状况采纳了某个动作,能够得到多大的奖赏,即
当咱们有了战略、价值函数和模型3个组成部分后,就形成了一个马尔可夫决议计划进程(Markov decision process)。如图 1.15 所示,这个决议计划进程可视化了状况之间的搬运以及采纳的动作。
咱们来看一个走迷宫的比方。如图 1.16 所示,要求智能体从起点(start)开端,然后抵达结尾(goal)的方位。每走一步,咱们就会得到 -1 的奖赏。咱们能够采纳的动作是往上、下、左、右走。咱们用现在智能体所在的方位来描绘当时状况。
咱们能够用不同的强化学习办法来解这个环境。
假如咱们采纳依据战略的强化学习(policy-based RL)办法,当学习好了这个环境后,在每一个状况,咱们都会得到一个最佳的动作。如图 1.17 所示,比方咱们现在在起点方位,咱们知道最佳动作是往右走;在第二格的时分,得到的最佳动作是往上走;第三格是往右走……经过最佳的战略,咱们能够最快地抵达结尾。
假如换成依据价值的强化学习(value-based RL)办法,运用价值函数作为导向,咱们就会得到别的一种表征,每一个状况会回来一个价值。如图 1.18 所示,比方咱们在起点方位的时分,价值是-16,由于咱们最快能够 16 步抵达结尾。由于每走一步会减1,所以这儿的价值是 -16。
当咱们快挨近结尾的时分,这个数字变得越来越大。在角落的时分,比方现在在第二格,价值是-15,智能领会看上、下两格,它看到上面格子的价值变大了,变成 -14 了,下面格子的价值是 -16,那么智能体就会采纳一个往上走的动作。所以经过学习的价值的不同,咱们能够抽取呈现在最佳的战略。
1.4.4 强化学习智能体的类型
1.依据价值的智能体与依据战略的智能体
依据智能体学习的事物不同,咱们能够把智能体进行归类。依据价值的智能体(value-based agent) 显式地学习价值函数,隐式地学习它的战略。战略是其从学到的价值函数里边推算出来的。依据战略的智能体(policy-based agent) 直接学习战略,咱们给它一个状况,它就会输出对应动作的概率。依据战略的智能体并没有学习价值函数。把依据价值的智能体和依据战略的智能体结合起来就有了 艺人-评论员智能体(actor-critic agent)。这一类智能体把战略和价值函数都学习了,然后经过两者的交互得到最佳的动作。
Q: 依据战略和依据价值的强化学习办法有什么差异?
A: 关于一个状况搬运概率已知的马尔可夫决议计划进程,咱们能够运用动态规划算法来求解。从决议计划办法来看,强化学习又能够划分为依据战略的办法和依据价值的办法。决议计划办法是智能体在给定状况下从动作调集中挑选一个动作的依据,它是静态的,不随状况改变而改变。
在依据战略的强化学习办法中,智能领会拟定一套动作战略(确认在给定状况下需求采纳何种动作),并依据这个战略进行操作。强化学习算法直接对战略进行优化,使拟定的战略能够取得最大的奖赏。
而在依据价值的强化学习办法中,智能体不需求拟定显式的战略,它维护一个价值表格或价值函数,并经过这个价值表格或价值函数来选取价值最大的动作。依据价值迭代的办法只能运用在不接连的、离散的环境下(如围棋或某些游戏范畴),关于动作调集规模巨大、动作接连的场景(如机器人操控范畴),其很难学习到较好的成果(此时依据战略迭代的办法能够依据设定的战略来挑选接连的动作)。
依据价值的强化学习算法有Q学习(Q-learning)、 Sarsa 等,而依据战略的强化学习算法有战略梯度(Policy Gradient,PG)算法等。此外,艺人-评论员算法一起运用战略和价值评价来做出决议计划。其间,智能领会依据战略做出动作,而价值函数会对做出的动作给出价值,这样能够在原有的战略梯度算法的基础上加速学习进程,取得更好的作用。
2.有模型强化学习智能体与免模型强化学习智能体
别的,咱们能够经过智能体究竟有没有学习环境模型来对智能体进行分类。
有模型(model-based) 强化学习智能体经过学习状况的搬运来采纳动作。
免模型(model-free) 强化学习智能体没有去直接估量状况的搬运,也没有得到环境的具体搬运变量,它经过学习价值函数和战略函数进行决议计划。免模型强化学习智能体的模型里边没有环境搬运的模型。
咱们能够用马尔可夫决议计划进程来界说强化学习使命,并将其表明为四元组 <S,A,P,R><S,A,P,R>,即状况调集、动作调集、状况搬运函数和奖赏函数。假如这个四元组中一切元素均已知,且状况调集和动作调集在有限步数内是有限集,则智能体能够对实在环境进行建模,构建一个虚拟国际来模仿实在环境中的状况和交互反响。
具体来说,当智能体知道状况搬运函数 P(st+1∣st,at)P(s_{t+1}|s_t,a_t) 和奖赏函数 R(st,at)R(s_t,a_t) 后,它就能知道在某一状况下履行某一动作后能带来的奖赏和环境的下一状况,这样智能体就不需求在实在环境中采纳动作,直接在虚拟国际中学习和规划战略即可。这种学习办法称为有模型强化学习。
有模型强化学习的流程如图 1.19 所示。
可是在实践运用中,智能体并不是那么简略就能知晓马尔可夫决议计划进程中的一切元素的。通常状况下,状况搬运函数和奖赏函数很难估量,甚至连环境中的状况都或许是不知道的,这时就需求选用免模型强化学习。免模型强化学习没有对实在环境进行建模,智能体只能在实在环境中经过必定的战略来履行动作,等候奖赏和状况搬迁,然后依据这些反响信息来更新动作战略,这样重复迭代直到学习到最优战略。
Q:有模型强化学习和免模型强化学习有什么差异?
A:针对是否需求对实在环境建模,强化学习能够分为有模型强化学习和免模型强化学习。有模型强化学习是指依据环境中的经验,构建一个虚拟国际,一起在实在环境和虚拟国际中学习;免模型强化学习是指不对环境进行建模,直接与实在环境进行交互来学习到最优战略。
总归,有模型强化学习比较免模型强化学习仅仅多出一个进程,即对实在环境进行建模。因而,一些有模型的强化学习办法,也能够在免模型的强化学习办法中运用。在实践运用中,假如不清楚该用有模型强化学习仍是免模型强化学习,能够先考虑在智能体履行动作前,是否能对下一步的状况和奖赏进行猜测,假如能,就能够对环境进行建模,然后选用有模型学习。
免模型强化学习通常归于数据驱动型办法,需求许多的采样来估量状况、动作及奖赏函数,然后优化动作战略。例如,在雅达利渠道上的《太空侵略者》游戏中,免模型的深度强化学习需求大约两亿帧游戏画面才能学到比较抱负的作用。比较之下,有模型的深度强化学习能够在必定程度上缓解练习数据匮乏的问题,由于智能体能够在虚拟国际中进行练习。
免模型学习的泛化性要优于有模型强化学习,原因是有模型强化学习算需求对实在环境进行建模,并且虚拟国际与实在环境之间或许还有差异,这约束了有模型强化学习算法的泛化性。
有模型的强化学习办法能够对环境建模,使得该类办法具有共同魅力,即“想象才能”。在免模型强化学习中,智能体只能一步一步地采纳战略,等候实在环境的反响;有模型强化学习能够在虚拟国际中猜测出即将发生的事,并采纳对自己最有利的战略。
现在,大部分深度强化学习办法都选用了免模型强化学习,这是由于:免模型强化学习更为简略、直观且有丰富的开源材料,如 AlphaGo 系列都选用免模型强化学习;在现在的强化学习研讨中,大部分状况下环境都是静态的、可描绘的,智能体的状况是离散的、可观察的(如雅达利游戏渠道),这种相对简略、确认的问题并不需求评价状况搬运函数和奖赏函数,可直接选用免模型强化学习,运用许多的样本进行练习就能取得较好的作用。
如图 1.20 所示,咱们能够把几类模型放到同一个图里边。图 1.20 有3个组成成分:价值函数、战略和模型。按一个智能体具有三者中的三者、两者或一者的状况能够把它分红许多类。
1.5 学习与规划
学习(learning)和规划(planning)是序列决议计划的两个基本问题。
如图 1.21 所示,在强化学习中,环境初始时是不知道的,智能体不知道环境怎样工作,它经过不断地与环境交互,逐步改善战略。
如图 1.22 所示,在规划中,环境是已知的,智能体被告知了整个环境的运作规矩的详细信息。智能体能够计算出一个完美的模型,并且在不需求与环境进行任何交互的时分进行计算。智能体不需求实时地与环境交互就能知道未来环境,只需求知道当时的状况,就能够开端考虑,来寻找最优解。
在图 1.22 所示的游戏中,规矩是确认的,咱们知道挑选左之后环境将会发生什么改变。咱们彻底能够经过已知的规矩,来在内部模仿整个决议计划进程,无需与环境交互。
一个常用的强化学习问题处理思路是,先学习环境怎样工作,也便是了解环境工作的办法,即学习得到一个模型,然后运用这个模型进行规划。
1.6 探究和运用
在强化学习里边,探究和运用是两个很中心的问题。
探究即咱们去探究环境,经过测验不同的动作来得到最佳的战略(带来最大奖赏的战略)。
运用即咱们不去测验新的动作,而是采纳已知的能够带来很大奖赏的动作。
在刚开端的时分,强化学习智能体不知道它采纳了某个动作后会发生什么,所以它只能经过试错去探究,所以探究便是经过试错来了解采纳的动作究竟可不能够带来好的奖赏。运用是指咱们直接采纳已知的能够带来很好奖赏的动作。所以这儿就面对一个权衡问题,即怎样经过牺牲一些短期的奖赏来了解动作,然后学习到更好的战略。
下面举一些探究和运用的比方。
以挑选饭馆为例,运用是指咱们直接去咱们最喜欢的饭馆,由于咱们去过这个饭馆许屡次了,所以咱们知道这儿面的菜都十分可口。
探究是指咱们用手机搜索一个新的饭馆,然后去测验它的菜究竟好欠好吃。咱们有或许对这个新的饭馆感到十分不满意,这样钱就浪费了。
以做广告为例,运用是指咱们直接采纳最优的广告战略。探究是指咱们换一种广告战略,看看这个新的广告战略可不能够得到更好的作用。
以挖油为例,运用是指咱们直接在已知的当地挖油,这样能够保证挖到油。
探究是指咱们在一个新的当地挖油,这样就有很大的概率或许不能发现油田,但也或许有比较小的概率能够发现一个十分大的油田。
以玩游戏为例,运用是指咱们总是采纳某一种战略。比方,咱们玩《街头霸王》游戏的时分,采纳的战略或许是蹲在角落,然后一向出脚。这个战略很或许能够奏效,但或许遇到特定的对手就会失效。
探究是指咱们或许测验一些新的招式,有或许咱们会放出“大招”来,这样就或许“一招毙命”。
与监督学习使命不同,强化学习使命的终究奖赏在多步动作之后才能观察到,这儿咱们无妨先考虑比较简略的景象:最大化单步奖赏,即仅考虑一步动作。需注意的是,即便在这样的简略景象下,强化学习仍与监督学习有显著不同,由于智能体需经过试错来发现各个动作发生的成果,而没有练习数据告知智能体应当采纳哪个动作。
想要最大化单步奖赏需考虑两个方面:一是需知道每个动作带来的奖赏,二是要履行奖赏最大的动作。若每个动作对应的奖赏是一个确认值,那么测验遍一切的动作便能找出奖赏最大的动作。可是,更一般的景象是,一个动作的奖赏值是来自一个概率散布,仅经过一次测验并不能确切地取得均匀奖赏值。
实践上,单步强化学习使命对应于一个理论模型,即KK-臂赌博机(K-armed bandit)。 KK-臂赌博机也被称为多臂赌博机(multi-armed bandit) 。如图 1.23 所示,KK-臂赌博机有 KK 个摇臂,赌徒在投入一个硬币后可挑选按下其间一个摇臂,每个摇臂以必定的概率吐出硬币,但这个概率赌徒并不知道。赌徒的目标是经过必定的战略最大化自己的奖赏,即取得最多的硬币。
若仅为获悉每个摇臂的希望奖赏,则可选用仅探究(exploration-only)法:将一切的测验机会均匀分配给每个摇臂(即轮番按下每个摇臂),终究以每个摇臂各自的均匀吐币概率作为其奖赏希望的近似估量。若仅为履行奖赏最大的动作,则可选用仅运用(exploitation-only)法:按下现在最优的(即到现在为止均匀奖赏最大的)摇臂,若有多个摇臂同为最优,则从中随机选取一个。
显然,仅探究法能很好地估量每个摇臂的奖赏,却会失去许多挑选最优摇臂的机会;仅运用规律相反,它没有很好地估量摇臂希望奖赏,很或许常常选不到最优摇臂。因而,这两种办法都难以使终究的累积奖赏最大化。
事实上,探究(估量摇臂的优劣)和运用(挑选当时最优摇臂)这两者是对立的,由于测验次数(总投币数)有限,加强了一方则自然会削弱另一方,这便是强化学习所面对的 探究-运用困境(exploration-exploitation dilemma)。显然,想要累积奖赏最大,则必须在探究与运用之间达成较好的折中。
1.7 强化学习试验
强化学习是一个理论与实践相结合的机器学习分支,咱们不仅要了解它算法背后的一些数学原理,还要经过上机实践完结算法。在许多试验环境里边去探究算法能不能得到预期作用也是一个十分重要的进程。
咱们能够运用 Python 和深度学习的一些包来完结强化学习算法。现在有许多深度学习的包能够运用,比方 PyTorch、TensorFlow、Keras,娴熟运用其间的两三种,就能够完结十分多的功用。所以咱们并不需求从头去“造轮子”。
1.7.1 Gym
OpenAI是一家非营利性的人工智能研讨公司,其公布了十分多的学习资源以及算法资源。其之所以叫作 OpenAI,他们把一切开发的算法都进行了开源。
如图 1.24 所示,OpenAI 的 Gym库是一个环境仿真库,里边包括许多现有的环境。针对不同的场景,咱们能够挑选不同的环境。离散操控场景(输出的动作是可数的,比方Pong游戏中输出的向上或向下动作)一般运用雅达利环境评价;接连操控场景(输出的动作是不可数的,比方机器人走路时不仅有方向,还有视点,视点便是不可数的,是一个接连的量 )一般运用 MuJoCo 环境评价。Gym Retro是对 Gym 环境的进一步扩展,包括更多的游戏。
咱们能够经过 pip 来装置 Gym库:
pip install gym
在 Python 环境中导入Gym库,假如不报错,就能够以为 Gym 库装置成功。
$python
>>>import gym
比方咱们现在装置了Gym库,就能够直接调入Taxi-v3的环境。初始化这个环境后,咱们就能够进行交互了。智能体得到某个观测后,它就会输出一个动作。这个动作会被环境拿去履行某个进程 ,然后环境就会往前走一步,回来新的观测、奖赏以及一个 flag 变量 done,done 决议这个游戏是不是完毕了。咱们经过几行代码就可完结强化学习的结构:
import gym
env = gym.make("Taxi-v3")
observation = env.reset()
agent = load_agent()
for step in range(100):
action = agent(observation)
observation, reward, done, info = env.step(action)
上面这段代码仅仅示例,其意图是让读者了解强化学习算法代码完结的结构,并非完好代码,load_agent 函数并未界说,所以运转这段代码会报错。
如图 1.25 所示,Gym 库里边有许多经典的操控类游戏。比方 Acrobot需求让一个双连杆机器人立起来;CartPole需求经过操控一辆小车,让杆立起来;MountainCar需求经过前后移动车,让它抵达旗帜的方位。在刚开端测验强化学习的时分,咱们能够挑选这些简略环境,由于强化学习在这些环境中能够在一两分钟之内见到作用。
咱们能够点这个链接看一看这些环境。在刚开端测验强化学习的时分,能够挑选这些简略环境,由于这些环境能够在一两分钟之内见到一个作用。
如图 1.26 所示,CartPole-v0 环境有两个动作:将小车向左移动和将小车向右移动。咱们还能够得到观测:小车当时的方位,小车当时往左、往右移的速度,杆的视点以及杆的最高点(顶端)的速度。
观测越详细,咱们就能够更好地描绘当时一切的状况。这儿有奖赏的界说,假如能多走一步,咱们就会得到一个奖赏(奖赏值为1),所以咱们需求存活尽或许多的时刻来得到更多的奖赏。当杆的视点大于某一个视点(没能保持平衡),或许小车的中心抵达图形界面窗口的边际,或许累积步数大于200,游戏就完毕了,咱们就输了。所以智能体的意图是操控杆,让它尽或许地保持平衡以及尽或许保持在环境的中央。
import gym # 导入 Gym 的 Python 接口环境包
env = gym.make('CartPole-v0') # 构建试验环境
env.reset() # 重置一个回合
for _ in range(1000):
env.render() # 显现图形界面
action = env.action_space.sample() # 从动作空间中随机选取一个动作
env.step(action) # 用于提交动作,括号内是具体的动作
env.close() # 封闭环境
注意:假如制作了试验的图形界面窗口,那么封闭该窗口的最佳办法是调用 env.close()。试图直接封闭图形界面窗口或许会导致内存不能释放,甚至会导致死机。
当咱们履行这段代码时,机器人会驾驭着小车朝某个方向一向跑,直到咱们看不见,这是由于咱们还没开端练习机器人。
Gym 库中的大部分小游戏都能够用一个普通的实数或许向量来表明动作。输出env.action_space.sample()的回来值,能看到输出为 1 或许 0。env.action_space.sample()的含义是,在该游戏的一切动作空间里随机挑选一个作为输出。在这个比方中,动作只需两个:0 和 1,一左一右。env.step()办法有4个回来值:observation、reward、done、info 。
observation 是状况信息,是在游戏中观测到的屏幕像素值或许盘面状况描绘信息。reward 是奖赏值,即动作提交今后能够取得的奖赏值。这个奖赏值因游戏的不同而不同,但整体原则是,对完结游戏有协助的动作会取得比较高的奖赏值。done 表明游戏是否现已完结,假如完结了,就需求重置游戏并开端一个新的回合。info 是一些比较原始的用于确诊和调试的信息,或许对练习有协助。不过,OpenAI 在评价咱们提交的机器人时,是不答应运用这些信息的。
在每个练习中都要运用的回来值有 observation、reward、done。但 observation 的结构会由于游戏的不同而发生改变。以 CartPole-v0 为例,咱们对代码进行修正:
import gym
env = gym.make('CartPole-v0')
env.reset()
for _ in range(100):
# env.render()
action = env.action_space.sample()
observation, reward, done, info = env.step(action)
print(observation)
env.close()
从输出能够看出这是一个四维的观测。在其他游戏中会有维度更多的状况呈现。
env.step()完结了一个完好的 S→A→R→S′S \to A \to R \to S’ 进程。咱们只需不断观测这样的进程,并让智能体在其间用相应的算法完结练习,就能得到一个高质量的强化学习模型。
咱们想要查看当时 Gym 库现已注册了哪些环境,能够运用以下代码:
from gym import envs
env_specs = envs.registry.all()
envs_ids = [env_spec.id for env_spec in env_specs]
print(envs_ids)
每个环境都界说了自己的观测空间和动作空间。环境 env 的观测空间用 env.observation_space 表明,动作空间用 env.action_space 表明。观测空间和动作空间既能够是离散空间(取值是有限个离散的值),也能够是接连空间(取值是接连的值)。在 Gym 库中,一般离散空间用 gym.spaces.Discrete 类表明,接连空间用 gym.spaces.Box 类表明。
例如,环境MountainCar-v0的观测空间是Box(2,),表明观测能够用 2 个 float 值表明;环境MountainCar-v0的动作空间是Discrete(3),表明动作取值自{0,1,2}。关于离散空间,Discrete 类实例的成员 n 表明有几个或许的取值;关于接连空间,Box类实例的成员 low 和 high 表明每个浮点数的取值规模。
1.7.2 MountainCar-v0 比方
接下来,咱们经过一个比方来学习怎样与 Gym 库进行交互。咱们选取小车上山(MountainCar-v0) 作为比方。
首要咱们来看看这个使命的观测空间和动作空间:
import gym
env = gym.make('MountainCar-v0')
print('观测空间 = {}'.format(env.observation_space))
print('动作空间 = {}'.format(env.action_space))
print('观测规模 = {} ~ {}'.format(env.observation_space.low,
env.observation_space.high))
print('动作数 = {}'.format(env.action_space.n))
观测空间 = Box(2,)
动作空间 = Discrete(3)
观测规模 = [-1.2 -0.07] ~ [0.6 0.07]
动作数 = 3
由输出可知,观测空间是形状为 (2,) 的浮点型 np.array,动作空间是取 {0,1,2} 的 int 型数值。
接下来考虑智能体。智能体往往是咱们自己完结的。咱们能够完结一个智能体类————BespokeAgent 类,代码如下:
class BespokeAgent:
def __init__(self, env):
pass
def decide(self, observation): # 决议计划
position, velocity = observation
lb = min(-0.09 * (position + 0.25) ** 2 + 0.03,
0.3 * (position + 0.9) ** 4 - 0.008)
ub = -0.07 * (position + 0.38) ** 2 + 0.07
if lb < velocity < ub:
action = 2
else:
action = 0
return action # 回来动作
def learn(self, *args): # 学习
pass
agent = BespokeAgent(env)
智能体的decide()办法完结了决议计划功用,而learn()办法完结了学习功用。BespokeAgent类是一个比较简略的类,它只能依据给定的数学表达式进行决议计划,不能有用学习,所以它并不是一个真正意义上的强化学习智能体类。可是,它用于演示智能体和环境的交互现已足够了。
接下来咱们试图让智能体与环境交互,代码如下。
def play_montecarlo(env, agent, render=False, train=False):
episode_reward = 0. # 记录回合总奖赏,初始化为0
observation = env.reset() # 重置游戏环境,开端新回合
while True: # 不断循环,直到回合完毕
if render: # 判别是否显现
env.render() # 显现图形界面,图形界面能够用 env.close() 句子封闭
action = agent.decide(observation)
next_observation, reward, done, _ = env.step(action) # 履行动作
episode_reward += reward # 收集回合奖赏
if train: # 判别是否练习智能体
agent.learn(observation, action, reward, done) # 学习
if done: # 回合完毕,跳出循环
break
observation = next_observation
return episode_reward # 回来回合总奖赏
上面代码中的 play_montecarlo()函数能够让智能体和环境交互一个回合,这个函数有 4 个参数。
env 是环境类。agent 是智能体类。render 是 bool 型变量,指示在运转进程中是否要图形化显现,假如函数参数 render为 True,那么在交互进程中会调用 env.render() 以显现图形界面,而这个界面能够经过调用 env.close()封闭。
train是 bool 型的变量,指示在运转进程中是否练习智能体,在练习进程中应当设置为 True,以调用 agent.learn()函数;在测验进程中应当设置为 False,使得智能体不变。
这个函数有一个回来值episode_reward,是 float 型的数值,表明智能体与环境交互一个回合的回合总奖赏。
接下来,咱们运用下面的代码让智能体和环境交互一个回合,并在交互进程中进行图形化显现,可用 env.close()句子封闭图形界面。
env.seed(0) # 设置随机数种子,仅仅为了让成果能够精确复现,一般状况下可删去
episode_reward = play_montecarlo(env, agent, render=True)
print('回合奖赏 = {}'.format(episode_reward))
env.close() # 此句子可封闭图形界面
输出:
回合奖赏 = -105.0
为了体系评价智能体的功能,下列代码求出了接连交互 100 回合的均匀回合奖赏。
episode_rewards = [play_montecarlo(env, agent) for _ in range(100)]
print('均匀回合奖赏 = {}'.format(np.mean(episode_rewards)))
输出:
均匀回合奖赏 = -102.61
小车上山环境有一个参考的回合奖赏值 -110,假如接连 100 个回合的均匀回合奖赏大于 -110,则以为这个使命被处理了。BespokeAgent 类对应的战略的均匀回合奖赏就在 -110 左右。
测验智能体在 Gym 库中某个使命的功能时,学术界一般最关怀 100 个回合的均匀回合奖赏。至于为什么是 100 个回合而不是其他回合数(比方 128 个回合),彻底是习惯使然,没有什么特别的原因。关于有些使命,还会指定一个参考的回合奖赏值,当接连 100 个回合的奖赏大于指定的值时,就以为这个使命被处理了。可是,并不是一切的使命都指定了这样的值。关于没有指定值的使命,就无所谓使命被处理了或许没有被处理。
咱们对 Gym 库的用法进行总结:运用 env=gym.make(环境名)取出环境,运用 env.reset()初始化环境,运用 env.step(动作)履行一步环境,运用 env.render()显现环境,运用 env.close()封闭环境。Gym库 有对应的官方文档,读者能够阅读文档来学习 Gym库 。