Easy RL 强化学习教程

978-7-115-58470-0
作者: 王琦杨毅远江季
译者:
编辑: 郭媛

图书目录:

详情

强化学习作为机器学习及人工智能领域的一种重要方法,在游戏、自动驾驶、机器人路线规划等领域得到了广泛的应用。 本书结合了李宏毅老师的“深度强化学习”、周博磊老师的“强化学习纲要”、李科浇老师的“世界冠军带你从零实践强化学习”公开课的精华内容,在理论严谨的基础上深入浅出地介绍马尔可夫决策过程、蒙特卡洛方法、时序差分方法、Sarsa、Q 学习等传统强化学习算法,以及策略梯度、近端策略优化、深度Q 网络、深度确定性策略梯度等常见深度强化学习算法的基本概念和方法,并以大量生动有趣的例子帮助读者理解强化学习问题的建模过程以及核心算法的细节。 此外,本书还提供较为全面的习题解答以及Python 代码实现,可以让读者进行端到端、从理论到轻松实践的全生态学习,充分掌握强化学习算法的原理并能进行实战。 本书适合对强化学习感兴趣的读者阅读,也可以作为相关课程的配套教材。

图书摘要

版权信息

书名:Easy RL:强化学习教程

ISBN:978-7-115-58470-0

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。


编  著 王 琦  杨毅远  江 季

责任编辑 郭 媛

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315


强化学习作为机器学习及人工智能领域的一种重要方法,在游戏、自动驾驶、机器人路线规划等领域得到了广泛的应用。本书结合了李宏毅老师的“深度强化学习”、周博磊老师的“强化学习纲要”、李科浇老师的“世界冠军带你从零实践强化学习”公开课的精华内容,在理论严谨的基础上深入浅出地介绍马尔可夫决策过程、蒙特卡洛方法、时序差分方法、Sarsa、Q学习等传统强化学习算法,以及策略梯度、近端策略优化、深度Q网络、深度确定性策略梯度等常见深度强化学习算法的基本概念和方法,并以大量生动有趣的例子帮助读者理解强化学习问题的建模过程以及核心算法的细节。此外,本书还提供较为全面的习题解答以及Python代码实现,可以让读者进行端到端、从理论到轻松实践的全生态学习,充分掌握强化学习算法的原理并能进行实战。

本书适合对强化学习感兴趣的读者阅读,也可以作为相关课程的配套教材。


在认识本书编著者之前,我就已经在网络上注意到他们的教程“Easy-RL”, 因为“Easy-RL”有部分内容改编自我在台湾大学开授的 “深度强化学习” 上课视 频。当第一次看到“Easy-RL”时,我的第一个想法是:这群人把强化学习的知识 整理得真好,不仅有理论说明,还加上了程序实例,同学们以后可以直接读这套 教程,这样我上课也就不用再讲强化学习的部分了。很高兴王琦、杨毅远、江季三位编著者能够把“Easy-RL”以图书的形式出版。

——李宏毅,台湾大学副教授

很欣喜三位编著者能整合和升华我与另外两位老师的强化学习公开课资料,编著出这本实用的强化学习入门教程。这本教程专注于强化学习理论与实践相结 合,通过生动的例子和动手实践帮助读者深入理解各种算法。以强化学习为代表的机器智能决策是人工智能的重要方向之一,希望未来更多优秀的同学可以通过这本教程和强化学习的公开课,开启自己的研究之旅,实现类似于 AlphaGo 系列 的开创性工作。

——周博磊,加利福尼亚大学洛杉矶分校(UCLA)助理教授

还记得我当初自学强化学习的时候,中文资料少之又少,只能去啃国外的教材和论文;后来开设 “世界冠军带你从零实践强化学习” 这门公开课,也是期望可以为强化学习中文社区添砖加瓦;所以很开心国内的学生能自发地形成这种公开的、系统的强化学习中文入门课程笔记的整理、分享与社区讨论的氛围。看了“Easy-RL”仓库以及编著者发来的这本书第 1 章的内容,我发现这本书不仅是一个笔记合集,编著者有重点地梳理了理论,并配备了难度适中的习题实践和面试题供读者参考。我相信这本书的出版对于刚接触强化学习的学生,以及准备转行的在职人员都会有帮助。非常推荐强化学习初学者阅读它。

——李科浇,飞桨强化学习 PARL 团队核心成员,百度高级研发工程师

王琦、杨毅远和江季三位年轻作者,从自身学习和实践的角度将他们对强化学习基础内容的理解加以汇总,并完善成一本初学者之间交流、互动以及应用强化学习的实战图书。三位年轻作者在开源平台中多次迭代内容,和读者共同建立起了一套化繁为简的、浅显易懂的强化学习思维架构,这种做法很值得借鉴。目前,强化学习还处于高速发展期,正是年轻人施展拳脚的好赛道。这本书为强化学习的初学者和爱好者提供了一份难得的、可快速入门的学习和研究资料,相信读者会从这本书中得到课堂之外、实用之内和兴趣之中的前沿学术成果的应用知识。

——汪军,伦敦大学学院(UCL)计算机科学系教授

近年来,国内的学习者对于强化学习的热情日渐高涨,但是目前缺少一本适合初学者自学的书。这本书正好弥补了这一空白。由于三位编著者都是开源社区Datawhale 的成员,在这本书开源过程中得到了学习者的反馈,因此这本书更能从学习者的视角行文。全书以简洁的语言介绍强化学习的基础知识以及深度强化学习的内容,让初学者能够以轻快的步伐入门强化学习。

——张伟楠,上海交通大学计算机科学与工程系副教授、博士生导师

强化学习是人工智能的一个重要研究领域,具有潜在的巨大应用价值。以AlphaZero为代表的围棋智能突破,也从侧面证明了其解决复杂高维问题的能力。然而强化学习的应用尚处于起步阶段,它既有理论学习的复杂度,又有工程实践的挑战性,导致初学者难以入门,更难以深入。这本书以生动形象的语言、深入浅出的逻辑,介绍了一系列基本的强化学习算法,并结合丰富有趣的经典案例讲解代码实践,为强化学习初学者提供了一套可快速上手的学习资料。

——李升波,清华大学车辆与运载学院长聘教授、博士生导师

《Easy RL:强化学习教程》一书很好地整合了强化学习的基础知识、经典算法、前沿方向和尖端技术解读,填补了国内在这方面的空白,完全可以作为中文强化学习教材。初学者通过阅读这本书可以全方位地了解强化学习,而强化学习研究者也可以从这本书中获得灵感和新的收获。三位编著者并没有用艰深晦涩的语言去描述强化学习,而是从自己的学习心得出发,将自己的学习笔记凝结成这几十万字的精华,娓娓道来,让人手不释卷。整本书的章节安排非常合理,前后章节环环相扣,既包含初学者必须掌握的关键知识点,也包含强化学习的前沿技术动态,展现出强化学习清晰的发展脉络。感谢这本书的三位编著者奉献出自己宝贵的学习经验和知识结晶,相信未来会有很多优秀的同学因为这本书投身于强化学习的研究热潮中。

——胡裕靖,网易伏羲强化学习研究组负责人


