共计 31022 个字符,预计需要花费 78 分钟才能阅读完成。
强化学习从根底到进阶 - 案例与实际[1]:强化学习概述、序列决策、动作空间定义、策略价值函数、摸索与利用、Gym 强化学习试验
1.1 强化学习概述
强化学习(reinforcement learning,RL) 探讨的问题是智能体(agent)怎么在简单、不确定的环境(environment)中最大化它能取得的处分。如图 1.1 所示,强化学习由两局部组成:智能体和环境。在强化学习过程中,智能体与环境始终在交互。智能体在环境中获取某个状态后,它会利用该状态输入一个动作(action),这个动作也称为决策(decision)。而后这个动作会在环境中被执行,环境会依据智能体采取的动作,输入下一个状态以及以后这个动作带来的处分。智能体的目标就是尽可能多地从环境中获取处分。
<div align=center>
<img width=”550″ src=”https://ai-studio-static-online.cdn.bcebos.com/a65c51a6551741678eebe3e9ad33c572957836b591114c4ab3b78962b27f25b4″/>
</div>
<div align=center> 图 1.1 强化学习示意 </div>
1.1.1 强化学习与监督学习
咱们能够把强化学习与监督学习做一个比照。以图片分类为例,如图 1.2 所示,监督学习(supervised learning) 假如咱们有大量被标注的数据,比方汽车、飞机、椅子这些被标注的图片,这些图片都要满足独立同散布,即它们之间是没有关联关系的。假如咱们训练一个分类器,比方神经网络。为了分辨输出的 图片中是汽车还是飞机,在训练过程中,须要把正确的标签信息传递给神经网络。当神经网络做出谬误的预测时,比方输出汽车的图片,它预测进去是飞机,咱们就会间接通知它,该预测是谬误的,正确的标签应该是汽车。最初咱们依据相似谬误写出一个损失函数(loss function),通过反向流传(back propagation)来训练神经网络。
<div align=center>
<img width=”650″ src=”https://ai-studio-static-online.cdn.bcebos.com/cefd394cb8ae4fb5b8f1e99204c0ee7c0a63a8d2338f4b899886d6a82a457309″/>
</div>
<div align=center> 图 1.2 监督学习 </div>
所以在监督学习过程中,有两个假如:
- 输出的数据(标注的数据)都应是没有关联的。因为如果输出的数据有关联,学习器(learner)是不好学习的。
- 须要通知学习器正确的标签是什么,这样它能够通过正确的标签来修改本人的预测。
通常假如样本空间中整体样本遵从一个未知散布,咱们取得的每个样本都是独立地从这个散布上采样取得的,即独立同散布(independent and identically distributed,简称 i.i.d.)。
在强化学习中,监督学习的两个假如其实都不能失去满足。以雅达利(Atari)游戏 Breakout 为例,如图 1.3 所示,这是一个打砖块的游戏,管制木板左右移 动从而把球反弹到下面来打消砖块。在玩游戏的过程中,咱们能够发现智能体失去的观测(observation)不是独立同散布的,上一帧与下一帧间其实有十分强的 连续性。咱们失去的数据是相干的工夫序列数据,不满足独立同散布。另外,我 们并没有立即取得反馈,游戏没有通知咱们哪个动作是正确动作。比方当初把木板往右移,这只会使得球往上或者往左一点儿,咱们并不会失去即时的反馈。因 此,强化学习之所以艰难,是因为智能体不能失去即时的反馈,然而咱们仍然心愿智能体在这个环境中学习。
<div align=center>
<img width=”350″ src=”https://ai-studio-static-online.cdn.bcebos.com/7453f6746ab14c69998d29c7e18b510366d976a0a6c942fdbe285af3ee6819c4″/>
</div>
<div align=center> 图 1.3 雅达利游戏 Breakout</div>
如图 1.4 所示,强化学习的训练数据就是一个玩游戏的过程。咱们从第 1 步开始,采取一个动作,比方咱们把木板往右移,接到球。第 2 步咱们又做出动作,失去的训练数据是一个玩游戏的序列。比方当初是在第 3 步,咱们把这个序列放进网络,心愿网络能够输入一个动作,即在以后的状态应该输入往右移或 者往左移。这里有个问题,咱们没有标签来阐明当初这个动作是正确还是谬误的,必须等到游戏完结才可能晓得,这个游戏可能 10s 后才完结。当初这个动作到底对最初游戏是否能赢有无帮忙,咱们其实是不分明的。这里咱们就面临 提早处分(delayed reward) 的问题,提早处分使得训练网络十分艰难。
<div align=center>
<img width=”500″ src=”https://ai-studio-static-online.cdn.bcebos.com/3459c0420ce641ae963cb44d3ca5b54e4484294b94c84f3d893d84c9927d8b2d”/>
</div>
<div align=center> 图 1.4 强化学习:玩 Breakout</div>
强化学习和监督学习的区别如下。
(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 游戏。游戏中左边的选手把球拍到右边,而后右边的选手须要把球拍到左边。训练好的强化学习智能体和失常的选手有区别:强化学习的智能领会 始终做无意义的振动,而失常的选手不会做出这样的动作。
<div align=center>
<img width=”350″ src=”https://ai-studio-static-online.cdn.bcebos.com/a503ade5195c4bcda969fb755ed788203857d734a4cf43ca9e386083db3a8c5d”/>
</div>
<div align=center> 图 1.5 Pong 游戏 </div>
在 Pong 游戏外面,其实只有两个动作:往上或者往下。如图 1.6 所示,如果强化学习通过学习一个策略网络来进行分类,那么策略网络会输出以后帧的图片,输入所有决策的可能性,比方往上挪动的概率。
<div align=center>
<img width=”450″ src=”https://ai-studio-static-online.cdn.bcebos.com/97aca2777d8847d395e1d87fb54c14c4376958567fb4459992b5523188247678″/>
</div>
<div align=center> 图 1.6 强化学习玩 Pong</div>
如图 1.7 所示,对于监督学习,咱们能够间接通知智能体正确动作的标签是什么。但在 Pong 游戏中,咱们并不知道它的正确动作的标签是什么。
<div align=center> 基于策略的智能体(policy-based agent)
<img width=”500″ src=”https://ai-studio-static-online.cdn.bcebos.com/76de6614f56544228ad049de75fc102f433de8f754da4df2a9b2178b217eaa53″/>
</div>
<div align=center> 图 1.7 监督学习玩 Pong</div>
在强化学习外面,咱们让智能体尝试玩 Pong 游戏,对动作进行采样,直到游戏完结,而后对每个动作 进行惩办。图 1.8 所示为预演(rollout)的一个过程。预演是指咱们从以后帧对动作进行采样,生成很多 局游戏。咱们将以后的智能体与环境交互,会失去一系列观测。每一个观测可看成一个轨迹(trajectory)。轨迹就是以后帧以及它采取的策略,即状态和动作的序列:
$$
\tau=\left(s_{0}, a_{0}, s_{1}, a_{1}, \ldots\right)
$$
最初完结时,咱们会晓得到底有没有把这个球拍到对方区域,对方有没有接住,咱们是赢了还是输了。我 们能够通过观测序列以及最终处分(eventual reward)来训练智能体,使它尽可能地采取能够取得最终奖 励的动作。一场游戏称为一个 回合(episode) 或者 试验(trial)。
<div align=center>
<img width=”500″ src=”https://ai-studio-static-online.cdn.bcebos.com/b35afcf432014d58b9d190f2c7551d7be28ee003a6e54c46a4694d08ff6da783″/>
</div>
<div align=center> 图 1.8 可能的预演序列 </div>
1.1.3 强化学习的历史
强化学习是有肯定的历史的,晚期的强化学习,咱们称其为规范强化学习。最近业界把强化学习与深度学习联合起来,就造成了深度强化学习(deep reinforcemet learning),因而,深度强化学习 = 深度学习 + 强化学习。咱们可将规范强化学习和深度强化学习类比于传统的计算机视觉和深度计算机视觉。
如图 1.9a 所示,传统的计算机视觉由两个过程组成。
(1)给定一张图片,咱们先要提取它的特色,应用一些设计好的特色,比方方向梯度直方图(histogram of oriental gradient,HOG)、可变现的组件模型(deformable part model,DPM)。
(2)提取这些特色后,咱们再独自训练一个分类器。这个分类器能够是反对向量机(support vector machine,SVM)或 Boosting,而后就能够分别这张图片是狗还是猫。
<div align=center>
<img width=”500″ src=”https://ai-studio-static-online.cdn.bcebos.com/ef68670d4f5a4d6482af3cb3dbc60e47ae95a369cbc94a01a0613a8b2b1275b2″/>
</div>
<div align=center>(a)传统的计算机视觉 </div>
<div align=center>
<img width=”500″ src=”https://ai-studio-static-online.cdn.bcebos.com/47f2c7b88afd4cf689849a0ea629f49cae58049332904ab0acb5e31d4001da13″/>
</div>
<div align=center>(b)深度计算机视觉 </div>
<div align=center> 图 1.9 传统的计算机视觉与深度计算机视觉的区别 </div>
2012 年,Krizhevsky 等人提出了 AlexNet,AlexNet 在 ImageNet 分类较量中获得冠军,迅速引起了人们对于卷积神经网络的宽泛关注。
大家就把特征提取以及分类两者合到一块儿去了,就是训练一个神经网络。这个神经网络既能够做特征提取,也能够做分类,它能够实现端到端训练,如图 1.9b 所示,它的参数能够在每一个阶段都失去极大的优化,这是一个十分重要的冲破。
咱们能够把神经网络放到强化学习外面。
- 规范强化学习:比方 TD-Gammon 玩 Backgammon 游戏的过程,其实就是设计特色,而后训练价 值函数的过程,如图 1.10a 所示。规范强化学习先设计很多特色,这些特色能够形容当初整个状态。失去这些特色后,咱们就能够通过训练一个分类网络或者别离训练一个价值预计函数来采取动作。
- 深度强化学习:自从咱们有了深度学习,有了神经网络,就能够把智能体玩游戏的过程改良成一个 端到端训练(end-to-end training)的过程,如图 1.10b 所示。咱们不须要设计特色,间接输出状 态就能够输入动作。咱们能够用一个神经网络来拟合价值函数或策略网络,省去特色工程(feature engineering)的过程。
<div align=center>
<img width=”550″ src=”https://ai-studio-static-online.cdn.bcebos.com/8942d835f27f4d6598db72ee0d5dfd142b0c0548b55a40afba2a6e13b0984823″/>
</div>
<div align=center>(a)规范强化学习 </div>
<div align=center>
<img width=”550″ src=”https://ai-studio-static-online.cdn.bcebos.com/1978d45c6e68436da807fe9315801864c001a6888ffe4316b9b85384e112dd32″/>
</div>
<div align=center>(b)深度强化学习 </div>
<div align=center> 图 1.10 规范强化学习与深度强化学习的区别 </div>
1.1.4 强化学习的利用
为什么强化学习在这几年有很多的利用,比方玩游戏以及机器人的一些利用,并且能够击败人类的顶 尖棋手呢?这有如下几点起因。首先,咱们有了更多的算力(computation power),有了更多的 GPU,可 以更快地做更多的试错尝试。其次,通过不同尝试,智能体在环境外面取得了很多信息,而后能够在环境 外面获得很大的处分。最初,咱们通过端到端训练把特征提取和价值预计或者决策一起优化,这样就能够 失去一个更强的决策网络。
接下来介绍一些强化学习外面比拟有意思的例子,如图 1.11 所示。
(1)DeepMind 研发的走路的智能体。这个智能体往前走一步,就会失去一个处分。这个智能体有不 同的状态,能够学到很多有意思的性能。比方,像人一样的智能体学习怎么在波折的路线上往前走。后果 十分有意思,这个智能领会把手举得十分高,因为举手能够让它的身材保持平衡,它就能够更快地在环境 外面往前走。而且咱们也能够减少环境的难度,退出一些扰动,智能体就会变得更鲁棒。
(2)机械臂抓取。因为咱们把强化学习利用到机械臂主动抓取须要大量的预演,所以咱们能够应用多 个机械臂进行训练。分布式系统能够让机械臂尝试抓取不同的物体,盘子外面物体的形态是不同的,这样 就能够让机械臂学到一个对立的动作,而后针对不同的抓取物都能够应用最优的抓取算法。因为抓取的物 体形态的差异很大,所以应用一些传统的抓取算法不能把所有物体都抓起来。传统的抓取算法对每一个物 体都须要建模,这样是十分费时的。但通过强化学习,咱们能够学到一个对立的抓取算法,其实用于不同 的物体。
(3)OpenAI 的机械臂翻魔方。OpenAI 在 2018 年的时候设计了一款带有“手指”的机械臂,它能够 通过翻动手指使得手中的木块达到预期的设定。人的手指其实非常灵活,怎么使得机械臂的手指也具备这 样灵便的能力始终是个问题。OpenAI 先在一个虚拟环境外面应用强化学习对智能体进行训练,再把它应 用到实在的机械臂上。这在强化学习外面是一种比拟罕用的做法,即咱们先在虚拟环境外面失去一个很好 的智能体,而后把它利用到实在的机器人中。这是因为实在的机械臂通常非常容易坏,而且十分贵,个别 状况下没方法大批量地购买。OpenAI 在 2019 年对其机械臂进行了进一步的改良,这个机械臂在改良后 能够玩魔方了。
(4)穿衣服的智能体。很多时候咱们要在电影或者一些动画中实现人穿衣服的场景,通过手写执行命 令让机器人穿衣服十分艰难,穿衣服也是一种十分精密的操作。咱们能够训练强化学习智能体来实现穿衣 服性能。咱们还能够在外面退出一些扰动,智能体能够抵制扰动。可能会有失败的状况(failure case)出 现,这样智能体就穿不进去衣服。
<div align=center>
<img width=”550″ src=”https://ai-studio-static-online.cdn.bcebos.com/acaeedfec6db461b9460efccbeb61489c9281979e8c54ce4b2aa74db84e92c68″/>
</div>
<div align=center> 图 1.11 强化学习例子 </div>
1.2 序列决策
1.2.1 智能体与环境
接下来咱们介绍 序列决策(sequential decision making) 过程。强化学习钻研的问题是智能体与环 境交互的问题,图 1.12 右边的智能体始终在与图 1.12 左边的环境进行交互。智能体把它的动作输入给环境,环境获得这个动作后会进行下一步,把下一步的观测与这个动作带来的处分返还给智能体。这样的交 互会产生很多观测,智能体的目标是从这些观测之中学到能最大化处分的策略。
<div align=center>
<img width=”550″ src=”https://ai-studio-static-online.cdn.bcebos.com/11c10bff7611437aa6255a1387cc82afd4db16058e51490c89d3181af5c876da”/>
</div>
<div align=center> 图 1.12 智能体和环境 </div>
1.2.2 处分
处分是由环境给的一种标量的反馈信号(scalar feedback signal),这种信号可显示智能体在某一步采 取某个策略的体现如何。强化学习的目标就是最大化智能体能够取得的处分,智能体在环境外面存在的目 的就是最大化它的冀望的累积处分(expected cumulative reward)。不同的环境中,处分也是不同的。这 里给大家举一些处分的例子。
(1)比方一个象棋选手,他的目标是赢棋,在最初棋局完结的时候,他就会失去一个正处分(赢)或 者负处分(输)。
(2)在股票治理外面,处分由股票获取的处分与损失决定。
(3)在玩雅达利游戏的时候,处分就是减少或缩小的游戏的分数,处分自身的稠密水平决定了游戏的难度。
1.2.3 序列决策
在一个强化学习环境外面,智能体的目标就是选取一系列的动作来最大化处分,所以这些选取的动作 必须有长期的影响。但在这个过程外面,智能体的处分其实是被提早了的,就是咱们当初选取的某一步动作,可能要等到很久后才晓得这一步到底产生了什么样的影响。如图 1.13 所示,在玩雅达利的 Pong 游戏 时,咱们可能只有到最初游戏完结时,才晓得球到底有没有被击打过来。过程中咱们采取的回升(up)或 降落(down)动作,并不会间接产生处分。强化学习外面一个重要的课题就是近期处分和远期处分的衡量(trade-off),钻研怎么让智能体获得更多的远期处分。
在与环境的交互过程中,智能领会取得很多观测。针对每一个观测,智能领会采取一个动作,也会失去一个处分。所以历史是观测、动作、处分的序列:
$$
H_{t}=o_{1}, a_{1}, r_{1}, \ldots, o_{t}, a_{t}, r_{t}
$$
智能体在采取以后动作的时候会依赖于它之前失去的历史,所以咱们能够把整个游戏的状态看成对于这个历史的函数:
$$
S_{t}=f\left(H_{t}\right)
$$
<div align=center>
<img width=”550″ src=”https://ai-studio-static-online.cdn.bcebos.com/269c542dad614f14a25174948fc3070ed9b283cbf3cf46608b4b4016343ed4a7″/>
</div>
<div align=center> 图 1.13 玩 Pong 游戏 </div>
Q:状态和观测有什么关系?
A:状态 是对世界的残缺形容,不会暗藏世界的信息。观测 是对状态的局部形容,可能会脱漏一些信息。在深度强化学习中,咱们简直总是用实值的向量、矩阵或者更高阶的张量来示意状态和观测。例如,咱们能够用 RGB 像素值的矩阵来示意一个视觉的观测,能够用机器人关节的角度和速度来示意一个机器 人的状态。
环境有本人的函数 $s_{t}^{e}=f^{e}\left(H_{t}\right)$ 来更新状态,在智能体的外部也有一个函数 $s_{t}^{a}=f^{a}\left(H_{t}\right)$ 来更新状 态。当智能体的状态与环境的状态等价的时候,即当智能体可能察看到环境的所有状态时,咱们称这个环 境是齐全可观测的(fully observed)。在这种状况上面,强化学习通常被建模成一个马尔可夫决策过程(Markov decision process,MDP)的问题。在马尔可夫决策过程中,$o_{t}=s_{t}^{e}=s_{t}^{a}$。
然而有一种状况是智能体失去的观测并不能蕴含环境运作的所有状态,因为在强化学习的设定外面,环境的状态才是真正的所有状态。比方智能体在玩 black jack 游戏,它能看到的其实是牌面上的牌。或者在 玩雅达利游戏的时候,观测到的只是以后电视下面这一帧的信息,咱们并没有失去游戏外部外面所有的运 作状态。也就是当智能体只能看到局部的观测,咱们就称这个环境是局部可观测的(partially observed)。在这种状况下,强化学习通常被建模成局部可观测马尔可夫决策过程(partially observable Markov decision process, POMDP)的问题。局部可观测马尔可夫决策过程是马尔可夫决策过程的一种泛化。局部可观测马尔可夫决策过程仍然具备马尔可夫性质,然而假如智能体无奈感知环境的状态,只能晓得 局部观测值。比方在主动驾驶中,智能体只能感知传感器采集的无限的环境信息。局部可观测马尔可夫决策过程能够用一个七元组形容:$(S,A,T,R,\Omega,O,\gamma)$。其中 $S$ 示意状态空间,为隐变量,$A$ 为动作空间,$T(s’|s,a)$ 为状态转移概率,$R$ 为处分函数,$\Omega(o|s,a)$ 为观测概率,$O$ 为观测空间,$\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$ 函数,即 $\pi(a | s)=p\left(a_{t}=a | s_{t}=s\right)$。输出一个状态 $s$,输入一个概率。
这个概率是智能体所有动作的概率,而后对这个概率分布进行采样,可失去智能体将采取的动作。比方可能是有 0.7 的概率往左,0.3 的概率往右,那么通过采样就能够失去智能体将采取的动作。
确定性策略(deterministic policy) 就是智能体间接采取最有可能的动作,即 $a^{*}=\underset{a}{\arg \max} \pi(a \mid s)$。
如图 1.14 所示,从雅达利游戏来看,策略函数的输出就是游戏的一帧,它的输入决定智能体向左挪动或者向右挪动。
<div align=center>
<img width=”550″ src=”https://ai-studio-static-online.cdn.bcebos.com/dcacea17f42e4af48786ddad0b2fd5ce5ecdae39bfb94b1d84f56e89f2c652cd”/>
</div>
<div align=center> 图 1.14 策略函数 </div>
通常状况下,强化学习个别应用随机性策略,随机性策略有很多长处。比方,在学习时能够通过引入肯定的随机性来更好地摸索环境;
随机性策略的动作具备多样性,这一点在多个智能体博弈时十分重要。采纳确定性策略的智能体总是对同样的状态采取雷同的动作,这会导致它的策略很容易被对手预测。
1.4.2 价值函数
价值函数的值是对将来处分的预测,咱们用它来评估状态的好坏。
价值函数外面有一个 折扣因子(discount factor),咱们心愿在尽可能短的工夫外面失去尽可能多的处分。比方当初给咱们两个抉择:10 天后给咱们 100 块钱或者当初给咱们 100 块钱。咱们必定更心愿当初就给咱们 100 块钱,因为咱们能够把这 100 块钱存在银行外面,这样就会有一些利息。因而,咱们能够把折扣因子放到价值函数的定义外面,价值函数的定义为
$$
V_{\pi}(s) \doteq \mathbb{E}_{\pi}\left[G_{t} \mid s_{t}=s\right]=\mathbb{E}_{\pi}\left[\sum_{k=0}^{\infty} \gamma^{k} r_{t+k+1} \mid s_{t}=s\right], \text{对于所有的} s \in S
$$
冀望 $\mathbb{E}_{\pi}$ 的下标是 $\pi$ 函数,$\pi$ 函数的值可反映在咱们应用策略 $\pi$ 的时候,到底能够失去多少处分。
咱们还有一种价值函数:Q 函数。Q 函数外面蕴含两个变量:状态和动作。其定义为
$$
Q_{\pi}(s, a) \doteq \mathbb{E}_{\pi}\left[G_{t} \mid s_{t}=s, a_{t}=a\right]=\mathbb{E}_{\pi}\left[\sum_{k=0}^{\infty} \gamma^{k} r_{t+k+1} \mid s_{t}=s, a_{t}=a\right]
$$
所以咱们将来能够取得处分的冀望取决于以后的状态和以后的动作。Q 函数是强化学习算法外面要学习的一个函数。因为当咱们失去 Q 函数后,进入某个状态要采取的最优动作能够通过 Q 函数失去。
1.4.3 模型
第 3 个组成部分是模型,模型决定了下一步的状态。下一步的状态取决于以后的状态以及以后采取的动作。它由状态转移概率和处分函数两个局部组成。状态转移概率即
$$
p_{s s^{\prime}}^{a}=p\left(s_{t+1}=s^{\prime} \mid s_{t}=s, a_{t}=a\right)
$$
处分函数是指咱们在以后状态采取了某个动作,能够失去多大的处分,即
$$
R(s,a)=\mathbb{E}\left[r_{t+1} \mid s_{t}=s, a_{t}=a\right]
$$
当咱们有了策略、价值函数和模型 3 个组成部分后,就造成了一个 马尔可夫决策过程(Markov decision process)。如图 1.15 所示,这个决策过程可视化了状态之间的转移以及采取的动作。
<div align=center>
<img width=”550″ src=”https://ai-studio-static-online.cdn.bcebos.com/d3fdeedcc36f47dda8b20690e679329fa800110926474c3dbe8416b1c7cf38e4″/>
</div>
<div align=center> 图 1.15 马尔可夫决策过程 </div>
咱们来看一个走迷宫的例子。如图 1.16 所示,要求智能体从终点(start)开始,而后达到起点(goal)的地位。每走一步,咱们就会失去 -1 的处分。咱们能够采取的动作是往上、下、左、右走。咱们用当初智能体所在的地位来形容以后状态。
<div align=center>
<img width=”550″ src=”https://ai-studio-static-online.cdn.bcebos.com/dcc3fc0b0fcd401db01d7c877bbd6f949a3ea241ea014f28b4b0b971c2a66705″/>
</div>
<div align=center> 图 1.16 走迷宫的例子 </div>
咱们能够用不同的强化学习办法来解这个环境。
如果咱们采取基于策略的强化学习(policy-based RL)办法,当学习好了这个环境后,在每一个状态,咱们都会失去一个最佳的动作。如图 1.17 所示,比方咱们当初在终点地位,咱们晓得最佳动作是往右走;在第二格的时候,失去的最佳动作是往上走;第三格是往右走 …… 通过最佳的策略,咱们能够最快地达到起点。
<div align=center>
<img width=”550″ src=”https://ai-studio-static-online.cdn.bcebos.com/9cf6d3bfd9154dfda42de3496dc9df88156976ffcbb646d28406a63d7c18cd48″/>
</div>
<div align=center> 图 1.17 应用基于策略的强化学习办法失去的后果 </div>
如果换成基于价值的强化学习(value-based RL)办法,利用价值函数作为导向,咱们就会失去另外一种表征,每一个状态会返回一个价值。如图 1.18 所示,比方咱们在终点地位的时候,价值是 -16,因为咱们最快能够 16 步达到起点。因为每走一步会减 1,所以这里的价值是 -16。
当咱们快靠近起点的时候,这个数字变得越来越大。在拐角的时候,比方当初在第二格,价值是 -15,智能领会看上、下两格,它看到下面格子的价值变大了,变成 -14 了,上面格子的价值是 -16,那么智能体就会采取一个往上走的动作。所以通过学习的价值的不同,咱们能够抽取呈现在最佳的策略。
<div align=center>
<img width=”550″ src=”https://ai-studio-static-online.cdn.bcebos.com/cbd05c38521643d39645d7d8bfa0d5f3ae3d519c0df64b12a9d90e5d4da62bc8″/>
</div>
<div align=center> 图 1.18 应用基于价值的强化学习办法失去的后果 </div>
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>$,即状态汇合、动作汇合、状态转移函数和处分函数。如果这个四元组中所有元素均已知,且状态汇合和动作汇合在无限步数内是无限集,则智能体能够对实在环境进行建模,构建一个虚拟世界来模仿实在环境中的状态和交互反馈。
具体来说,当智能体晓得状态转移函数 $P(s_{t+1}|s_t,a_t)$ 和处分函数 $R(s_t,a_t)$ 后,它就能晓得在某一状态下执行某一动作后能带来的处分和环境的下一状态,这样智能体就不须要在实在环境中采取动作,间接在虚拟世界中学习和布局策略即可。这种学习办法称为 有模型强化学习 。
有模型强化学习的流程如图 1.19 所示。
<div align=center>
<img width=”550″ src=”https://ai-studio-static-online.cdn.bcebos.com/aa7baa7866cc446f9b8c3b72321ddbce52e118f074c6436c9baf5b08547edffc”/>
</div>
<div align=center> 图 1.19 有模型强化学习流程 </div>
然而在理论利用中,智能体并不是那么容易就能通晓马尔可夫决策过程中的所有元素的。通常状况下,状态转移函数和处分函数很难预计,甚至连环境中的状态都可能是未知的,这时就须要采纳免模型强化学习。免模型强化学习没有对实在环境进行建模,智能体只能在实在环境中通过肯定的策略来执行动作,期待处分和状态迁徙,而后依据这些反馈信息来更新动作策略,这样重复迭代直到学习到最优策略。
Q:有模型强化学习和免模型强化学习有什么区别?
A:针对是否须要对实在环境建模,强化学习能够分为有模型强化学习和免模型强化学习。有模型强化学习是指依据环境中的教训,构建一个虚拟世界,同时在实在环境和虚拟世界中学习;免模型强化学习是指不对环境进行建模,间接与实在环境进行交互来学习到最优策略。
总之,有模型强化学习相比免模型强化学习仅仅多出一个步骤,即对实在环境进行建模。因而,一些有模型的强化学习办法,也能够在免模型的强化学习办法中应用。在理论利用中,如果不分明该用有模型强化学习还是免模型强化学习,能够先思考在智能体执行动作前,是否能对下一步的状态和处分进行预测,如果能,就可能对环境进行建模,从而采纳有模型学习。
免模型强化学习通常属于数据驱动型办法,须要大量的采样来预计状态、动作及处分函数,从而优化动作策略。例如,在雅达利平台上的《太空侵略者》游戏中,免模型的深度强化学习须要大概两亿帧游戏画面能力学到比拟现实的成果。相比之下,有模型的深度强化学习能够在肯定水平上缓解训练数据匮乏的问题,因为智能体能够在虚拟世界中进行训练。
免模型学习的泛化性要优于有模型强化学习,起因是有模型强化学习算须要对实在环境进行建模,并且虚拟世界与实在环境之间可能还有差别,这限度了有模型强化学习算法的泛化性。
有模型的强化学习办法能够对环境建模,使得该类办法具备独特魅力,即“设想能力”。在免模型强化学习中,智能体只能一步一步地采取策略,期待实在环境的反馈;有模型强化学习能够在虚拟世界中预测出将要产生的事,并采取对本人最无利的策略。
目前,大部分深度强化学习办法都采纳了免模型强化学习,这是因为:免模型强化学习更为简略、直观且有丰盛的开源材料,如 AlphaGo 系列都采纳免模型强化学习;在目前的强化学习钻研中,大部分状况下环境都是动态的、可形容的,智能体的状态是离散的、可察看的(如雅达利游戏平台),这种绝对简略、确定的问题并不需要评估状态转移函数和处分函数,可间接采纳免模型强化学习,应用大量的样本进行训练就能取得较好的成果。
如图 1.20 所示,咱们能够把几类模型放到同一个图外面。图 1.20 有 3 个组成成分:价值函数、策略和模型。按一个智能体具备三者中的三者、两者或一者的状况能够把它分成很多类。
<div align=center>
<img width=”550″ src=”https://ai-studio-static-online.cdn.bcebos.com/f38742bca5f14508b900de305a8ad0931a57a777724b4881a51eb1ec7ee44273″/>
</div>
<div align=center> 图 1.20 强化学习智能体的类型 </div>
1.5 学习与布局
学习(learning)和布局(planning)是序列决策的两个根本问题。
如图 1.21 所示,在强化学习中,环境初始时是未知的,智能体不晓得环境如何工作,它通过一直地与环境交互,逐步改良策略。
<div align=center>
<img width=”550″ src=”https://ai-studio-static-online.cdn.bcebos.com/da9b71d02df14ff2895bfc5908a3e45f257ae342cfe04c59844ecd4cf147263c”/>
</div>
<div align=center> 图 1.21 学习 </div>
如图 1.22 所示,在布局中,环境是已知的,智能体被告知了整个环境的运作规定的详细信息。智能体可能计算出一个完满的模型,并且在不须要与环境进行任何交互的时候进行计算。智能体不须要实时地与环境交互就能晓得将来环境,只须要晓得以后的状态,就可能开始思考,来寻找最优解。
在图 1.22 所示的游戏中,规定是确定的,咱们晓得抉择左之后环境将会产生什么变动。咱们齐全能够通过已知的规定,来在外部模仿整个决策过程,无需与环境交互。
一个罕用的强化学习问题解决思路是,先学习环境如何工作,也就是理解环境工作的形式,即学习失去一个模型,而后利用这个模型进行布局。
<div align=center>
<img width=”550″ src=”https://ai-studio-static-online.cdn.bcebos.com/b50ff38231ca4a6a9e44d277d08ba844d90d2d222b9e4240bb823761cf63e8c9″/>
</div>
<div align=center> 图 1.22 布局 </div>
1.6 摸索和利用
在强化学习外面,摸索和利用是两个很外围的问题。
摸索即咱们去摸索环境,通过尝试不同的动作来失去最佳的策略(带来最大处分的策略)。
利用即咱们不去尝试新的动作,而是采取已知的能够带来很大处分的动作。
在刚开始的时候,强化学习智能体不晓得它采取了某个动作后会产生什么,所以它只能通过试错去摸索,所以摸索就是通过试错来了解采取的动作到底可不可以带来好的处分。利用是指咱们间接采取已知的能够带来很好处分的动作。所以这里就面临一个衡量问题,即怎么通过就义一些短期的处分来了解动作,从而学习到更好的策略。
上面举一些摸索和利用的例子。
以抉择餐馆为例,利用是指咱们间接去咱们最喜爱的餐馆,因为咱们去过这个餐馆很屡次了,所以咱们晓得这外面的菜都十分可口。
摸索是指咱们用手机搜寻一个新的餐馆,而后去尝试它的菜到底好不好吃。咱们有可能对这个新的餐馆感到十分不称心,这样钱就节约了。
以做广告为例,利用是指咱们间接采取最优的广告策略。摸索是指咱们换一种广告策略,看看这个新的广告策略可不可以失去更好的成果。
以挖油为例,利用是指咱们间接在已知的中央挖油,这样能够确保挖到油。
摸索是指咱们在一个新的中央挖油,这样就有很大的概率可能不能发现油田,但也可能有比拟小的概率能够发现一个十分大的油田。
以玩游戏为例,利用是指咱们总是采取某一种策略。比方,咱们玩《街头霸王》游戏的时候,采取的策略可能是蹲在角落,而后始终出脚。这个策略很可能能够见效,但可能遇到特定的对手就会生效。
摸索是指咱们可能尝试一些新的招式,有可能咱们会放出“大招”来,这样就可能“一招毙命”。
与监督学习工作不同,强化学习工作的最终处分在多步动作之后能力察看到,这里咱们无妨先思考比较简单的情景:最大化单步处分,即仅思考一步动作。需注意的是,即使在这样的简略情景下,强化学习仍与监督学习有显著不同,因为智能体需通过试错来发现各个动作产生的后果,而没有训练数据通知智能体该当采取哪个动作。
想要最大化单步处分需思考两个方面:一是需晓得每个动作带来的处分,二是要执行处分最大的动作。若每个动作对应的处分是一个确定值,那么尝试遍所有的动作便能找出处分最大的动作。然而,更个别的情景是,一个动作的处分值是来自一个概率分布,仅通过一次尝试并不能确切地取得均匀处分值。
实际上,单步强化学习工作对应于一个实践模型,即 $K$- 臂赌博机(K-armed bandit)。$K$- 臂赌博机也被称为 多臂赌博机(multi-armed bandit)。如图 1.23 所示,$K$- 臂赌博机有 $K$ 个摇臂,赌徒在投入一个硬币后可抉择按下其中一个摇臂,每个摇臂以肯定的概率吐出硬币,但这个概率赌徒并不知道。赌徒的指标是通过肯定的策略最大化本人的处分,即取得最多的硬币。
若仅为获知每个摇臂的冀望处分,则可采纳 仅摸索(exploration-only)法 :将所有的尝试机会平均分配给每个摇臂(即轮流按下每个摇臂),最初以每个摇臂各自的均匀吐币概率作为其处分冀望的近似预计。若仅为执行处分最大的动作,则可采纳 仅利用(exploitation-only)法:按下目前最优的(即到目前为止均匀处分最大的)摇臂,若有多个摇臂同为最优,则从中随机选取一个。
显然,仅摸索法能很好地预计每个摇臂的处分,却会失去很多抉择最优摇臂的机会;仅利用法令相同,它没有很好地预计摇臂冀望处分,很可能常常选不到最优摇臂。因而,这两种办法都难以使最终的累积处分最大化。
事实上,摸索(预计摇臂的优劣)和利用(抉择以后最优摇臂)这两者是矛盾的,因为尝试次数(总投币数)无限,增强了一方则天然会减弱另一方,这就是强化学习所面临的 摸索 - 利用困境(exploration-exploitation dilemma)。显然,想要累积处分最大,则必须在摸索与利用之间达成较好的折中。
<div align=center>
<img width=”550″ src=”https://ai-studio-static-online.cdn.bcebos.com/1b50a404fc294191baccd65dcf2654161f549aabbe6f4f7b8b101c53a3915385″/>
</div>
<div align=center> 图 1.23 K- 臂赌博机图示 </div>
1.7 强化学习试验
强化学习是一个实践与实际相结合的机器学习分支,咱们不仅要了解它算法背地的一些数学原理,还要通过上机实际实现算法。在很多试验环境外面去摸索算法能不能失去预期成果也是一个十分重要的过程。
咱们能够应用 Python 和深度学习的一些包来实现强化学习算法。当初有很多深度学习的包能够应用,比方 PyTorch、飞桨、TensorFlow,纯熟应用其中的两三种,就能够实现十分多的性能。所以咱们并不需要从头去“造轮子”。
1.7.1 Gym
OpenAI 是一家非营利性的人工智能钻研公司,其颁布了十分多的学习资源以及算法资源。其之所以叫作 OpenAI,他们把所有开发的算法都进行了开源。
如图 1.24 所示,OpenAI 的 Gym 库 是一个环境仿真库,外面蕴含很多现有的环境。针对不同的场景,咱们能够抉择不同的环境。离散管制场景(输入的动作是可数的,比方 Pong 游戏中输入的向上或向下动作)个别应用雅达利环境评估;间断管制场景(输入的动作是不可数的,比方机器人走路时不仅有方向,还有角度,角度就是不可数的,是一个间断的量)个别应用 MuJoCo 环境评估。Gym Retro是对 Gym 环境的进一步扩大,蕴含更多的游戏。
<div align=center>
<img width=”550″ src=”https://ai-studio-static-online.cdn.bcebos.com/99be11c2a02e4fc59e79e6c126d277ce2eb7359450464775bf0cb178eff79fb7″/>
</div>
<div align=center> 图 1.24 OpenAI 的 Gym 库 </div>
咱们能够通过 pip 来装置 Gym 库,因为 Gym 库 0.26.0 及其之后的版本对之前的代码不兼容,所以咱们装置 0.26.0 之前的 Gym,比方 0.25.2。
pip install gym==0.25.2
在 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 须要通过前后挪动车,让它达到旗号的地位。在刚开始测试强化学习的时候,咱们能够抉择这些简略环境,因为强化学习在这些环境中能够在一两分钟之内见到成果。
<div align=center>
<img width=”550″ src=”https://ai-studio-static-online.cdn.bcebos.com/66f623874034489b983854989ae32227ba599f3c8bbe42eda8cfdb372292a8c0″/>
</div>
<div align=center> 图 1.25 经典管制问题 </div>
大家能够点这个链接看一看这些环境。在刚开始测试强化学习的时候,能够抉择这些简略环境,因为这些环境能够在一两分钟之内见到一个成果。
如图 1.26 所示,CartPole-v0 环境有两个动作:将小车向左挪动和将小车向右挪动。咱们还能够失去观测:小车以后的地位,小车当返回左、往右移的速度,杆的角度以及杆的最高点(顶端)的速度。
观测越具体,咱们就能够更好地形容以后所有的状态。这里有处分的定义,如果能多走一步,咱们就会失去一个处分(处分值为 1),所以咱们须要存活尽可能多的工夫来失去更多的处分。当杆的角度大于某一个角度(没能保持平衡),或者小车的核心达到图形界面窗口的边缘,或者累积步数大于 200,游戏就完结了,咱们就输了。所以智能体的目标是控制杆,让它尽可能地保持平衡以及尽可能放弃在环境的地方。
<div align=center>
<img width=”550″ src=”https://ai-studio-static-online.cdn.bcebos.com/ad0c6b8721694dc096453a95414e9f57e03bf8684e9c4381bbff3f17fdada4d6″/>
</div>
<div align=center> 图 1.26 CartPole-v0 的例子 </div>
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()
[0.00647475 0.15036764 0.03227502 -0.27053114]
[0.0094821 0.34501451 0.0268644 -0.55286219]
[0.01638239 0.53974911 0.01580716 -0.83696149]
[0.02717738 0.34441487 -0.00093207 -0.53934963]
[0.03406567 0.14930603 -0.01171907 -0.24696053]
[0.03705179 0.34459338 -0.01665828 -0.54331676]
[0.04394366 0.14970944 -0.02752461 -0.25592873]
[0.04693785 0.34521335 -0.03264319 -0.55716472]
[0.05384212 0.54077799 -0.04378648 -0.8599508]
[0.06465768 0.34627888 -0.0609855 -0.58135089]
[0.07158325 0.54219994 -0.07261251 -0.89260476]
[0.08242725 0.34813405 -0.09046461 -0.62360233]
[0.08938993 0.15438386 -0.10293666 -0.36072578]
[0.09247761 0.35080687 -0.11015117 -0.68401066]
[0.09949375 0.15737276 -0.12383138 -0.42793696]
[0.1026412 -0.0357978 -0.13239012 -0.17671333]
[0.10192525 -0.22880114 -0.13592439 0.07144919]
[0.09734923 -0.03201882 -0.13449541 -0.2608406]
[0.09670885 0.16474106 -0.13971222 -0.59273758]
[0.10000367 0.36151376 -0.15156697 -0.92596253]
[0.10723395 0.16872765 -0.17008622 -0.68448887]
[0.1106085 -0.0236758 -0.183776 -0.44981282]
[0.11013498 0.17350493 -0.19277225 -0.79432985]
[0.11360508 -0.01852259 -0.20865885 -0.56794866]
[0.11323463 -0.21020153 -0.22001783 -0.34756815]
[0.1090306 -0.40162751 -0.22696919 -0.13151571]
[0.10099805 -0.59290014 -0.2295995 0.08187736]
[0.08914005 -0.3953501 -0.22796196 -0.27358217]
[0.08123304 -0.19782559 -0.2334336 -0.62864554]
[7.72765316e-02 -3.38560552e-04 -2.46006509e-01 -9.84849579e-01]
[0.07726976 0.19708367 -0.2657035 -1.34366574]
[0.08121143 0.39438141 -0.29257682 -1.70642792]
[0.08909906 0.5914451 -0.32670537 -2.0742574]
[0.10092796 0.40077203 -0.36819052 -1.89772811]
[0.1089434 0.21100027 -0.40614508 -1.73796696]
[0.11316341 0.40791412 -0.44090442 -2.12546036]
[0.12132169 0.21896424 -0.48341363 -1.9946073]
[0.12570098 0.03091305 -0.52330578 -1.88150521]
[0.12631924 0.22693482 -0.56093588 -2.28311342]
[0.13085793 0.03945005 -0.60659815 -2.20138398]
[0.13164694 -0.14721134 -0.65062583 -2.138947]
[0.12870271 0.04690821 -0.69340477 -2.54871105]
[0.12964087 0.23927885 -0.74437899 -2.95854488]
[0.13442645 0.42937689 -0.80354989 -3.36746251]
[0.14301399 0.61660291 -0.87089914 -3.77403705]
[0.15534605 0.42607469 -0.94637988 -3.81483012]
[0.16386754 0.23541852 -1.02267648 -3.88616038]
[0.16857591 0.04428728 -1.10039969 -3.98769809]
[0.16946166 -0.14770698 -1.18015365 -4.11923715]
[0.16650752 -0.34099419 -1.26253839 -4.28068786]
[0.15968763 -0.53604639 -1.34815215 -4.47206175]
[0.1489667 -0.36852578 -1.43759339 -4.81429011]
[0.14159619 -0.56971052 -1.53387919 -5.0656069]
[0.13020198 -0.41069639 -1.63519133 -5.3682101]
[0.12198805 -0.25583625 -1.74255553 -5.64665276]
[0.11687133 -0.46888879 -1.85548858 -5.99094784]
[0.10749355 -0.68679647 -1.97530754 -6.3649168]
[0.09375762 -0.54214256 -2.10260588 -6.54979245]
[0.08291477 -0.76736372 -2.23360173 -6.97450075]
[0.06756749 -0.62316332 -2.37309174 -7.07315547]
[0.05510423 -0.85131232 -2.51455485 -7.52354535]
[0.03807798 -1.07989235 -2.66502576 -7.97369502]
[0.01648014 -0.92150963 -2.82449966 -7.89745964]
[-1.95005722e-03 -7.50823692e-01 -2.98244885e+00 -7.74586574e+00]
[-0.01696653 -0.95708685 -3.13736616 -8.09794179]
[-0.03610827 -0.76229617 -3.299325 -7.80700096]
[-0.05135419 -0.94552219 -3.45546502 -8.0322469]
[-0.07026464 -1.11581148 -3.61610996 -8.18443086]
[-0.09258086 -1.27284635 -3.77979857 -8.2596265]
[-0.11803779 -1.03732662 -3.9449911 -7.80073228]
[-0.13878432 -0.80125832 -4.10100575 -7.34329383]
[-0.15480949 -0.93976501 -4.24787163 -7.22180492]
[-0.17360479 -0.70702042 -4.39230773 -6.80255643]
[-0.1877452 -0.84585317 -4.52835885 -6.589013]
[-0.20466226 -0.62231865 -4.66013911 -6.23861951]
[-0.21710864 -0.76813309 -4.7849115 -5.95644372]
[-0.2324713 -0.55503534 -4.90404038 -5.68637779]
[-0.243572 -0.34634264 -5.01776793 -5.45738841]
[-0.25049886 -0.14126967 -5.1269157 -5.26947509]
[-0.25332425 -0.30673924 -5.2323052 -4.90040883]
[-0.25945904 -0.47825952 -5.33031338 -4.51743893]
[-0.26902423 -0.65531866 -5.42066216 -4.12393723]
[-0.2821306 -0.83724627 -5.5031409 -3.72312603]
[-0.29887552 -0.64668062 -5.57760342 -3.71955722]
[-0.31180914 -0.8343545 -5.65199457 -3.31460931]
[-0.32849623 -1.02512292 -5.71828676 -2.91009972]
[-0.34899868 -0.83602784 -5.77648875 -2.99228939]
[-0.36571924 -1.02965917 -5.83633454 -2.59566065]
[-0.38631242 -0.83987869 -5.88824775 -2.7253347]
[-0.40311 -0.649128 -5.94275444 -2.87631827]
[-0.41609256 -0.45738886 -6.00028081 -3.04925675]
[-0.42524034 -0.6527092 -6.06126594 -2.68585371]
[-0.43829452 -0.84866666 -6.11498302 -2.33441569]
[-0.45526785 -1.04486325 -6.16167133 -1.99505548]
[-0.47616512 -0.85120439 -6.20157244 -2.24776454]
[-0.49318921 -1.04699454 -6.24652773 -1.93108927]
[-0.5141291 -1.2424892 -6.28514952 -1.62726938]
[-0.53897888 -1.04734421 -6.31769491 -1.92056378]
[-0.55992576 -1.24207883 -6.35610618 -1.63877957]
[-0.58476734 -1.43627416 -6.38888177 -1.36968044]
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/gym/logger.py:30: UserWarning: [33mWARN: You are calling 'step()' even though this environment has already returned done = True. You should always call 'reset()' once you receive 'done = True' -- any further steps are undefined behavior.[0m
warnings.warn(colorize('%s: %s'%('WARN', msg % args), 'yellow'))
从输入能够看出这是一个四维的观测。在其余游戏中会有维度更多的状况呈现。
env.step()实现了一个残缺的 $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 库。
参考文献
- 百面深度学习
- 强化学习:原理与 Python 实现
- 强化学习根底 David Silver 笔记
- David Silver 强化学习公开课中文解说及实际
- UCL Course on RL(David Silver)
- 文言强化学习与 PyTorch
- OpenAI Spinning Up
- 神经网络与深度学习
- 机器学习
更多优质内容请关注公号:汀丶人工智能