深度强化学习实战

978-7-115-57636-1
作者: 亚历山大 · 扎伊(Alexander Zai)布兰登·布朗(Brandon Brown)
译者: 李晗
编辑: 吴晋瑜

图书目录:

详情

本书先介绍深度强化学习的基础知识及相关算法,然后给出多个实战项目,以期让读者可以根据环境的直接反馈对智能体加以调整和改进,提升运用深度强化学习技术解决实际问题的能力。 本书涵盖深度Q网络、策略梯度法、演员-评论家算法、进化算法、Dist-DQN、多智能体强化学习、可解释性强化学习等内容。本书给出的实战项目紧跟深度强化学习技术的发展趋势,且所有项目示例以Jupter Notebook样式给出,便于读者修改代码、观察结果并及时获取经验,能够带给读者交互式的学习体验。 本书适合有一定深度学习和机器学习基础并对强化学习感兴趣的读者阅读。

图书摘要

版权信息

书名:深度强化学习实战

ISBN:978-7-115-57636-1

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

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

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

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


版  权

著    [美] 亚历山大·扎伊(Alexander Zai)

     [美] 布兰登·布朗(Brandon Brown)

译    李 晗

审  校 武 强

责任编辑 吴晋瑜

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

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

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

读者服务热线:(010)81055410

反盗版热线:(010)81055315

读者服务:

微信扫码关注【异步社区】微信公众号,回复“e57636”获取本书配套资源以及异步社区15天VIP会员卡,近千本电子书免费畅读。

内 容 提 要

本书先介绍深度强化学习的基础知识及相关算法,然后给出多个实战项目,以期让读者可以根据环境的直接反馈对智能体加以调整和改进,提升运用深度强化学习技术解决实际问题的能力。

本书涵盖深度Q网络、策略梯度法、演员-评论家算法、进化算法、Dist-DQN、多智能体强化学习、可解释性强化学习等内容。本书给出的实战项目紧跟深度强化学习技术的发展趋势,且所有项目示例以Jupter Notebook样式给出,便于读者修改代码、观察结果并及时获取经验,能够带给读者交互式的学习体验。

本书适合有一定深度学习和机器学习基础并对强化学习感兴趣的读者阅读。

2015年,DeepMind公布了一种能以超越人类表现玩转“雅达利2600”游戏的算法,让深度强化学习走进大众视野。人工智能似乎终于取得了一些实质性进展,而我们也想参与其中。