强化学习的国内相关资料相对较少,入门较为困难。笔者发现其在游戏、自动驾驶、机器人路线规划、神经网络架构设计等诸多领域有着广泛的应用,因而萌发了自学的想法。但在学习过程中,笔者发现现有的某些图书相对较难理解,初学者难以入门。因此,笔者尝试在网上寻找公开课进行学习。在精心挑选后,使用李宏毅老师的“深度强化学习”、周博磊老师的“强化学习纲要”以及李科浇老师的“世界冠军带你从零实践强化学习”公开课(以下简称“3门公开课”)作为学习课程,获益匪浅,于是将所学内容结合笔者个人的理解和体会初步整理成笔记。之后,在众多优秀开源教程的启发下,笔者决定将该笔记制作成教程来让更多的强化学习初学者受益。笔者深知一个人力量的有限,便邀请另外两位编著者(杨毅远、江季)参与教程的编写。杨毅远在人工智能研究方面颇有建树,曾多次在中国计算机学会(CCF)A、B类会议中发表第一作者论文。而江季对强化学习也有较深的理解,有丰富的强化学习研究经历并发表过顶级会议论文和获得过相关专利。杨毅远与江季的加入让教程的创作焕发出了新的生机。通过不懈的努力,我们在GitHub上发布线上教程“Easy-RL”,分享给强化学习的初学者。截至目前,该教程获得了3000多的Git Hub Star。

为了更好地优化教程,我们尝试把该教程作为教材,并组织上百人的组队学 习活动,受到了一致好评。不少学习者通过组队学习入门了强化学习,并给出了 大量的反馈,这也帮助我们进一步改进了教程。为了方便读者的阅读,我们历时 1年制作了电子版的笔记,并对很多地方进行了优化。之后,非常荣幸的是人民 邮电出版社的陈冀康老师联系我们商量出版事宜。通过出版社团队和我们不断的 努力,本书得以出版。

全书主要内容源于3门公开课,并在其基础上进行了一定的原创。比如,为了尽可能地降低阅读门槛,笔者对3门公开课的精华内容进行选取并优化,对所涉及的公式都给出详细的推导过程,对较难理解的知识点进行了重点讲解和强化,以方便读者较为轻松地入门。此外,为了丰富内容,笔者还补充了不少除3门公开课之外的强化学习相关知识。全书共13章,大体上可分为两个部分:第一部分包括第1~3章,介绍强化学习基础知识以及传统强化学习算法;第二部分包括第4~13章,介绍深度强化学习算法及其常见问题的解决方法。第二部分各章相对独立,读者可根据自己的兴趣和时间选择性阅读。

李宏毅老师是台湾大学副教授,其研究方向为机器学习、深度学习及语音识别与理解。李宏毅老师的课程在国内很受欢迎,很多人选择的机器学习入门学习资料都是李宏毅老师的公开课视频。李宏毅老师的课程“深度强化学习”幽默风趣,他会通过很多有趣的例子来讲解强化学习理论。比如李老师经常会用玩雅达利游戏的例子来讲解强化学习算法。周博磊老师是加利福尼亚大学洛杉矶分校(University of California, Los Angeles,UCLA)助理教授,原香港中文大学助理教授,其研究方向为机器感知和智能决策,在人工智能顶级会议和期刊发表了50余篇学术论文,论文总引用数超过1万次。周博磊老师的课程“强化学习纲要”理论严谨、内容丰富,全面地介绍了强化学习领域,并且有相关的代码实践。李科浇老师是飞桨强化学习PARL团队核心成员,百度高级研发工程师,其所在团队曾两度夺得神经信息处理系统大会(Conference and Workshop on Neural Information Processing Systems,NeurIPS)强化学习赛事冠军。李科浇老师的课程“世界冠军带你从零实践强化学习”实战性强,通过大量的代码来讲解强化学习。经过笔者不完全统计,本书所依托的3门公开课的总播放量为100多万,深受广大初学者欢迎,3位老师的课程均可在哔哩哔哩网站(B站)上进行观看。读者在观看公开课的同时,可以使用本书作为教辅资料,以进一步深入理解公开课的内容。

本书在大部分章末设置了原创的关键词、习题和面试题来帮助读者提高和巩固读者对所学知识的清晰度和掌握度。其中,关键词部分总结了对应章节的重点概念,以方便读者高效地回忆并掌握核心内容;习题部分以问答的形式阐述了相应章中出现的知识点,以帮助读者厘清知识脉络;面试题部分的内容源于“大厂”的算法岗面试真题,通过还原真实的面试场景和面试问题,以帮助读者开阔思路,为读者面试理想的岗位助力。此外,笔者认为,强化学习是一个理论与实践相结合的学科,读者不仅要理解其算法背后的数学原理,还要通过上机实践来实现算法。本书配有Python代码实现,可以让读者通过动手实现各种经典的强化学习算法,充分掌握强化学习算法的原理。值得注意的是,本书的习题答案、面试题答案及配套Python代码均可在异步社区本书页面的“配套资源”处下载。本书经过1年多的优化,吸收了读者对于我们开源版教程的上百次的反馈,对读者的学习和工作一定会形成有利的加持。

衷心感谢李宏毅、周博磊、李科浇3位老师的授权和开源奉献精神。他们的无私使本书得以出版,并能够造福更多对强化学习感兴趣的读者。本书由开源组织Datawhale的成员采用开源协作的方式完成,历时1年有余,参与者包括3位编著者(笔者、杨毅远和江季)和两位Datawhale的小伙伴(谢文睿和马燕鹏)。此外,感谢林诗颖同学在编书过程中对图3.14的制作以及李海东同学对图3.31、图3.32的制作。在本书写作和出版过程中,人民邮电出版社提供了很多出版的专业意见和支持,在此特向信息技术出版分社社长陈冀康老师和本书的责任编辑郭媛老师致谢。

强化学习发展迅速,笔者水平有限,书中难免有疏漏和表述不当的地方,还望各位读者批评指正。

王 琦  

2021年12月8日


  标量

  向量

  矩阵

  实数集

  取最大值时 的值

  状态

  动作

  奖励

  策略

  根据确定性策略 在状态 选取的动作

  根据随机性策略 在状态 选取动作 的概率

  折扣因子

  轨迹

  状态 在策略 下的价值

  状态 在策略 下选取动作 的价值

  时刻 的回报

  参数 对应的策略

  策略 的性能度量


本书由异步社区出品,社区(https://www.epubit.com/)可为您提供相关资源和后续服务。

本书提供如下资源:

您可以扫描右侧的二维码,添加异步助手为好友,并发送 “58470”获取以上配套资源。

您也可以在异步社区本书页面中单击,跳转到下载页面,按提示进行操作即可。注意:为保证购书读者的权益,该操作会给出相关提示,要求输入提取码进行验证。

作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。

当您发现错误时,请登录异步社区,按书名搜索,进入本书页面(见下图),单击 “提交勘误”,输入错误信息后,单击 “提交” 按钮即可。本书的作者和编辑会对您提交的错误信息进行审核,确认并接受后,您将获赠异步社区的 100 积分。 积分可用于在异步社区兑换优惠券、样书或奖品。

我们的联系邮箱是 contact@epubit.com.cn。

如果您对本书有任何疑问或建议,请您发电子邮件给我们,并请在电子邮件 标题中注明书名,以便我们更高效地做出反馈。

如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发电子邮件给我们;有意出版图书的作者也可以到异步社区在线投稿(直接访问 www.epubit.com/contribute 即可)。

如果您所在的学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发电子邮件给我们。

如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发电子邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。

“异步社区” 是人民邮电出版社旗下 IT 专业图书社区,致力于出版精品 IT图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于 2015 年 8月,提供大量精品 IT 图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网。

“异步图书” 是由异步社区编辑团队策划出版的精品 IT 专业图书的品牌,依托于人民邮电出版社近 40 年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的 Logo。异步图书的出版领域包括软件开发、大数据、人工智能、测试、前端、网络技术等。

异步社区

微信服务号


强化学习(reinforcement learning,RL)讨论的问题是智能体(agent)怎么在复杂、不确定的环境(environment)中最大化它能获得的奖励。如图1.1 所示,强化学习由两部分组成:智能体和环境。在强化学习过程中,智能体与环境一直在交互。智能体在环境中获取某个状态后,它会利用该状态输出一个动作(action),这个动作也称为决策(decision)。然后这个动作会在环境中被执行,环境会根据智能体采取的动作,输出下一个状态以及当前这个动作带来的奖励。智能体的目的就是尽可能多地从环境中获取奖励。

图1.1 强化学习示意[1]

我们可以把强化学习与监督学习做一个对比。以图片分类为例,如图1.2 所示,监督学习(supervised learning)假设我们有大量被标注的数据,比如汽车、飞机、椅子这些被标注的图片,这些图片都要满足独立同分布,即它们之间是没有关联关系的。假设我们训练一个分类器,比如神经网络。为了分辨输入的图片中是汽车还是飞机,在训练过程中,需要把正确的标签信息传递给神经网络。当神经网络做出错误的预测时,比如输入汽车的图片,它预测出来是飞机,我们就会直接告诉它,该预测是错误的,正确的标签应该是汽车。最后我们根据类似错误写出一个损失函数(loss function),通过反向传播(back propagation)来训练神经网络。

图1.2 监督学习


通常假设样本空间中全体样本服从一个未知分布,每个样本都是独立地从这个分布上采样获得的,即独立同分布(independent and identically distributed,i.i.d.)。


所以在监督学习过程中,有两个假设。第一,输入的数据(标注的数据)都应是没有关联的。因为如果输入的数据有关联,学习器(learner)是不好学习的。第二,需要告诉学习器正确的标签是什么,这样它可以通过正确的标签来修正自己的预测。

在强化学习中,监督学习的两个假设其实都不能得到满足。以雅达利(Atari)游戏为例,如图1.3所示,这是一个打砖块的游戏,控制木板左右移动从而把球反弹到上面来消除砖块。在玩游戏的过程中,我们可以发现智能体得到的观测(observation)不是独立同分布的,上一帧与下一帧间其实有非常强的连续性。我们得到的数据是相关的时间序列数据,不满足独立同分布。另外,我们并没有立刻获得反馈,游戏没有告诉我们哪个动作是正确动作。比如现在把木板往右移,这只会使得球往上或者往左一点儿,我们并不会得到即时的反馈。因此,强化学习之所以困难,是因为智能体不能得到即时的反馈,然而我们依然希望智能体在这个环境中学习。

图1.3 雅达利游戏

如图1.4所示,强化学习的训练数据就是一个玩游戏的过程。我们从第1步开始,采取一个动作,比如把木板往右移,接到球。第2步我们又采取一个动作……得到的训练数据是一个玩游戏的序列。假设现在是在第3步,我们把这个序列放进网络,希望网络可以输出一个动作,即在当前的状态应该输出往右移还是往左移。这里有个问题,没有标签来说明现在这个动作是正确还是错误的,必须等到游戏结束才可能知道,这个游戏可能10s后才结束。现在这个动作到底对赢得游戏有无帮助,其实是不清楚的。这里我们就面临延迟奖励(delayed reward)的问题,延迟奖励使得训练网络非常困难。

图1.4 强化学习:玩

强化学习和监督学习的区别如下。

(1)强化学习处理的大多数是序列数据,其很难像监督学习的样本一样满足独立同分布。

(2)学习器并没有告诉我们每一步正确的动作应该是什么,学习器需要自己去发现哪些动作可以带来最多的奖励,只能通过不停地尝试来发现最有利的动作。

(3)智能体获得自己能力的过程,其实是不断地试错探索(trial-and-error exploration)的过程。探索(exploration)和利用(exploitation)是强化学习中非常核心的问题。其中,探索指尝试一些新的动作,这些新的动作有可能会使我们得到更多的奖励,也有可能使我们“一无所有”;利用指采取已知的可以获得最多奖励的动作,重复执行这个动作,因为我们知道这样做可以获得一定的奖励。 因此,我们需要在探索和利用之间进行权衡,这也是在监督学习中没有的情况。

(4)在强化学习过程中,没有非常强的监督者(supervisor),只有奖励信号(reward signal),并且奖励信号是延迟的,即环境会在很久以后才告诉我们之前所采取的动作到底是不是有效的。因为我们没有得到即时反馈,所以智能体使用强化学习来学习就非常困难。当我们采取一个动作后,如果使用监督学习,就可以立刻获得一个指导,比如,我们现在采取了一个错误的动作,正确的动作应该是什么。而在强化学习中,环境可能会告诉我们这个动作是错误的,但是它并不会告诉我们正确的动作是什么。而且更困难的是,它可能是在一两分钟过后才告诉我们这个动作是错误的。所以这也是强化学习和监督学习不同的地方。

通过与监督学习的比较,我们可以总结出强化学习的一些特征。

(1)强化学习会试错探索,它通过探索环境来获取对环境的理解。

(2)强化学习智能体会从环境中获得延迟的奖励。

(3)在强化学习的训练过程中,时间非常重要。因为我们得到的是有时间关联的数据(sequential data),而不是独立同分布的数据。在机器学习中,如果观测数据有非常强的关联,会使得训练非常不稳定。这也是为什么在监督学习中,我们希望数据尽量满足独立同分布,这样就可以消除数据之间的相关性。

(4)智能体的动作会影响它随后得到的数据,这一点是非常重要的。在训练智能体的过程中,很多时候我们也是通过正在学习的智能体与环境交互来得到数据的。所以如果在训练过程中,智能体不能保持稳定,就会使我们采集到的数据非常糟糕。我们通过数据来训练智能体,如果数据有问题,整个训练过程就会失败。所以在强化学习中一个非常重要的问题就是,怎么让智能体的动作一直稳定地提升。

为什么我们关注强化学习?其中非常重要的一个原因就是强化学习得到的模型可以有超人类的表现。监督学习获取的监督数据,其实是人来标注的,比如 ImageNet 的图片的标签都是人类标注的。因此我们可以确定监督学习算法的上限(upper bound)就是人类的表现,标注结果决定了它的表现永远不可能超越人类的。但是对于强化学习,它在环境中自己探索,有非常大的潜力,它可以获得超越人类的能力的表现,比如DeepMind 的强化学习算法 AlphaGo 可以把人类顶尖的棋手打败。

这里给大家举一些在现实生活中强化学习的例子。

(1)在自然界中,羚羊其实也在做强化学习。它刚刚出生的时候,可能都不知道怎么站立,然后它通过试错,一段时间后就可以跑得很快,可以适应环境。

(2)我们也可以把股票交易看成强化学习的过程,可以不断地买卖股票,然后根据市场给出的反馈来学会怎么去买卖可以让奖励最大化。

(3)玩雅达利游戏或者其他电脑游戏,也是一个强化学习的过程,我们可以通过不断试错来知道怎么玩才可以通关。

图1.5所示为强化学习的一个经典例子,即雅达利的游戏。游戏中右边的选手把球拍到左边,然后左边的选手需要把球拍到右边。训练好的强化学习智能体和正常的选手有区别:强化学习的智能体会一直做无意义的上下往复移动,而正常的选手不会做出这样的动作。

图1.5 游戏[2]

游戏中,只有两个动作:往上或者往下。如图1.6所示,如果强化学习通过学习一个策略网络来进行分类,那么策略网络会输入当前帧的图片,输出所有决策的可能性,比如往上移动的概率。

图1.6 强化学习玩[2]

如图1.7所示,对于监督学习,我们可以直接告诉智能体正确动作的标签是什么。但在游戏中,我们并不知道它的正确动作的标签是什么。

图1.7 监督学习玩[2]

在强化学习中,让智能体尝试玩游戏,对动作进行采样,直到游戏结束,然后对每个动作进行惩罚。图1.8所示为预演(rollout)的过程。预演是指我们从当前帧对动作进行采样,生成很多局游戏。将当前的智能体与环境交互,会得到一系列观测。每一个观测可看成一条轨迹(trajectory)。轨迹就是当前帧以及它采取的策略,即状态和动作的序列:

  (1.1)

最后结束时,我们会知道到底有没有把这个球拍到对方区域,对方有没有接住,赢了还是输了。我们可以通过观测序列以及最终奖励(eventual reward)来训练智能体,使它尽可能地采取可以获得最终奖励的动作。一场游戏称为一个回合(episode)或者试验(trial)

图1.8 可能的预演序列[2]

强化学习是有一定的历史的,早期的强化学习,我们称其为标准强化学习。最近业界把强化学习与深度学习结合起来,就形成了深度强化学习(deep reinforcement learning),因此,深度强化学习 = 深度学习 + 强化学习。我们可将标准强化学习和深度强化学习类比于传统的计算机视觉和深度计算机视觉。

如图1.9(a) 所示,传统的计算机视觉由两个过程组成。

(1)给定一张图片,我们先要提取它的特征,使用一些设计好的特征,比如方向梯度直方图(histogram of oriented gradient,HOG)、可变形的组件模型(deformable part model,DPM)。

(2)提取这些特征后,我们再单独训练一个分类器。这个分类器可以是支持向量机(support vector machine,SVM)或 Boosting,然后就可以辨别这张图片中是狗还是猫。

图1.9 传统的计算机视觉与深度计算机视觉的区别

2012年,Hinton团队提出了AlexNet。AlexNet在ImageNet分类比赛中获得冠军,迅速引起了人们对于卷积神经网络(convolutional neural network,CNN)的广泛关注。大家就把特征提取以及分类这两个过程合并了。我们训练一个神经网络,这个神经网络既可以做特征提取,也可以做分类,它可以实现端到端训练,如图1.9(b) 所示,其参数可以在每一个阶段都得到极大的优化,这是一个非常重要的突破。

我们可以把神经网络放到强化学习中。

图1.10 标准强化学习与深度强化学习的区别

为什么强化学习在这几年有很多的应用,比如玩游戏以及机器人的一些应用,并且可以击败人类的顶尖棋手呢?这有如下几点原因。首先,我们有了更多的算力(computation power),有了更多的 GPU,可以更快地做更多的试错尝试。其次,通过不同的尝试,智能体在环境中获得了很多信息,可以在环境中取得很大的奖励。最后,通过端到端训练,可以把特征提取、价值估计以及决策部分一起优化,就可以得到一个更强的决策网络。

接下来介绍一些强化学习中比较有意思的例子。

(1)DeepMind 研发的走路的智能体。这个智能体往前走一步,就会得到一个奖励。这个智能体有不同的形态,可以学到很多有意思的功能。比如,像人一样的智能体学习怎么在曲折的道路上往前走。结果非常有意思,这个智能体会把手举得非常高,因为举手可以让它的身体保持平衡,它就可以更快地在环境中往前走。而且我们也可以增加环境的难度,加入一些扰动,智能体就会变得更鲁棒。

(2)机械臂抓取。因为我们把强化学习应用到机械臂自动抓取需要大量的预演,所以我们可以使用多个机械臂进行训练。分布式系统可以让机械臂尝试抓取不同的物体,盘子中物体的形状是不同的,这样就可以让机械臂学到一个统一的动作,然后针对不同的抓取物都可以使用最优的抓取算法。因为抓取的物体形状的差别很大,所以使用一些传统的抓取算法不能把所有物体都抓起来。传统的抓取算法对每一个物体都需要建模,这样是非常费时的。但通过强化学习,我们可以学到一个统一的抓取算法,其适用于不同的物体。

(3)OpenAI 的机械臂翻魔方。OpenAI 在2018年的时候设计了一款带有“手指”的机械臂,它可以通过翻动手指使得手中的木块达到预期的设定。人的手指其实非常灵活,怎么使得机械臂的手指也具有这样灵活的能力一直是个问题。OpenAI先在一个虚拟环境中使用强化学习对智能体进行训练,再把它应用到真实的机械臂上。这在强化学习中是一种比较常用的做法,即我们先在虚拟环境中得到一个很好的智能体,然后把它应用到真实的机器人中。这是因为真实的机械臂通常非常容易坏,而且非常贵,一般情况下没办法大批量地被购买。OpenAI 在2019 年对其机械臂进行了进一步的改进,这个机械臂在改进后可以玩魔方了。

(4)穿衣服的智能体。很多时候我们要在电影或者一些动画中实现人穿衣服的场景,通过手写执行命令让机器人穿衣服非常困难,穿衣服也涉及非常精细的操作。我们可以训练强化学习智能体来实现穿衣服功能。我们还可以在其中加入一些扰动,智能体可以抵抗扰动。可能会有失败的情况(failure case)出现,这样智能体就穿不进去衣服。

接下来介绍序列决策(sequential decision making)过程。 强化学习研究的问题是智能体与环境交互的问题,图1.12左边的智能体一直在与图1.11右边的环境进行交互。智能体把它的动作输出给环境,环境取得这个动作后会进行下一步,把下一步的观测与这个动作带来的奖励返还给智能体。这样的交互会产生很多观测,智能体的目的是从这些观测之中学到能最大化奖励的策略。

图1.11 智能体和环境

奖励是由环境给的一种标量的反馈信号(scalar feedback signal),这种信号可显示智能体在某一步采取某个策略的表现如何。强化学习的目的就是最大化智能体可以获得的奖励,智能体在环境中存在的目的就是最大化它的期望的累积奖励(expected cumulative reward)。不同的环境中,奖励也是不同的。这里给大家举一些奖励的例子。

(1)比如一个象棋选手,他的目的是赢棋,在最后棋局结束的时候,他就会得到一个正奖励(赢)或者负奖励(输)。

(2)在股票管理中,奖励由股票获取的奖励与损失决定。

(3)在玩雅达利游戏的时候,奖励就是增加或减少的游戏的分数,奖励本身的稀疏程度决定于游戏的难度。

在一个强化学习环境中,智能体的目的是选取一系列的动作来最大化奖励,所以这些选取的动作必须有长期的影响。但在这个过程中,智能体的奖励是被延迟了的,就是我们现在选取的某一步动作,可能要等到很久后才知道这一步到底产生了什么样的影响。如图1.12所示,在玩雅达利的游戏时,我们可能只有到最后游戏结束时,才知道球到底有没有被击打过去。过程中我们采取的上升(up)或下降(down)动作,并不会直接产生奖励。强化学习中一个重要的课题就是近期奖励和远期奖励的权衡(trade-off),研究怎么让智能体取得更多的远期奖励。

图1.12 玩游戏[2]

在与环境的交互过程中,智能体会获得很多观测。针对每一个观测,智能体会采取一个动作,也会得到一个奖励。所以历史是观测、动作、奖励的序列:

  (1.2)

智能体在采取当前动作的时候会依赖于它之前得到的历史,所以我们可以把整个游戏的状态看成关于这个历史的函数:

  (1.3)

Q:状态和观测有什么关系?

A:状态是对世界的完整描述,不会隐藏世界的信息。观测是对状态的部分描述,可能会遗漏一些信息。在深度强化学习中,我们几乎总是用实值的向量、矩阵或者更高阶的张量来表示状态和观测。例如,我们可以用 RGB 像素值的矩阵来表示一个视觉的观测,可以用机器人关节的角度和速度来表示一个机器人的状态。

环境有自己的函数 来更新状态,在智能体的内部也有一个函数 来更新状态。当智能体的状态与环境的状态等价的时候,即当智能体能够观察到环境的所有状态时,我们称这个环境是完全可观测的(fully observed)。在这种情况下,强化学习通常被建模成一个马尔可夫决策过程(Markov decision process,MDP)的问题。在马尔可夫决策过程中,

但是有一种情况是智能体得到的观测并不能包含环境运作的所有状态,因为在强化学习的设定中,环境的状态才是真正的所有状态。比如智能体在玩}游戏,它能看到的其实是牌面上的牌。或者在玩雅达利游戏的时候,观测到的只是当前电视上面这一帧的信息,我们并没有得到游戏内部所有的运作状态。也就是当智能体只能看到部分的观测,我们就称这个环境是部分可观测的(partially observed)。在这种情况下,强化学习通常被建模成部分可观测马尔可夫决策过程(partially observable Markov decision process, POMDP)的问题。部分可观测马尔可夫决策过程是马尔可夫决策过程的一种泛化。部分可观测马尔可夫决策过程依然具有马尔可夫性质,但是假设智能体无法感知环境的状态,只能知道部分观测值。比如在自动驾驶中,智能体只能感知传感器采集的有限的环境信息。部分可观测马尔可夫决策过程可以用一个七元组描述:。其中 表示状态空间,为隐变量, 为动作空间, 为状态转移概率, 为奖励函数, 为观测概率, 为观测空间, 为折扣因子。