我们两个都有软件工程背景,都对神经科学感兴趣,而且很长一段时间以来,我们一直对更广泛的人工智能领域怀有兴趣(事实上,我们当中的一个人在读高中之前就已经用C#编写了自己的第一个神经网络)。早期的经历并没有给我们带来什么“红利”,因为这些事大约发生在2012年深度学习革命之前,而彼时深度学习的表现并不那么可圈可点。在看到深度学习取得了惊人的成功之后,我们重新投身于深度学习以及深度强化学习令人兴奋和蓬勃发展的领域,并以各种方式更广泛地将机器学习融入我们的事业。

Alexander开始了他的机器学习工程师职业生涯,并在一些领域取得了成就,而我则在学术神经科学研究中开始使用机器学习。当深入研究强化学习时,我们不得不在数十本教科书和主要研究论文中挣扎,以解析高等数学和机器学习理论。然而,我们发现,从软件工程背景来看,深度强化学习的基础知识实际上相当简单。相关的数学知识可以很容易地转换成程序员们可以理解的语言。

于是,我们开始撰写博客文章,分享我们在机器学习领域学到的东西,以及在工作中接触到的项目。我们获得了大量积极的反馈,这促使我们萌生了合作撰写一本书的想法。我们认为,大多数资源要么过于简单,忽略了主题最值得关注的方面,要么是不具备深厚数学背景的人所无法理解的。对于本书,我们努力把它写成能让那些只有编程背景和掌握神经网络基础知识的人学懂的读物,而不是只有领域内专家才能读懂的学术作品。为此,我们采用了一些新颖的教学方法,希望能让你更快地理解书中的内容,让你从基础知识学起,最终能实现由行业研究团体(如DeepMind和OpenAI)和强大的学术实验室[如伯克利人工智能研究(BAIR)实验室和伦敦大学学院]发明的算法。

致  谢

撰写本书所耗费的时间超出了我们的预期,非常感谢Candace West和Susanna Kline编辑在本书出版过程中的各个阶段给予我们的帮助,让我们得以渐入佳境。在撰写本书时,有很多细节的动态是需要了解和及时获悉的,没有专业编辑人员的支持,我们的写作之路可能会遇到更多“拦路虎”。

还要感谢技术编辑Marc-Philippe Huget和Al Krinker,以及所有花时间阅读我们的手稿并为我们提供重要反馈的审稿人。特别感谢审稿人员Al Rahimi、Ariel Gamiño、Claudio Bernardo Rodriguez、David Krief、Brett Pennington、Ezra Joel Schroeder、George L. Gaines、Godfred Asamoah、Helmut Hauschild、Ike Okonkwo、Jonathan Wood、Kalyan Reddy、M.Edward (Ed) Borasky、Michael Haller、Nadia Noori、Satyajit Sarangi和Tobias Kaatz。还要感谢曼宁出版社每一位参与本书出版的工作人员,他们是开发编辑Karen Miller、评审编辑Ivan Martinović、项目编辑Deirdre Hiam、文字编辑Andy Carroll以及校对员Jason Everett。

在当今时代,很多图书都是通过各种在线服务自行出版的,我们最初也被这种选择所吸引。然而,在经历了整个出版过程之后,我们看到了专业编辑人员的巨大价值。特别感谢文字编辑Andy Carroll,他富有洞察力的反馈极大地提高了本书内容的可读性。

Alexander要着重感谢一下Jamie——他在本科低年级时,Jamie就建议他了解机器学习的相关知识。

Brandon特别感谢他的妻子Xinzhu,感谢她能包容自己熬夜写作和疏于陪伴家人,也感谢她为自己养育了两个可爱的孩子Isla和Avin。

前  言

目标读者

本书旨在带你从强化学习中最基础的概念出发,最终引导你实现新型的算法。书中各章会围绕一个项目来阐释相应的主题或概念。我们将所有项目设计成能在现代笔记本电脑上高效运行的程序,所以昂贵的GPU或云计算资源不是必需的(尽管有这些资源确实会让项目运行得更快)。

本书面向的读者为拥有编程背景(特别是有一定Python编程经验)的人,以及那些对神经网络(深度学习)至少有基本理解的人。所谓“基本理解”,是指即使你没有完全理解其中的原理至少也尝试过用Python实现一个简单的神经网络。虽然本书的宗旨是使用神经网络实现强化学习,但也会涉及很多有关深度学习的新事物——它们可以应用于强化学习以外的其他问题上。在投身深度强化学习领域之前,你不需要成为一名深度学习方面的专家。

本书内容

本书分为两部分,共11章。

第一部分介绍深度强化学习的基础知识。

第1章对深度学习、强化学习和深度强化学习进行宏观介绍。

第2章介绍强化学习的基本概念,这些概念将在本书后续章节中反复出现。在本章中,我们还将实现第一个真正的强化学习算法。

第3章介绍深度Q网络,它是深度强化学习中两类重要算法之一。该算法是2015年DeepMind用于在雅达利2600游戏中超越人类玩家的算法。

第4章描述另一类深度强化学习算法——策略梯度法。我们将用它训练算法来玩一个简单游戏。

第5章展示如何将第3章的深度Q-learning和第4章的策略梯度法加以组合,以得到一个名为“演员-评论家”的组合算法。

第二部分在第一部分的基础上,介绍近年来深度强化学习方面取得的重大进展。

第6章展示如何实现进化算法。这种算法使用生物进化原理来训练神经网络。

第7章描述一种通过融合概率概念来显著提高深度Q-learning性能的方法。

第8章介绍一种让强化学习算法在没有任何外部线索的情况下探索环境的好奇心方法。

第9章展示如何将在训练单个智能体的强化学习算法时学到的知识扩展到具有多个交互智能体的系统中。

第10章描述如何通过使用注意力机制使深度强化学习算法更具可解释性且更高效。

第11章通过讨论深度强化学习中令人兴奋的领域(本书未能涵盖,但你可能感兴趣)来对本书进行总结。

对于第一部分的章节,读者应该按顺序阅读,因为每一章都是以前一章的概念为基础的。对于第二部分的章节,读者可酌情按照适合自己的顺序阅读,但我们仍然建议读者按顺序阅读。

关于代码

我们已经在本书正文中给出了运行项目所必需的代码。一般来说,我们以内嵌代码形式给出较短的代码段,而使用带有独立编号的代码清单给出较长的代码段。

截至结稿时,我们确信书中所有代码能够正常运行,但长远来看并不能保证代码一直有效(尤其是读者阅读已出版图书时),因为深度学习领域及其工具库仍在快速发展。此外,代码也被精简到保证项目工作前提下的最少必要代码,因此强烈推荐读者使用本书GitHub仓库(http://mng.bz/JzKp)中的代码来学习书中的项目。我们打算持续更新GitHub上的代码,包括其他的注释和用以生成书中很多图形的代码。因此,读者最好同时阅读本书和GitHub仓库中对应的Jupyter Notebook格式的代码。

我们相信本书将帮助你理解深度强化学习的概念,而不仅仅是如何用Python编写代码。即便在你学完本书后Python语言因某种原因而不能起作用,你也能够通过其他语言或框架来实现相关算法,因为你已经理解了它们的基本原理。

作者简介

Alexander Zai曾担任Codesmith(一个沉浸式的编码训练营)首席技术官和技术顾问、Uber软件工程师、Banjo和亚马逊AI机器学习工程师,他也是开源深度学习框架Apache MXNet的贡献者。此外,他还是两家公司的联合创始人,其中一家曾是Y-combinator的参与者。

Brandon Brown从很小的时候就开始编程,大学期间做过兼职软件工程师,但最终选择投身医疗行业(在此期间,他在医疗保健科技领域担任软件工程师)。受深度强化学习的启发,他近期专注于计算精神病学的研究。

封面插画简介

本书封面上的人物插画名为“伊斯特里亚女子”或“来自伊斯特里亚的女子”。该插画选自Jacques Grasset de Saint-Sauveur(1757—1810)于1797年在法国出版的图书Costumes de Différents Pays。此书收集了各国服饰图,书中每幅插画都是手工精心绘制和着色的。Jacques Grasset de Saint-Sauveur的藏品种类丰富,生动地再现了200多年前世界上各个地区间的文化差异和地域差异。人们说着不同的语言或方言。无论在城市还是乡村,很容易通过人们的衣着来辨别他们来自哪里,以及各自的职业和社会地位。

后来,人们的穿着发生了变化,曾经丰富的区域多样性也日渐式微。现在,就连不同大陆的居民都难以区分,更不必说不同的国家、地区或城镇了。或许我们已经将文化多样性转变为更加多样化的个人生活,当然还有更加多样和快节奏的科技生活。

在这个计算机图书日渐趋同的时代,借着将200多年前地区生活的丰富多样性重新带回当下的Jacques Grasset de Saint-Sauveur的插画,曼宁出版社通过将其作为图书封面来颂扬计算机行业的创新性和主动性。

资源与支持

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

您还可以扫码右侧二维码, 关注【异步社区】微信公众号,回复“e57636”直接获取,同时可以获得异步社区15天VIP会员卡,近千本电子书免费畅读。

提交勘误

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

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

扫码关注本书

扫描下方二维码,您将会在异步社区微信服务号中看到本书信息及相关的服务提示。

与我们联系

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

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

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

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

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

关于异步社区和异步图书

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

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

异步社区

微信服务号

第一部分 基础篇

第一部分由5章组成,介绍深度强化学习的基本知识。学完这部分内容,你可以按照任意顺序学习第二部分中的各章内容。

我们将在第1章对深度强化学习进行宏观介绍,阐释其主要概念及使用方法。在第2章中,我们将创建一些用以阐释强化学习基本思想的实际项目。在第3章中,我们将实现一个深度Q网络 ——与DeepMind以超越人类的水平玩雅达利游戏所用的相同类型的算法。

我们将在第4章和第5章实现常见的强化学习算法(策略梯度法和演员-评论家算法),并与深度Q网络进行对比,总结这些方法的优缺点。

第1章 什么是强化学习

本章主要内容

机器学习知识回顾。

强化学习子领域。

强化学习基本框架。

未来的计算机语言将更关注目标,而不太关注由程序员指定的过程。

——马文·明斯基(Marvin Minksy),1970年ACM图灵讲座

如果你正在阅读本书,那么应该比较了解深度神经网络是如何应用于图像分类或预测等场景的(若非如此,请参考附录A.3节)。深度强化学习(Deep Reinforcement Learning,DRL)是机器学习的一个子领域,它将深度学习模型(神经网络)应用于强化学习(Reinforcement Learning,RL)任务(见1.2节)中。在图像分类任务中,我们有大量对应着一组离散类别的图像,如不同种类动物的图像,我们希望运用机器学习模型来解析图像,并对图像中的动物进行分类,如图1.1所示。

图1.1 图像分类器是一个函数或学习算法,它接收一幅图像并返回一个类别标签,将图像分类到数量有限的可能类别中

1.1 深度强化学习中的“深度”

深度学习模型只是众多用于图像分类的机器学习模型之一。通常来说,我们只需要某种类型的函数,用于接收一幅图像并返回一个类别标签(在前文提到的示例中,标签说明了图像中描述了哪种类别的动物)。通常该函数拥有固定的可调参数集,我们把这类深度学习模型称为参数模型(parametric model)。首先,我们将参数模型的参数初始化为随机值,这将为输入图像生成随机的类别标签;然后,利用训练过程对参数进行调整,使该函数在正确分类图像的任务上表现得越来越好。在某种程度上,这些参数将处于一组最优值集合,这意味着模型无法在分类任务上变得更优。参数模型也可用于回归(regression),我们试着用模型拟合一组数据,以对未知数据进行预测(见图1.2)。如果模型有更多参数或更好的内部架构,那么更复杂的方法可能取得更好的结果。

图1.2 f(x) = mx + b这样的线性函数就算得上最简单的机器学习模型,其中参数为m(斜率)和b(截距)。由于它有可调参数,因此称为参数函数或模型。如果已有一些二维数据,那么可以从一个随机初始化的参数集开始,例如[m = 3.4, b = 0.3],然后利用训练算法优化参数来拟合训练数据。在本例中,最优的参数集接近于[m = 2, b = 1]

深度神经网络之所以如此流行,是因为在很多情况下,它们都是特定任务下(例如图像分类)准确率最高的参数化机器学习模型,这很大程度上归因于它们的数据表示方式。深度神经网络包含很多层(故谓之“深”),这会引导模型学习输入数据的分层表示。这种分层表示是一种组合形式,这意味着复杂的数据可以表示为更基本的组件组合,而这些组件可以进一步分解成更简单的组件,以此类推,直至得到原子单元。

人类语言是组合式的(见图1.3),例如,书由章节组成,章节由段落组成,段落由句子组成,以此类推,直至分解到单个单词,即含义的最小单元。然而,每个单独的层面都会传达含义,也就是说,整本书会传达含义,各个段落会传达更小的含义。同样,深度神经网络也可以学习数据的组合表示,例如,它可以将一幅图像表示为原始轮廓和纹理的组合,而这两者是由基本形状组成的,以此类推,直至得到完整、复杂的图像。深度学习之所以如此强大,很大程度上依赖于它利用组合表示法处理复杂问题的能力。

图1.3 像“John hit the ball”这样的句子可以分解成越来越简单的部分,直至分解到单个单词。在本例中,我们可以将句子(以S表示)分解成一个主语名词(N)和一个动词短语(VP)。然后,VP可以进一步分解为一个动词(V)“hit”和一个名词短语(NP)。最后,NP可以分解成单独的单词“the”和“ball”

1.2 强化学习

正确区分问题及其解决方案非常重要。换句话说,正确区分我们想要解决的问题和我们设计用来解决这些问题的算法很重要。深度学习算法能够应用于很多类型的问题和任务。图像分类和预测任务是深度学习的常见应用,鉴于图像的复杂性,深度学习之前的自动图像处理能力非常有限。但有很多其他类型的任务希望实现自动化,例如驾驶汽车或平衡股票与其他资产的投资组合。驾驶汽车涉及一些图像处理任务,但更重要的是算法需要学习如何行动,而不仅是分类或预测。这类必须做出决策或采取某些动作的问题统称为控制任务(control task)。

强化学习是表示和解决控制任务的通用框架,在该框架中,我们可以自由选择应用于特定控制任务的算法(见图1.4)。深度学习算法是很自然的选择,因为它能够有效地处理复杂数据,这就是我们将关注深度强化学习的原因,但在本书中你将更多地学习用于控制任务的通用强化框架(见图1.5)。然后,我们将带你学习如何设计合适的深度学习模型以适应这些框架,进而解决控制任务,这意味着你将学到很多关于强化学习的知识,还可能学到一些关于深度学习的新知识。

图1.4 与图像分类器不同,强化学习算法需要与数据动态交互。它不断消耗数据,并决定要采取什么动作,而这些动作将改变反馈给它的后续数据。强化学习算法可以将显示在电子游戏屏幕上的图像作为输入数据,然后决定使用游戏控制器实施何种动作(例如,玩家移动或发射武器),进而使游戏得以更新

图1.5 深度学习是机器学习的一个子领域,可以为强化学习解决控制任务提供支持

从图像处理到控制任务领域的另一个复杂之处是新增的时间因素。在图像处理中,我们通常在固定的图像数据集上训练深度学习算法。经过足够的训练,我们通常会得到一个可应用于某些新的、未知图像的高性能算法。我们可以将数据集看作一个数据“空间”,在这个抽象空间中,相似的图像靠得更近,而不相似的图像离得更远(见图1.6)。

图1.6 单词在二维空间中的图形化描述将每个单词显示为一个点(颜色各异,实际显示为彩色非黑白)。相似的单词聚在一起,不相似的单词则离得较远。数据很自然地存在于某种“空间”中,其中相似的数据靠得更近。标签A、B、C和D表示具有某种语义的特定单词簇

在控制任务中,我们同样有一个要处理的数据空间,但每个数据块也有一个时间维度——数据存在于时间和空间中,这意味着算法在某一时刻的决定会受前一时刻所发生事情的影响,而对于普通的图像分类和类似的问题来说,情况则并非如此。时间的流逝使得训练任务动态化——训练算法的数据集不是固定的,而是会根据算法做出的决策而变化的。

像图像分类这样的普通任务属于监督学习(supervised learning)的范畴,因为我们都是通过所给出的正确答案来训练,使之正确地分类图像。这类算法会先采用随机猜测方法,然后反复修正,直至学习到对应正确标签的图像特征。这就要求我们事先知道正确答案是什么,但这可能比较困难。如果你想训练一个深度学习算法,以正确分类不同种类植物的图像,就不得不煞费苦心地获取成千上万幅这类图像,手动关联图像与类别标签,并以机器学习算法可以操作的格式准备数据(通常为某种类型的矩阵)。

与此相反,在强化学习中,我们并不知道在每一步中正确的做法是什么,而只需知道最终目标是什么以及要避免做什么。如何教狗玩游戏?你得给它好吃的。类似地,正如其名称所表示的,通过激励强化学习算法达到某种高水平的目标,并抑制它做你不想让它做的事情,以此来对它进行训练。在无人驾驶汽车的例子中,这种高水平的目标也许是“在不发生碰撞的情况下从点A到达点B”。如果它完成了任务,我们就予以奖励;如果它失败了,我们就予以惩罚。当然,我们将在模拟器中完成这一切,而不是在真正的道路上,因此我们可以让它反复尝试,直到它学会并获得奖励。

小贴士

在自然语言中,“奖励”总是意味着正向或积极的东西,而在强化学习术语中,它是一个需要优化的数字量。因此,奖励可以是正向的,也可以是负向的。如果它是正向的,就与自然语言中的含义是一致的;如果它是负向的,就对应着自然语言中的“惩罚”一词。

强化学习算法只有一个目标,即最大化其奖励。为了做到这一点,强化学习算法必须学习更多基本技能来实现主要目标。当算法选择做我们不想让它做的事情时,我们也可以提供负奖励,因为它在尝试最大化奖励,所以会学习避免导致负奖励的动作,这就是它被称为“强化学习”的原因——我们使用奖励信号来正向/负向地强化某些动作(见图1.7)。这与动物的学习方式非常相似:它们学习做那些“让自己感觉舒适或满足”的事情,并避免做那些“导致痛苦”的事情。

图1.7 在强化学习框架中,某种学习算法决定对控制任务(例如控制机器人吸尘器)采取何种动作,该动作导致正奖励或负奖励,而该奖励将正向或负向强化该动作,从而实现训练学习算法的目的

1.3 动态规划与蒙特卡洛

现在我们知道,可以通过为任务的完成分配高额奖励(正向强化)和为不希望它做的事情分配负奖励来训练算法,使之完成一些高级任务。具体来说,假设高级目标是训练机器人(吸尘器)从室内某个房间移动到厨房里的基座上。机器人可以做出4种动作:左移、右移、前移和旋转。在每个时间点,机器人需要决定采取这4种动作中的哪一种。如果到达基座,它将获得+100的正奖励;如果在途中撞到任何东西,它将获得−10的负奖励。假设机器人知道房子的完整三维地图以及基座的精确位置,但它还不知道采取怎样的动作序列才能到达基座。

解决上述问题的一种方法是动态规划(Dynamic Programming,DP),这种方法最早由Richard Bellman于1957年提出。动态规划将问题不断分解成更小的子问题,直到分解成不需要进一步信息就可以解决的简单子问题,以此来解决复杂的高级问题。从这个角度来讲,动态规划或许更应该称为目标分解(goal decomposition)。

与其让机器人想出一长串能够使其到达基座的原始动作,倒不如让它先将问题分解为“待在这个房间”和“离开这个房间”。因为有房子的完整三维地图,所以它知道需要离开这个房间——基座位于厨房内。然而,它还不知道离开这个房间的动作序列,所以进一步将问题分解为“移向房门”或“远离房门”。房门距离基座更近,而且可以从房门到达基座,因此机器人知道它需要移向房门,但是它同样不知道移向房门的原始动作序列。最后,它需要决定是左移、右移、前移还是旋转。它知道房门在前方,因此会向前移动。如果为了到达基座必须做更多的目标分解,它就会不断重复这一过程,直到离开这个房间。

这就是动态规划的本质。它是一种解决特定类型问题的通用方法,这类问题的特点是可以将问题不断分解成子问题以及子问题的子问题。动态规划已经应用于很多领域,包括生物信息学、经济学和计算机科学。

为了使用Bellman的动态规划,我们必须能够将问题分解成自己知道如何解决的子问题。但即便这种看似无伤大雅的假设,在现实世界中也很难实现。如何将无人驾驶汽车实现高级目标——“在不发生碰撞的情况下从点A到达点B”的问题分解成较小的无碰撞子问题?孩子是否通过先解决更容易的走路子问题学习走路?在强化学习中,我们经常会遇到可能包含一些随机性元素的微妙情况,而且不能像Bellman所描述的那样应用动态规划。事实上,我们可以将动态规划看作解决问题的极端做法,而另一种极端做法是随机试错。

还有一种方式是,我们在某些情况下掌握了环境的最多知识,而在另一些情况下掌握了环境的最少知识,这就需要在每种情况下采用不同的策略。如果你需要在自己家里上厕所,那么当然很清楚(至少是无意识地)从任何起始位置通过什么样的动作序列可以到达厕所(动态规划式的)。这是因为你非常了解你的房子,在你的脑海中有一个近乎完美的房子模型。但是,如果你到从未去过的房子里参加聚会,你可能得四下探查一番才能找到厕所(反复试错),因为你没有那座房子的一个好的“模型”。

试错策略通常属于蒙特卡洛法的范畴。蒙特卡洛法本质上是对环境进行随机抽样。在很多现实世界的问题中,我们至少对有关环境的运行原理有一些了解,所以最终会采用一种结合试错和利用已知环境信息的混合策略来直接解决简单的子问题。

有关混合策略的一个“愚蠢”示例是,如果我们蒙上你的眼睛,让你站在房子里的一个未知位置,并告知你需要通过“扔石子,听声辨位”这种方法找到厕所,那么你可能会先将这个高级目标(找到厕所)分解成一个更容易实现的子目标:弄清楚你此刻位于哪个房间。为了达到这个子目标,你可能会随机朝一些方向扔石子,借此判断房间的大小——这也许会给你提供足够的信息来推断当前处于哪个房间,例如卧室。然后,你需要转向另一个子目标:导航到门口。这样你就可以移至走廊。然后你再次开始扔石子,但由于你记得上次随机扔石子的结果,因此可以将目标对准自己不太确定的区域。你将重复上述过程,直至找到厕所。在本示例中,你会同时用到动态规划的目标分解和蒙特卡洛法的随机抽样。

1.4 强化学习框架

Richard Bellman将动态规划作为解决某类控制或决策问题的通用方法,但动态规划只是强化学习一系列方法中的极端之举。可以说,Bellman更重要的贡献是推动了强化学习框架的开发。强化学习框架本质上是一组核心术语和概念(每个强化学习问题都可以用这些术语和概念来表述),它不仅提供了一种与其他工程师和研究人员沟通的标准化语言,还迫使我们以一种类似动态规划问题分解的方式来确定问题。这样我们就可以迭代地优化局部子问题,并朝着实现全局高级目标前进。

为了具体说明这个框架,我们考虑构建一个强化学习算法,使之学会尽量减少大数据中心的能源使用。计算机需要持续降温才能正常运行,因此大数据中心可能会因冷却系统而产生巨额成本。一种“天真”的方法是一直保持空调运转,保证所有服务器不出现过热情况,这不需要用到任何复杂的机器学习。但是,这种方法效率很低,其实我们可以做得更好,因为不太可能出现所有服务器在同一时间处于过热状态的情况,而且大数据中心的使用也不大可能一直处于相同水平。如果你把降温措施用在最重要的地方和时间,就可以用更少的钱获得同样的效果。

在强化学习框架中,首先要做的是定义总体目标。本示例的总体目标是在保证大数据中心内的所有服务器不超过温度阈值的情况下,尽量减少花在降温上的费用。虽然这看起来是两个目标,但我们可以将它们合并成一个新的复合目标函数(objective function)。这个函数返回一个误差值,可以表示在给定当前成本和服务器温度数据的情况下,我们在满足这两个目标方面的偏离程度。目标函数返回的实际数值并不重要,我们只想让它尽可能小。因此,我们需要通过强化学习算法来最小化该目标(误差)函数在给定输入数据下的返回值,其中输入数据肯定包括运营成本和温度数据,但也可能包括其他有助于算法预测数据中心内服务器使用情况的有用上下文信息。

输入数据由环境生成。一般来说,强化学习或控制任务的环境是产生与实现目标相关数据的任意动态过程。虽然我们将“环境”用作一个技术术语,但它与日常用法并没有太大不同。就一个非常先进的强化学习算法实例而言,你总是处于某些环境中,你的眼睛和耳朵不断地“消费”着环境产生的信息,这样你才能实现每天的目标。环境是一个动态过程(一个时间函数),所以可能会产生不同大小和类型的连续数据流。为了使事情对算法友好,我们需要接收这些环境数据并将其封装成离散(互不关联)的包(我们称之为状态),然后在每个离散的时间步上将其传递给算法。状态反映了我们在某个特定时间下对环境的认识,就像数码相机在某一时刻捕捉到的某个场景的离散快照(并生成格式一致的图像)。

到目前为止,我们定义了一个目标函数(通过优化温度来最小化成本),它是一个环境(大数据中心以及任何相关过程)状态(当前成本、当前温度数据)的函数。模型的最后一部分是强化学习算法本身,它可以是任意一种参数化算法,能够从数据中学习并通过修改其参数来最小化或最大化目标函数。强化学习不需要是深度学习算法,它是一个独立的领域,与任何特定的学习算法无关。

如前所述,强化学习(或控制任务)和普通的监督学习之间的一个关键区别是:在控制任务中,强化学习算法需要做出决策和采取动作,这些动作会影响将来发生的事情。在强化学习框架中,采取动作是一个关键词,它的含义或多或少是你所期望的。不过,所采取的每个动作都是分析当前环境状态和尝试基于该信息做出最佳决策的结果。

强化学习框架的最后一个概念是,采取每个动作后,算法会得到一个奖励(reward)。奖励是局部信号,用于表示学习算法在实现总体目标方面的表现如何。虽然我们将其称为“奖励”,但它可以是正向信号(做得好,继续保持),也可以负向信号(不要那样做)。

当学习算法自我更新,希望在下一个环境状态中表现得更好时,奖励信号是唯一的“提示牌”。在大数据中心的例子中,只要算法的动作减小了误差,我们就可以给予算法+10(任意值)的奖励。更合理地说,我们可以根据减小误差的程度给予相应的奖励。如果算法增大了误差,我们就会给它负奖励。

最后,我们为该学习算法取个好听的名字,称之为智能体(agent)。在任何强化学习问题中,智能体指的就是采取动作或做出决策的学习算法。综上所述,强化学习算法的标准框架如图1.8所示。

图1.8 强化学习算法的标准框架。智能体在环境中采取一个动作,例如移动一枚棋子,然后更新环境状态。对于采取的每个动作,它都会获得一个奖励(赢得游戏时奖励为+1,输掉游戏时奖励为−1,其他情况时奖励为0)。强化学习算法以最大化长期奖励为目标,不断重复该过程,直至学会环境的工作原理

在大数据中心这个示例中,我们希望智能体学会如何降低成本。除非我们能向它提供环境的完整知识,否则它将不得不采取一定程度的试错法。幸运的话,智能体可能会学习得足够好,并可以用在不同的环境中,而不仅仅是它最初训练的环境。智能体是学习者,所以我们会用某种学习算法实现它。又因为这是一本关于深度强化学习的书,所以我们会用深度学习(deep learning)算法(也称为深度神经网络,见图1.9)来实现智能体。但请记住,强化学习更多的是关于问题的类型和解决方案,而非关于任何特定的学习算法,所以你当然可以使用深度神经网络的其他替代方法。事实上,在第3章中,我们会先用一个非常简单的非神经网络方法,然后在该章结束时用一个神经网络替代它。

图1.9 智能体(在本书中实现为深度神经网络)接收输入数据(某个时间点的环境状态),然后评估数据以采取动作。本图展示的过程比实际的要简单一些,但足以说明其本质

智能体的唯一目标是使其长期期望奖励最大化。它会重复这个循环:处理状态信息,决定采取什么动作,查看是否得到奖励,观察新状态,采取另一动作,等等。如果我们正确设置了这些内容,那么智能体最终将学会理解其环境,并在每一步做出可靠的优秀决策。这种通用机制可应用于自动驾驶汽车、聊天机器人、工业机器人、自动股票交易、医疗保健以及其他领域。我们将在1.5节及其他章节探索其中的一些应用。

在本书中,我们会用大量的篇幅来阐述如何在标准模型中构造问题,以及如何实现足够强大的学习算法(智能体)以解决难题。我们无须构造环境,而会利用现有环境(例如游戏引擎或其他API)。例如,OpenAI发布了一个Python Gym库,它提供了大量可与学习算法交互的环境和直接接口。图1.10中左侧的代码显示了设置和使用其中一种环境是多么简单——加载一款赛车游戏仅需要5行代码。

import gym
env = gym.make('CarRacing-v0')
env.reset()
env.step(action)
env.render()

图1.10 OpenAI发布的Python Gym库提供了许多便于和学习算法进行交互的环境和接口。我们仅用5行代码就可以加载一款赛车游戏

1.5 强化学习可以做什么

在本章开头,我们回顾了普通监督机器学习算法的基本知识,例如图像分类器。尽管最近在监督学习上取得的成果显著且很有用,但监督学习无法带我们走向通用人工智能(Artificial General Intelligence,AGI)。我们最终寻求的是通用的学习算法,希望它能够以最小甚至无须监督的代价应用于多种问题,并且可以跨领域应用。数据丰富的大型企业可以从监督方法中获益,但规模较小的公司和组织可能缺乏利用机器学习强大功能的资源。通用的学习算法将为每个人创造公平的竞争环境,而强化学习是目前这类算法中最值得期待的方法。

强化学习的研究和应用仍处于有待成熟阶段,但近年来有了许多令人兴奋的发展。谷歌的DeepMind研究团队展示了一些令人印象深刻的成果,引起了国际社会的关注。第一次在2013年,当时他们展示的算法能以超越人类的水平玩一系列雅达利游戏。之前创建智能体玩这些游戏的尝试,需要通过微调底层算法来理解具体的游戏规则,这通常称为特征工程(feature engineering)。这些特征工程方法能够很好地作用于特定的游戏,但无法将任何知识或技能转用到新的游戏或领域。DeepMind的深度Q网络(Deep Q-Network,DQN)算法已经足够健壮,不需要任何特定于游戏的调整就能正常工作于7款游戏上(其中一些见图1.11)。DQN算法只用屏幕上的原始像素作为输入,且仅被告知要最大化分数,但它学会了如何超越人类的专业水平。

图1.11 DeepMind的DQN算法成功学会了玩7款雅达利游戏,而仅仅将原始像素作为输入,并将玩家的分数作为最大化的目标。之前的算法,如IBM的深蓝(Deep Blue),则需要经过微调才能玩特定的游戏

近年来,DeepMind的AlphaGo和AlphaZero算法在围棋比赛中击败了世界最佳棋手。专家们认为,人工智能至少在未来10年内还无法下围棋,因为围棋具有算法通常处理不好的特征。人工智能玩家并不知道在特定轮次中什么才是最佳走法,并且只有在游戏结束时才能收到有关自己动作的反馈。很多高水平棋手认为自己是艺术家而不是工于算计的谋略家,他们认为获胜的走法应该是漂亮或优雅的。由于存在多达1万余个合规的棋盘位置,因此暴力算法(IBM的深蓝用在国际象棋中的算法)并不可行。AlphaGo之所以能做到这一点,很大程度上是因为它玩过数百万次模拟的围棋游戏,并学习了哪些动作可以最大限度地获得玩好游戏的奖励。与玩雅达利游戏的情况类似,AlphaGo只能获得与人类玩家相同的信息,即棋子在棋盘上的位置。

虽然能够以超越人类水平玩游戏的算法确实很了不起,但是强化学习的前景和潜力远不止于创造更好的游戏机器人。DeepMind创建了一个模型,将谷歌大数据中心为服务器降温的成本降低了40%,即我们在本章前面部分中探索的例子。自动驾驶汽车使用强化学习来学习哪些动作(加速、转弯、刹车、发送信号)可以让乘客准时到达目的地,并学习如何避免事故。研究人员也在训练机器人,使之能够完成某些任务,例如学习奔跑,而无须明确编程复杂的运动技能。

其中的很多例子存在高风险,例如自动驾驶汽车,所以我们不能让机器通过反复试错来学习如何开车。幸运的是,逐渐有越来越多的让学习机器在无害的模拟器中放宽试错的成功案例,一旦案例在模拟器中得以顺利实现,我们就可以让它们在现实世界中试用真正的硬件。我们将在本书中探讨的一个例子是算法交易。在所有股票交易中,有相当一部分是由计算机执行的,很少有人工操作员的输入。这些“算法交易员”大多被管理着数十亿美元资产的大型对冲基金管理公司所操控。然而,在过去几年里,我们看到越来越多的个体交易者对构建交易算法感兴趣。实际上,Quantopian提供了一个平台,让个体交易者可以使用Python编写交易算法,并在一个安全的模拟环境中进行测试。如果算法表现良好,就可以用于真正的股票交易。很多交易者通过简单的启发式和基于规则的算法取得了相对的成功。股票市场是动态变化且不可预测的,而持续学习的强化学习算法具有实时适应不断变化的市场条件的优势。

在本书开头,我们要解决的一个实际问题是广告投放。很多互联网企业从广告中获得大量收入,而广告收入通常与其获得的点击量有关,因此他们势必会将广告投放在能够最大化点击量的地方。要做到这一点,有效的方法就是利用用户的相关信息来展示最合适的广告。我们通常不知道用户的哪些特征与正确的广告选择有关,但是可以利用强化学习技术取得一些进展。如果我们给强化学习算法提供一些可能有用的用户信息(我们称之为环境或环境状态),并告诉它需要让广告点击量最大化,那么它将学习如何将输入数据与目标进行关联,最终学会对于特定用户来说哪些广告将产生最大点击量。

1.6 为什么是深度强化学习

我们给出了使用强化学习的充分理由,但为什么是深度强化学习呢?强化学习早在深度学习兴起之前就已经存在。事实上,最早的一些方法(出于学习目的,我们将研究这些方法)只是将经验存储在查找表中(例如Python字典),并在算法的每次迭代中更新该表。其思想是让智能体在环境中活动,查看发生了什么,并将发生的情况(经验)存储到某种数据库中。经过一段时间,你可以回顾这个知识数据库,观察哪些经验有用、哪些经验没用。这里并没有用到神经网络或其他复杂的算法。

对于非常简单的环境,这种方法确实非常有效。例如,在井字棋(Tic-Tac-Toe)中有255168个有效的棋盘位置。查找表(又称为内存表)会有非常多的条目,这些条目将每个状态映射到特定的操作(见图1.12)和观察到的奖励(未描述)。在训练过程中,算法能够学习哪种移动会使位置更有利,并在内存表中更新该条目。

图1.12 3个条目的井字棋动作查找表,其中“玩家”(算法)的棋子用“×”表示。当玩家获得一个棋盘位置时,查找表将决定下一步的行动。游戏中每个可能的状态都有一个条目

一旦环境变得更加复杂,使用内存表将变得比较棘手。例如,电子游戏的每个屏幕配置都可以视为不同的状态(见图1.13)。想象一下,存储电子游戏屏幕上显示的有效像素值的每个可能组合将会多么棘手!在玩雅达利游戏时,DeepMind的DQN算法在每一步都会接收4幅84像素×84像素的灰度图像,这将导致25628224种不同的游戏状态(每个像素具有256种不同的灰度,4×84×84= 28224个像素)。这个数字比可观测宇宙中原子的数量要大得多,计算机内存肯定装不下,而且这还是在原来的210像素×160像素的彩色图像缩减尺寸之后的情况下。

图1.13 3帧《打砖块》游戏的图像,其中球的位置在每一帧中略有不同。如果你使用查找表,那么这等同于在表中存储3个不同的条目。此时使用查找表将行不通,因为有太多的游戏状态需要存储

存储每个可能的状态是不现实的,但我们可以试着对这种可能性加以限制。在《打砖块》游戏中,你控制着屏幕底部的一个可以左右移动的桨,使球偏转方向并尽可能多地打破屏幕顶部的块。在这个示例中,我们可以定义约束——只查看球返回桨时的状态,因为等待球从屏幕顶部回落时,我们的动作并不重要。我们也可以提供自己的特征——仅提供球、桨以及剩余砖块的位置,而非提供原始图像。然而,这些方法要求程序员理解游戏的底层策略,且无法应用到其他环境中。

这就轮到深度学习登场了。深度学习算法能够通过学习对具体的像素分布细节进行抽象,并学习状态的重要特征。由于深度学习算法具有有限数量的参数,因此我们可以用它将任何可能的状态压缩成我们能够有效处理的任何量,然后用这种新的表征来做出决策。因此,使用神经网络,雅达利DQN只有1792个参数(包含16个8×8的过滤器、32个4×4的过滤器和一个有256个节点的全连接隐藏层的卷积神经网络),而不需要存储整个状态空间的25628224个键值对。

在《打砖块》游戏的例子中,深度神经网络本身可能会学习与在查找表方法中程序员必须手动处理的相同的高级特征。也就是说,它可以学习如何“看”球、桨和块,并识别球的方向。鉴于它只需要用到原始像素数据,其效果还是相当惊人的。更有趣的是,学习到的高级特征有可能迁移到其他游戏或环境中。

深度学习是让最近所有强化学习“梦想照进现实”的秘诀。截至本书成稿,其他算法尚未展示出如深度神经网络般强大的表征能力、高效性和灵活性。此外,神经网络实际上是相当简单的!

1.7 教学工具:线图

虽然强化学习的基本概念已经确立了几十年,但该领域的发展非常迅速,因此任何特定的新结果可能很快就会过时。这就是为什么本书专注于教学技能,而不是很快就会过时的细节内容。本书的确提到了该领域的一些最新进展,而这些进展在不久的将来肯定会被取代,但我们这样做只是为了帮助你掌握新技能,而并非因为这些特定的主题是经过时间考验的技术。我们相信,即使所举的一些例子过时了,但你所学到的技能也不会过时,这会为你后续解决强化学习问题奠定基础。

此外,强化学习是一个需要学习很多知识的庞大领域,因此我们不可能在本书中涵盖全部内容。我们的宗旨是让你掌握强化学习的基础知识,以及了解该领域的一些激动人心的新发展,而不是提供详尽的强化学习参考资料或全面的课程。我们希望你能够消化并吸收所学到的知识,轻松跟上强化学习中在诸多领域的发展步伐。在第11章中,我们还会给出相关领域的学习路线图,以供你在学完本书后参考。

本书注重教学且力求严谨。强化学习和深度学习从根本上来说都与数学密不可分,如果你去读这些领域的论文,那么可能会遇到不熟悉的数学符号和公式。数学能够让我们对事物的本质以及事物之间的联系做出精确的陈述,并就事物如何运作以及为什么运作给出了严谨的解释。我们可以在不使用任何数学知识而仅使用Python的情况下教强化学习,但这种方法有碍你理解未来的进展。

所以,我们认为数学很重要。但正如编辑所指出的那样,在出版界有一个常见的说法,“书中每出现一个公式,读者就减少一半”,这可能确实有几分道理。除非你是整天读、写数学公式的专业数学家,否则在解复杂的数学方程时,必然要费一番功夫。我们想要呈现对深度强化学习严谨的阐述以给读者带来一流的理解,同时又想惠及尽可能多的人,为此采用了自认为是本书一个显著特点的工具。事实证明,即使是专业的数学家,也可能对传统的包含大量符号的数学公式感到厌倦。在高等数学一个名为范畴论(category theory)的特定分支中,数学家们已经开发出一种名为线图(string diagram)的图形语言。线图看起来非常像流程图和电路图,相当直观,但像主要基于希腊和拉丁字母的传统数学符号一样严谨和精确。

图1.14所示的是某种线图的一个简单例子,它从宏观上描述了一个包含两层神经网络的线图。机器学习(特别是深度学习)涉及大量的矩阵和向量操作,而线图尤其适合图形化描述这种类型的操作。线图也非常适合描述复杂过程,因为我们可以在不同的抽象层次上描述过程。图1.14的上半部分展示了表示神经网络两个网络层的两个矩形,但我们可以“放大”(深入盒子内部)第一层,以更详细地查看其内部操作,如图1.14下半部分所示。

图1.14 包含两层神经网络的线图。从左向右看,上面的线图表示一个神经网络,它接收一个n维的输入向量,并乘以一个n×m的矩阵,然后返回一个m维的向量,最后将非线性激活函数Sigmoid作用于m维向量的每个元素。接下来,新向量以同样的步骤通过第二层,并产生神经网络的最终输出,即一个k维向量

在整本书中,我们将频繁地用线图来阐释从复杂数学方程到深度神经网络架构的所有内容。我们将在第2章描述这种“图形语法”,并在本书其他章节继续完善和创建它。在某些情况下,这种“图形语法”对于我们想要解释的内容来说有点大材小用了,因此我们将采用平铺直叙的表述以及给出Python代码或伪代码的方式加以阐释。大多数情况下,我们还将使用传统的数学符号,以便你能够以某种方式学习基础的数学概念,无论是图表、代码,还是你使用得最多的、普通的数学符号。

1.8 后续内容概述

在第2章中,我们会先介绍所采用的一些教学方法,然后深入介绍强化学习的核心内容,其中包括很多核心概念,例如探索和利用之间的平衡、马尔可夫决策过程、价值和策略函数。

在本书后续章节中,我们会介绍深度强化学习核心算法——许多最新的研究都是以这些算法为基础的,从深度Q网络到策略梯度法,再到基于模型的算法。我们主要利用OpenAI的Gym训练算法,使之理解非线性动态、控制机器人以及玩游戏(见图1.15)。

图1.15 对围棋棋盘的描述,这是一种传统的中国游戏,谷歌DeepMind团队将其作为AlphaGo强化学习算法的测试平台。职业围棋选手李世石(Lee Sedol)在与AlphaGo的5局对弈中仅赢得1局,标志着强化学习迎来一个转折点,因为长期以来,人们一直认为围棋不受国际象棋算法推理的影响

在后续章节中,我们大多会用一个主要问题或项目来说明重要的概念和技能。随着内容的深入,我们可能会就最初的问题增加复杂性或细微差别,以深入探究某些原理。例如,在第2章中,我们将从老虎机的奖励最大化问题开始,通过解决该问题来回顾强化学习的大部分基础知识。随后,我们会增加该问题的复杂性,并将环境转变为需要最大化广告点击量的商业领域,以诠释更多的核心概念。

虽然本书面向已经熟练掌握深度学习基础知识的读者,但是我们不仅希望能够教给读者有趣和有用的强化学习技术,还希望能够磨炼读者的深度学习技能。为了完成一些更具挑战性的项目,我们需要使用一些较新的深度学习技术,例如生成对抗网络、进化算法、元学习和迁移学习等。同样,这完全符合我们注重技能的教学模式,而这些新技术的细节并不是最重要的。

小结

强化学习是机器学习的一个子类。强化学习算法通过最大化在某些环境中的奖励进行学习,有助于解决涉及做出决策或采取动作的问题。原则上,强化学习算法可以采用任何统计学习模型,但使用深度神经网络已变得越发流行和高效。

智能体是所有强化学习问题的焦点。作为强化学习算法的一部分,智能体用于处理输入并决定采取哪种动作。在本书中,我们主要关注用深度神经网络实现的智能体。

环境是智能体采取动作的潜在动态条件。一般来说,环境是任何为智能体生成输入数据的流程。例如,一个智能体在飞行模拟器中驾驶飞机,那么此时模拟器就是环境。

状态是环境的“快照”,智能体可以访问并使用状态做出决策。环境往往是一组不断变化的条件,但我们可以从环境中采样,这些特定时间的样本就是提供给智能体的环境状态信息。

动作就是智能体做出的决策,它会对环境产生影响。移动一枚特定的象棋棋子就是一个动作,踩下汽车油门也是一个动作。

奖励是智能体做出动作后接收到环境向智能体提供的正向或负向信号。奖励是智能体收到的唯一学习信号,而强化学习算法(智能体)的目标就是使奖励最大化。

强化学习算法的一般流程是一个循环,其中智能体接收输入数据(环境状态),评估数据,从特定于当前状态的一组可能行为中选择一个动作,该动作会改变环境,然后环境发送一个奖励信号和新的状态信息给智能体,之后循环往复。当智能体被实现为深度神经网络时,每次迭代都基于奖励信号评估一个损失函数,并进行反向传播,以改善智能体的表现。

读者服务:

微信扫码关注【异步社区】微信公众号,回复“e57636”获取本书配套资源以及异步社区15天VIP会员卡,近千本电子书免费畅读。

相关图书

ChatGPT原理与应用开发
ChatGPT原理与应用开发
深度学习的数学——使用Python语言
深度学习的数学——使用Python语言
深度学习:从基础到实践(上、下册)
深度学习:从基础到实践(上、下册)
动手学深度学习(PyTorch版)
动手学深度学习(PyTorch版)
深度学习与医学图像处理
深度学习与医学图像处理
深度强化学习实战:用OpenAI Gym构建智能体
深度强化学习实战:用OpenAI Gym构建智能体

相关文章

相关课程