不同的环境允许不同种类的动作。在给定的环境中,有效动作的集合经常被称为动作空间(action space)。像雅达利游戏和围棋(Go)这样的环境有离散动作空间(discrete action space),在这样的动作空间里,智能体的动作数量是有限的。在其他环境,比如在物理世界中控制一个智能体,在这样的环境中就有连续动作空间(continuous action space)。在连续动作空间中,动作是实值的向量。

例如,走迷宫机器人如果只有往东、往南、往西、往北这 4 种移动方式,则其动作空间为离散动作空间;如果机器人可以向 中的任意角度进行移动,则其动作空间为连续动作空间。

对于一个强化学习智能体,它可能有一个或多个如下的组成部分。

下面我们深入了解这3个组成部分的细节。

策略是智能体的动作模型,它决定了智能体的动作。它其实是一个函数,用于把输入的状态变成动作。策略可分为两种:随机性策略和确定性策略。

随机性策略(stochastic policy)就是 函数,即。输入一个状态 ,输出一个概率。这个概率是智能体所有动作的概率,然后对这个概率分布进行采样,可得到智能体将采取的动作。比如可能是有 0.7 的概率往左,0.3 的概率往右,那么通过采样就可以得到智能体将采取的动作。

确定性策略(deterministic policy)就是智能体直接采取最有可能的动作,即

如图1.13所示,从雅达利游戏来看,策略函数的输入就是游戏的一帧,它的输出决定智能体向左移动或者向右移动。

图1.13 策略函数

通常情况下,强化学习一般使用随机性策略,随机性策略有很多优点。比如,在学习时可以通过引入一定的随机性来更好地探索环境;随机性策略的动作具有多样性,这一点在多个智能体博弈时非常重要。采用确定性策略的智能体总是对同样的状态采取相同的动作,这会导致它的策略很容易被对手预测。

价值函数的值是对未来奖励的预测,我们用它来评估状态的好坏。价值函数中有一个折扣因子(discount factor),我们希望在尽可能短的时间内得到尽可能多的奖励。比如现在给我们两个选择:10天后给我们100元或者现在给我们100元。我们肯定更希望现在就给我们 100 元,因为可以把这 100 元存在银行中,这样就会有一些利息。因此,我们可以把折扣因子放到价值函数的定义中,价值函数的定义为

,对于所有的  (1.4)

期望 的下标是 函数, 函数的值可反映在我们使用策略 的时候,到底可以得到多少奖励。

我们还有一种价值函数:Q 函数。Q 函数中包含两个变量:状态和动作。其定义为

  (1.5)

所以我们未来可以获得奖励的期望取决于当前的状态和当前的动作。Q 函数是强化学习算法中要学习的一个函数。因为当我们得到 Q 函数后,进入某个状态要采取的最优动作可以通过 Q 函数得到。

第3个组成部分是模型,模型决定了下一步的状态。下一步的状态取决于当前的状态以及当前采取的动作。它由状态转移概率和奖励函数两个部分组成。状态转移概率即

  (1.6)

奖励函数是指我们在当前状态采取了某个动作,可以得到多大的奖励,即

  (1.7)

当我们有了策略、价值函数和模型3个组成部分后,就形成了一个马尔可夫决策过程。如图1.14所示,这个决策过程可视化了状态之间的转移以及采取的动作。

图1.14 马尔可夫决策过程[2]

我们来看一个走迷宫的例子。如图1.15所示,要求智能体从起点(start)开始,最后到达终点(goal)的位置。每走一步,就会得到 1 的奖励。我们可以采取的动作是往上、下、左、右走。我们用现在智能体所在的位置来描述当前状态。

图1.15 走迷宫的例子[3]

我们可以用不同的强化学习方法来“解”这个环境。如果采取基于策略的强化学习(policy-based RL)方法,当学习好了这个环境后,在每一个状态,我们都会得到一个最佳的动作。如图1.16所示,比如现在在起点位置,我们知道最佳动作是往右走;在第二格的时候,得到的最佳动作是往上走;第三格是往右走通过最佳的策略,我们可以最快地到达终点。

图1.16 使用基于策略的强化学习方法得到的结果[3]

如果换成基于价值的强化学习(value-based RL)方法,利用价值函数作为导向,我们就会得到另外一种表征,每一个状态会返回一个价值。如图1.17所示,比如我们在起点位置的时候,价值是 ,因为最快可以 16 步到达终点。因为每走一步会减1,所以这里的价值是 。当我们快接近终点的时候,这个数字变得越来越大。在拐角的时候,比如现在在第二格,价值是,智能体会看上、下两格,它看到上面格子的价值变大了,变成 了,下面格子的价值是 ,那么智能体就会采取一个往上走的动作。所以通过学习的价值的不同,我们可以抽取出现在最佳的策略。

图1.17 使用基于价值的强化学习方法得到的结果[3]

1. 基于价值的智能体与基于策略的智能体

根据智能体学习的事物不同,我们可以把智能体进行归类。基于价值的智能体(value-based agent)显式地学习价值函数,隐式地学习其策略。策略是其从学到的价值函数中推算出来的。基于策略的智能体(policy-based agent)直接学习策略,给它一个状态,它就会输出对应动作的概率。基于策略的智能体并没有学习价值函数。把基于价值的智能体和基于策略的智能体结合起来就有了演员-评论员智能体(actor-critic agent)。这一类智能体通过学习策略函数和价值函数以及两者的交互得到最佳的动作。

Q:基于策略和基于价值的强化学习方法有什么区别?

A:对于一个状态转移概率已知的马尔可夫决策过程,我们可以使用动态规划算法来求解。从决策方式来看,强化学习又可以划分为基于策略的方法和基于价值的方法。决策方式是智能体在给定状态下从动作集合中选择一个动作的依据,它是静态的,不随状态变化而变化。在基于策略的强化学习方法中,智能体会制定一套动作策略,即确定在给定状态下需要采取何种动作,并根据这个策略进行操作。强化学习算法直接对策略进行优化,使制定的策略能够获得最大的奖励。而在基于价值的强化学习方法中,智能体不需要制定显式的策略,它维护一个价值表格或价值函数,并通过这个价值表格或价值函数来选取价值最大的动作。基于价值的方法只能应用在离散的环境下(如围棋或某些游戏领域),对于动作集合规模庞大、动作连续的场景(如机器人控制领域),其很难学习到较好的结果(此时基于策略的方法能够根据设定的策略来选择连续的动作)。基于价值的强化学习算法有Q学习(Q-learning)、 Sarsa 等,而基于策略的强化学习算法有策略梯度算法等。此外,演员-评论员算法同时使用策略和价值评估来做出决策。其中,智能体会根据策略做出动作,而价值函数会对做出的动作给出价值,这样可以在原有的策略梯度算法的基础上加速学习过程,取得更好的效果。

2. 有模型强化学习智能体与免模型强化学习智能体

另外,我们可以通过智能体到底有没有学习环境模型来对智能体进行分类。有模型(model-based)强化学习智能体,它通过学习状态的转移来采取动作。免模型(model-free)强化学习智能体,它没有直接估计状态的转移,也没有得到环境的具体转移变量,它通过学习价值函数和策略函数进行决策。免模型强化学习智能体的模型中没有环境转移的模型。

我们可以用马尔可夫决策过程来定义强化学习任务,并将其表示为四元组 ,即状态集合、动作集合、状态转移函数和奖励函数。如果这个四元组中所有元素均已知,且状态集合和动作集合在有限步数内是有限集,则智能体可以对真实环境进行建模,构建一个虚拟世界来模拟真实环境中的状态和交互反应。具体来说,当智能体知道状态转移函数 和奖励函数 后,它就能知道在某一状态下执行某一动作后能带来的奖励和环境的下一状态,这样智能体就不需要在真实环境中采取动作,直接在虚拟世界中学习和规划策略即可。这种学习方法称为有模型强化学习。有模型强化学习的流程如图1.18所示。

然而在实际应用中,智能体并不是那么容易就能知晓马尔可夫决策过程中的所有元素的。通常情况下,状态转移函数和奖励函数很难估计,甚至连环境中的状态都可能是未知的,这时就需要采用免模型强化学习。免模型强化学习没有对真实环境进行建模,智能体只能在真实环境中通过一定的策略来执行动作,等待奖励和状态迁移,然后根据这些反馈信息来更新动作策略,这样反复迭代直到学习到最优策略。

图1.18 有模型强化学习流程[4]

Q:有模型强化学习和免模型强化学习有什么区别?

A:针对是否需要对真实环境建模,强化学习可以分为有模型强化学习和免模型强化学习。有模型强化学习是指根据环境中的经验,构建一个虚拟世界,同时在真实环境和虚拟世界中学习;免模型强化学习是指不对环境进行建模,直接与真实环境进行交互来学习到最优策略。

总之,有模型强化学习相比免模型强化学习仅仅多出一个步骤,即对真实环境进行建模。因此,一些有模型强化学习方法,也可以在免模型强化学习方法中使用。在实际应用中,如果不清楚该用有模型强化学习还是免模型强化学习,可以先思考在智能体执行动作前,是否能对下一步的状态和奖励进行预测,如果能,就能够对环境进行建模,从而采用有模型强化学习。

免模型强化学习通常属于数据驱动型方法,需要大量的采样来估计状态、动作及奖励函数,从而优化动作策略。例如,在雅达利平台上的《太空侵略者》游戏中,免模型的深度强化学习需要大约两亿帧游戏画面才能学到比较理想的效果。相比之下,有模型的深度强化学习可以在一定程度上缓解训练数据匮乏的问题,因为智能体可以在虚拟世界中进行训练。免模型强化学习的泛化性要优于有模型强化学习,原因是有模型强化学习需要对真实环境进行建模,并且虚拟世界与真实环境之间可能还有差异,这限制了有模型强化学习算法的泛化性。有模型强化学习可以对环境建模,使得该类方法具有独特魅力,即“想象能力”。在免模型强化学习中,智能体只能一步一步地采取策略,等待真实环境的反馈;有模型强化学习可以在虚拟世界中预测出将要发生的事,并采取对自己最有利的策略。

目前,大部分深度强化学习方法都采用了免模型强化学习,这是因为:免模型强化学习更为简单、直观且有丰富的开源资料,如 AlphaGo 系列都采用免模型强化学习;在目前的强化学习研究中,大部分情况下环境都是静态的、可描述的,智能体的状态是离散的、可观察的(如雅达利游戏平台),这种相对简单、确定的问题并不需要评估状态转移函数和奖励函数,可直接采用免模型强化学习,使用大量的样本进行训练就能获得较好的效果[4]

如图1.19所示,我们可以把几类模型放到一个维恩图中。图1.19有3个组成部分:价值函数、策略和模型。按一个智能体具有三者中的三者、两者或一者的情况可以把它分成很多类。

图1.19 强化学习智能体的类型[3]

学习(learning)和规划(planning)是序列决策的两个基本问题。如图1.20所示,在强化学习中,环境初始时是未知的,智能体不知道环境如何工作,它通过不断地与环境交互,逐渐改进策略。

图1.20 学习[3]

如图1.21所示,在规划中,环境是已知的,智能体被告知了整个环境的运作规则的详细信息。智能体能够计算出一个完美的模型,并且在不需要与环境进行任何交互的时候进行计算。智能体不需要实时地与环境交互就能知道未来环境,只需要知道当前的状态,就能够开始思考,来寻找最优解。

图1.21 规划[3]

在图1.21所示的游戏中,规则是确定的,我们知道选择左之后环境将会产生什么变化。我们完全可以通过已知的规则,在内部模拟整个决策过程,无需与环境交互。一个常用的强化学习问题解决思路是,先学习环境如何工作,也就是了解环境工作的方式,即学习得到一个模型,然后利用这个模型进行规划。

在强化学习中,探索和利用是两个很核心的问题。探索即我们去探索环境,通过尝试不同的动作来得到最佳的策略(带来最大奖励的策略)。利用即我们不去尝试新的动作,而是采取已知的可以带来很大奖励的动作。在刚开始的时候,强化学习智能体不知道它采取了某个动作后会发生什么,所以它只能通过试错去探索,那么探索就是通过试错来理解采取的动作到底可不可以带来好的奖励。利用是指我们直接采取已知的可以带来很好奖励的动作。所以这里就面临一个权衡问题,即怎么通过牺牲一些短期的奖励来理解动作,从而学习到更好的策略。

下面举一些探索和利用的例子。以选择餐馆为例,利用是指我们直接去最喜欢的餐馆,因为去过这个餐馆很多次了,所以我们知道这里的菜都非常可口;探索是指我们用手机搜索一个新的餐馆,然后去尝试它的菜到底好不好吃,我们有可能对这个新的餐馆感到非常不满意,这样钱就浪费了。以做广告为例,利用是指我们直接采取最优的广告策略;探索是指我们换一种广告策略,看看这个新的广告策略可不可以得到更好的效果。以挖油为例,利用是指我们直接在已知的地方挖油,这样可以确保挖到油;探索是指我们在一个新的地方挖油,这样就有很大的概率不能发现油田,但也可能有比较小的概率可以发现一个非常大的油田。以玩游戏为例,利用是指我们总是采取某一种策略,比如,我们玩《街头霸王》游戏的时候,采取的策略可能是蹲在角落,然后一直“出脚”,这个策略很可能可以奏效,但可能遇到特定的对手就会失效;探索是指我们可能尝试一些新的招式,有可能我们会放出“大招”来,这样就可能将对手“一招毙命”。

与监督学习任务不同,强化学习任务的最终奖励在多步动作之后才能观察到,这里我们不妨先考虑比较简单的情形:最大化单步奖励,即仅考虑一步动作。需注意的是,即使在这样的简单情形下,强化学习仍与监督学习有显著不同,因为智能体需通过试错来发现各个动作产生的结果,而没有训练数据告诉智能体应该采取哪个动作。

想要最大化单步奖励需考虑两个方面:一是需知道每个动作带来的奖励,二是要执行奖励最大的动作。若每个动作对应的奖励是一个确定值,那么尝试一次所有的动作便能找出奖励最大的动作。然而,更一般的情形是,一个动作的奖励值来自一个概率分布,仅通过一次尝试并不能确切地获得平均奖励值。

实际上,单步强化学习任务对应于一个理论模型,即-臂赌博机(-armed bandit)-臂赌博机也被称为多臂赌博机(multi-armed bandit)。如图1.22所示,-臂赌博机有 个摇臂,使用者在投入一个硬币后可选择按下其中一个摇臂,-臂赌博机以一定的概率吐出硬币,但这个概率使用者并不知道。使用者的目标是通过一定的策略最大化自己的奖励,即获得最多的硬币[5]。若仅为获知每个摇臂的期望奖励,则可采用仅探索(exploration-only)法:将所有的尝试机会平均分配给每个摇臂(即轮流按下每个摇臂),最后以每个摇臂各自对应的平均吐币概率作为其奖励期望的近似估计。若仅为执行奖励最大的动作,则可采用仅利用(exploitation-only)法:按下目前最优的(即到目前为止平均奖励最大的)摇臂,若有多个摇臂同为最优,则从中随机选取一个。

图1.22 -臂赌博机图示[5]

显然,仅探索法能很好地估计每个摇臂的奖励,却会失去很多选择最优摇臂的机会;仅利用法则相反,它没有很好地估计摇臂期望奖励,很可能经常选不到最优摇臂。因此,这两种方法都难以使最终的累积奖励最大化。

事实上,探索(估计摇臂的优劣)和利用(选择当前最优摇臂)这两者是矛盾的,因为尝试次数(总投币数)有限,加强了一方则自然会削弱另一方,这就是强化学习所面临的探索-利用窘境(exploration-exploitation dilemma)。显然,想要累积奖励最大,则必须在探索与利用之间达成较好的折中。

强化学习是一个理论与实践相结合的机器学习分支,我们不仅要理解其算法背后的数学原理,还要通过上机实践来实现算法。在很多实验环境中去探索算法能不能得到预期效果也是一个非常重要的过程。我们可以使用 Python 和深度学习的一些包来实现强化学习算法。现在有很多深度学习的包可以使用,比如 PyTorch、TensorFlow、Keras,熟练使用其中的两三种,就可以实现非常多的功能。所以我们并不需要从头去“造轮子”。

OpenAI是一家非营利性的人工智能研究公司,其公布了非常多的学习资源以及算法资源。其之所以叫作 OpenAI,是因为他们把所有开发的算法都进行了开源。如图1.23所示,OpenAI 的 Gym库是一个环境仿真库,其中包含很多现有的环境。针对不同的场景,我们可以选择不同的环境。离散控制场景(输出的动作是可数的,比如游戏中输出的向上或向下动作)一般使用雅达利环境评估;连续控制场景(输出的动作是不可数的,比如机器人走路时不仅有方向,还有角度,角度就是不可数的,是一个连续的量)一般使用 MuJoCo 环境评估。Gym Retro是对 Gym 环境的进一步扩展,包含更多的游戏。

图1.23 OpenAI 的 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)

如图1.24所示,Gym 库中有很多经典的控制类游戏。比如, 需要让一个双连杆机器人立起来;~需要通过控制一辆小车,让杆立起来;需要通过前后移动车,让它到达旗帜的位置。在刚开始测试强化学习的时候,我们可以选择这些简单环境,因为强化学习在这些环境中可以在一两分钟之内见到效果。

图1.24 经典控制问题

如图1.25所示,CartPole-v0 环境有两个动作:将小车向左移动和将小车向右移动。我们还可以得到观测:小车当前的位置,小车当前往左、往右移的速度,杆的角度以及杆的最高点(顶端)的速度。观测越详细,我们就可以更好地描述当前所有的状态。这里有奖励的定义,如果能多走一步,我们就会得到一个奖励(奖励值为1),所以我们需要存活尽可能多的时间来得到更多的奖励。当杆的角度大于某一个角度(没能保持平衡),或者小车的中心到达图形界面窗口的边缘,或者累计步数大于200,游戏就结束了,我们就输了。所以智能体的目的是控制杆,让它尽可能地保持平衡以及尽可能保持在环境的中央。

图1.25 CartPole-v0的例子

注意:如果绘制了实验的图形界面窗口,那么关闭该窗口的最佳方式是调用 env.close()。试图直接关闭图形界面窗口可能会导致内存不能释放,甚至会导致死机。

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() # 关闭环境

当我们执行这段代码时,机器人会驾驶着小车朝某个方向一直跑,直到我们看不见,这是因为我们还没开始训练机器人。

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(1000):
    env.render()
    action = env.action_space.sample()
    observation, reward, done, info = env.step(action)
    print(observation)
env.close()

输出:

[ 0.01653398 0.19114579 0.02013859 -0.28050058]
[ 0.0203569 -0.00425755 0.01452858 0.01846535]
[ 0.02027175 -0.19958481 0.01489789 0.31569  (6.1)]
......

从输出可以看出这是一个四维的观测。在其他游戏中会有维度更多的情况出现。

env.step()完成了一个完整的 过程。我们只要不断观测这样的过程,并让智能体在其中用相应的算法完成训练,就能得到一个高质量的强化学习模型。

我们想要查看当前 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 表示每个浮点数的取值范围。

接下来,我们通过一个例子来学习如何与 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

小车上山环境有一个参考的回合奖励值 ,如果连续 100 个回合的平均回合奖励大于 ,则认为这个任务被完成了。BespokeAgent 类对应的策略的平均回合奖励就在 左右。

测试智能体在 Gym 库中执行某个任务的性能时,学术界一般最关心 100 个回合的平均回合奖励。至于为什么是 100 个回合而不是其他回合数(比如 128 个回合),完全是习惯使然,没有什么特别的原因[6]。对于有些任务,还会指定一个参考的回合奖励值,当连续 100 个回合的奖励大于指定的值时,就认为这个任务被完成了。但是,并不是所有的任务都指定了这样的值。对于没有指定值的任务,就无所谓任务被完成了或者没有被完成。

我们对 Gym 库的用法进行总结:使用 env=gym.make(环境名)取出环境,使用 env.reset()初始化环境,使用 env.step(动作)执行一步环境,使用 env.render()显示环境,使用 env.close()关闭环境。Gym库 有对应的官方文档,读者可以搜索相关文档来学习 Gym库。

强化学习(reinforcement learning,RL):智能体可以在与复杂且不确定的环境进行交互时,尝试使所获得的奖励最大化的算法。

动作(action):环境接收到的智能体基于当前状态的输出。

状态(state):智能体从环境中获取的状态。

奖励(reward):智能体从环境中获取的反馈信号,这个信号指定了智能体在某一步采取了某个策略以后是否得到奖励,以及奖励的大小。

探索(exploration):在当前的情况下,继续尝试新的动作。其有可能得到更高的奖励,也有可能一无所有。

开发(exploitation):在当前的情况下,继续尝试已知的可以获得最大奖励的过程,即选择重复执行当前动作。

深度强化学习(deep reinforcement learning):不需要手动设计特征,仅需要输入状态就可以让系统直接输出动作的一个端到端(end-to-end)的强化学习方法。通常使用神经网络来拟合价值函数(value function)或者策略网络(policy network)。

全部可观测(full observability)、完全可观测(fully observed)和部分可观测(partially observed):当智能体的状态与环境的状态等价时,我们就称这个环境是全部可观测的;当智能体能够观察到环境的所有状态时,我们称这个环境是完全可观测的;一般智能体不能观察到环境的所有状态时,我们称这个环境是部分可观测的。

部分可观测马尔可夫决策过程(partially observable Markov decision process,POMDP):即马尔可夫决策过程的泛化。部分可观测马尔可夫决策过程依然具有马尔可夫性质,但是假设智能体无法感知环境的状态,只能知道部分观测值。

动作空间(action space)、离散动作空间(discrete action space)和连续动作空间(continuous action space):在给定的环境中,有效动作的集合被称为动作空间,智能体的动作数量有限的动作空间称为离散动作空间,反之,则被称为连续动作空间。

基于策略的(policy-based):智能体会制定一套动作策略,即确定在给定状态下需要采取何种动作,并根据这个策略进行操作。强化学习算法直接对策略进行优化,使制定的策略能够带来最大的奖励。

基于价值的(valued-based):智能体不需要制定显式的策略,它维护一个价值表格或者价值函数,并通过这个价值表格或价值函数来选取价值最大化的动作。

有模型(model-based)结构:智能体通过学习状态的转移来进行决策。

免模型(model-free)结构:智能体没有直接估计状态的转移,也没有得到环境的具体转移变量,它通过学习价值函数或者策略函数进行决策。

1-1 强化学习的基本结构是什么?

1-2 强化学习相对于监督学习为什么训练过程会更加困难?

1-3 强化学习的基本特征有哪些?

1-4 近几年强化学习发展迅速的原因有哪些?

1-5 状态和观测有什么关系?

1-6 一个强化学习智能体由什么组成?

1-7 根据强化学习智能体的不同,我们可以将其分为哪几类?

1-8 基于策略和基于价值的强化学习方法有什么区别?

1-9 有模型强化学习和免模型强化学习有什么区别?

1-10 如何通俗理解强化学习?

1-1 友善的面试官:看来你对于强化学习还是有一定了解的呀,那么可以用一句话谈一下你对于强化学习的认识吗?

1-2 友善的面试官:请问,你认为强化学习、监督学习和无监督学习三者有什么区别呢?

1-3 友善的面试官:根据你的理解,你认为强化学习的使用场景有哪些呢?

1-4 友善的面试官:请问强化学习中所谓的损失函数与深度学习中的损失函数有什么区别呢?

1-5 友善的面试官:你了解有模型和免模型吗?两者具体有什么区别呢?

[1] SUTTON R S, BARTO A G. Reinforcement learning: An introduction (second edition)[M]. London: The MIT Press, 2018.

[2] Andrej Karpathy的文章“Deep Reinforcement Learning: Pong from Pixels”.

[3] David Silver的课程“UCL Course on RL”.

[4] 诸葛越,江云胜,葫芦娃. 百面深度学习:算法工程师带你去面试[M]. 北京:人民邮电出版社,2020.

[5] 周志华. 机器学习[M]. 北京:清华大学出版社, 2016.

[6] 肖智清. 强化学习:原理与Python实现[M].北京:机械工业出版社, 2019.\end{thebibliography}


相关图书

ChatGPT原理与应用开发
ChatGPT原理与应用开发
动手学机器学习
动手学机器学习
基于机器学习的个性化推荐算法及应用
基于机器学习的个性化推荐算法及应用
机器学习与数据挖掘
机器学习与数据挖掘
机器学习公式详解 第2版
机器学习公式详解 第2版
自然语言处理迁移学习实战
自然语言处理迁移学习实战

相关文章

相关课程