735 737 1554练习 37 15.6针对序列级和词元级应用程序微调BERT··········· 73 15.61单文本分类.………………………… 738 15.62文本对分类或回归·…… 738 15.6.3 文本标注,·…·· 739 740 15.6.5小结 15.6.6练习 4·””“”444··”·…”…·+···…4……·”””·4·4····… 41 157自然语言推断:微调BERT。··。······。。····。·。················· 742 15.7.1加载预训练的BERT 743 15.72微调BERT的数据集 744 745 15.7.4小结 747 15.7.5练习 747 16附录:深度学习工具 749 16.1 I使用Jupyter Notebooks,·, ,”。年”。。。,”。。”,,。””。”gg,。。。” 749 1611在本地编辑和运行代码··,···········。············ 749 16.12高级选项.····· 16.13小结 754 16.1.4练习 755 16.2使用Amazon SageMaker... 755 1621注册 755 162.2创建SageMaker?实例.································ 755 1623运行和停止实例 757 16.2.4更新Notebook 16.2.5小 758 758 16.3使用Ama2onEC2实例 16.3.1创建和运行EC2实例 。g。。。”。。。。。。。。。。。。。”。。。4。。0。”。 758 763 16.3.3安装库以运行代码,, 765 16.3.4 远程运行upyter笔记本 765 16.3.5关闭末使用的实例······························· 766 16.3.6小结······ 16.3.7练习 。””””。g。。。”。。”。”。。。”””。。”””””g。。。。 766 766 。 16.4.2选择GPU 768 16.4.3小结 770
15.5.2 训练和评估模型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 735 15.5.3 ⼩结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 737 15.5.4 练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 737 15.6 针对序列级和词元级应⽤程序微调BERT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 737 15.6.1 单⽂本分类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 738 15.6.2 ⽂本对分类或回归 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 738 15.6.3 ⽂本标注 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 739 15.6.4 问答 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 740 15.6.5 ⼩结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 741 15.6.6 练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 741 15.7 ⾃然语⾔推断:微调BERT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 742 15.7.1 加载预训练的BERT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 743 15.7.2 微调BERT的数据集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 744 15.7.3 微调BERT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745 15.7.4 ⼩结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 747 15.7.5 练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 747 16 附录:深度学习⼯具 749 16.1 使⽤Jupyter Notebooks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 749 16.1.1 在本地编辑和运⾏代码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 749 16.1.2 ⾼级选项 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753 16.1.3 ⼩结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 754 16.1.4 练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 755 16.2 使⽤Amazon SageMaker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 755 16.2.1 注册 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 755 16.2.2 创建SageMaker实例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 755 16.2.3 运⾏和停⽌实例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 757 16.2.4 更新Notebook . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 757 16.2.5 ⼩结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 758 16.2.6 练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 758 16.3 使⽤Amazon EC2实例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 758 16.3.1 创建和运⾏EC2实例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 758 16.3.2 安装CUDA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 763 16.3.3 安装库以运⾏代码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 765 16.3.4 远程运⾏Jupyter笔记本 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 765 16.3.5 关闭未使⽤的实例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 766 16.3.6 ⼩结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 766 16.3.7 练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 766 16.4 选择服务器和GPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 766 16.4.1 选择服务器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 767 16.4.2 选择GPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768 16.4.3 ⼩结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 770 xx
165为本书做贡献…………………………………… 771 16.5.1提交微小更改 16.52 大量文本或代码修改,……… 71 7 772 165.4小结 16.55练习 t。。年。。。。。。。,。。。。,。。。。年。。。。 7 166d21API文档·········· 775 16.6.1模型 775 16.6.2数 4·。·。4。…4。·”……”…·4··。。…·4··。·。4…·4··”… 775 16.6.3训绮 …。。…。。。……。·。………,。…·。·。…。。………。。…。…。…·。…。。 775 16.6.4公用 775 Bibliography 777 xxi
16.5 为本书做贡献 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 771 16.5.1 提交微⼩更改 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 771 16.5.2 ⼤量⽂本或代码修改 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 771 16.5.3 提交主要更改 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 772 16.5.4 ⼩结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 775 16.5.5 练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 775 16.6 d2l API ⽂档 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 775 16.6.1 模型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 775 16.6.2 数据 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 775 16.6.3 训练 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 775 16.6.4 公⽤ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 775 Bibliography 777 xxi
序言 几年前,在大公司和初创公司中,并没有大最的深度学习科学家开发智能产品和服务。我们中年轻人(作者) 进入这个领域时,机器学习并没有在报纸上获得头条新闻。我们的父母根本不知道什么是机器学习,更不用 说为什么我们可能更喜欢机器学习,而不是从事医学或法律职业。机器学习是一门具有前瞻性的学科,在现 实世界的应用范围很窄。而那些应用,例如语音识别和计算机视觉,需要大量的领域知识,以至于它们通常 被认为是完全独立的领域,而机器学习对于这些领域来说只是一个小组件。因此,神经网络一我们在本书 中关注的深度学习模型的前身,被认为是过时的工具。 就在过去的五年里,深度学习给世界带来了惊喜,推动了计算机视觉、自然语言处理、自动语音识别、强化 学习和统计建模等领域的快速发展。有了这些进步,我们现在可以制造比以往任何时候都更自主的汽车(不 过可能没有一些公司试图让你相信的那么自主),可以自动起草普通邮件的智能回复系统,帮助人们从令人 压抑的大收件箱中解放出来。在围棋等棋类游戏中,软件超越了世界上最优秀的人,这曾被认为是几十年后 的事。这些工具已经对工业和社会产生了越来越广泛的影响,改变了电影的制作方式、疾病的诊断方式,并 在基础科学中扮演着越来越重要的角色一从天体物理学到生物学。 关于本书 这本书代表了我们的尝试一让深度学习可平易近人,教会你概念、背景和代码。 1
序⾔ ⼏年前,在⼤公司和初创公司中,并没有⼤量的深度学习科学家开发智能产品和服务。我们中年轻⼈(作者) 进⼊这个领域时,机器学习并没有在报纸上获得头条新闻。我们的⽗⺟根本不知道什么是机器学习,更不⽤ 说为什么我们可能更喜欢机器学习,⽽不是从事医学或法律职业。机器学习是⼀⻔具有前瞻性的学科,在现 实世界的应⽤范围很窄。⽽那些应⽤,例如语⾳识别和计算机视觉,需要⼤量的领域知识,以⾄于它们通常 被认为是完全独⽴的领域,⽽机器学习对于这些领域来说只是⼀个⼩组件。因此,神经⽹络——我们在本书 中关注的深度学习模型的前⾝,被认为是过时的⼯具。 就在过去的五年⾥,深度学习给世界带来了惊喜,推动了计算机视觉、⾃然语⾔处理、⾃动语⾳识别、强化 学习和统计建模等领域的快速发展。有了这些进步,我们现在可以制造⽐以往任何时候都更⾃主的汽⻋(不 过可能没有⼀些公司试图让你相信的那么⾃主),可以⾃动起草普通邮件的智能回复系统,帮助⼈们从令⼈ 压抑的⼤收件箱中解放出来。在围棋等棋类游戏中,软件超越了世界上最优秀的⼈,这曾被认为是⼏⼗年后 的事。这些⼯具已经对⼯业和社会产⽣了越来越⼴泛的影响,改变了电影的制作⽅式、疾病的诊断⽅式,并 在基础科学中扮演着越来越重要的⻆⾊——从天体物理学到⽣物学。 关于本书 这本书代表了我们的尝试——让深度学习可平易近⼈,教会你概念、背景和代码。 1
一种结合了代码、数学和HTML的媒介 年何一种社管技术要想发挥其全部影响力.都必须得到东分的理解弃分的文档记录并得到成纳的维护 良好的工具的支持。关键思想应该被清楚地提炼出来,尽可能减少需要让新的从业者跟上时代的入门时间。 成熟的库应该自动化常见的任务,示例代码应该使从业者可以轻松地修改、应用和扩展常见的应用程序,以 满足他们的委求。以动态网面应用为例。尽管许多公司如亚卫马桥.在20世纪90年代开发了成功的数据库胶 动网页应用程序。但在过去的10年里,这项技术在帮助创造性企业家方面的潜力已经得到了更大程度的发挥 部分原因是开发了功能强大、文档完整的框架。 测试深度学习的潜力带来了独特的挑战,因为任何一个应用都会将不同的学科结合在一起。应用深度学习需 要同时了解(1)以特定方式提出问题的动机;(2)给定建模方法的数学;(3)将模型拟合数据的优化算法;(4④) 能够有效训练模型、克服数值计算缺陷并最大限度地利用现有硬件的工程方法。同时教授表述问题所需的批 判性思维技能、解决向题所需的数学知识,以及实现这些解决方案所需的软件工具,这是一个巨大的挑战。 在我们开始写这本书的时候。没有资源能够同时满足一些条件:(1)是最新的:(2)涵盖了现代机器学习的所 有领域,技术深度丰富:(3)在 一本引人入胜的教科书中,你可以在实践教程中找到干净的可运行代码,并 从中穿插高质量的阐述。我们发现了大量关于如何使用给定的深度学习框架(例如,如何对TensorFlow中的 矩阵进行基本的数值计算)或实现特定技术的代码示例(例如.LeNet、AlexNet、Resnet的代码片段).这些 代码示例分散在各种博客帖子和GitHub库中。但是,这些示例通常关注如何实现给定的方法,但忽略了为什 么做出某些算法决策的讨论。虽然一些互动资源已经零星地出现以解决特定主题。例如,在网站Ds上发 布的引人入胜的博客帖子或个人博客,但它们仅覆盖深度学习中的选定主题,并且通常缺乏相关代码。另一 方面,虽然已经出现了几本教科书,其中最著名的是[Goodfellow etal,.2016(中文名《深度学习》),它对 深度学习背后的概念进行了全面的调查,但这些资源并没有将这些概念的描述与这些概念的代码实现结合起 来。有时会让读者对如何实现它们一无所知。此外,太多的资源隐藏在商业课程提供商的付费壁垒后面。 我们着手创律的资源可以:(1)每个人都可以免费获得:(2)提供足够的技术深度.为直正成为一名应用机 器学习科学家提供起步;(3)包括可运行的代码,向读者展示如何解决实践中的向题;(④)允许我们和社区 的快速更新;(⑤)由一个论坛作为补充,用于技术细节的互动讨论和回答问题。 这些目标经常是相互冲突的。公式、定理和引用最好用LaTeX来管理和布局。代码最好用Python描述。网页 原生是HTML和avaScript的。此外,我们希望内容既可以作为可执行代码访向、作为纸质书访问,作为可下 载的DF访问,也可以作为网站在互联网上访向。目前还没有完全适合这些需求的工具和工作流程,所以我 们不得不自行组装。我们在16.5节中详细描述了我们的方法。我们选择GitHub来共享源代码并允许编辑,选 择upyteri记事本来混合代码、公式和文本,选择Sphinxf作为渲染引擎来生成多个输出,并为论坛提供讨论。 虽然我们的体系尚不完善,但这些选择在相互冲突的问题之间提供了一个很好的妥协。我们相信,这可能是 第一本使用这种集成工作流程出版的书。 http://distill.pub http://discuss.d21. 目录
⼀种结合了代码、数学和HTML的媒介 任何⼀种计算技术要想发挥其全部影响⼒,都必须得到充分的理解、充分的⽂档记录,并得到成熟的、维护 良好的⼯具的⽀持。关键思想应该被清楚地提炼出来,尽可能减少需要让新的从业者跟上时代的⼊⻔时间。 成熟的库应该⾃动化常⻅的任务,⽰例代码应该使从业者可以轻松地修改、应⽤和扩展常⻅的应⽤程序,以 满⾜他们的需求。以动态⽹⻚应⽤为例。尽管许多公司,如亚⻢逊,在20世纪90年代开发了成功的数据库驱 动⽹⻚应⽤程序。但在过去的10年⾥,这项技术在帮助创造性企业家⽅⾯的潜⼒已经得到了更⼤程度的发挥, 部分原因是开发了功能强⼤、⽂档完整的框架。 测试深度学习的潜⼒带来了独特的挑战,因为任何⼀个应⽤都会将不同的学科结合在⼀起。应⽤深度学习需 要同时了解(1)以特定⽅式提出问题的动机;(2)给定建模⽅法的数学;(3)将模型拟合数据的优化算法;(4) 能够有效训练模型、克服数值计算缺陷并最⼤限度地利⽤现有硬件的⼯程⽅法。同时教授表述问题所需的批 判性思维技能、解决问题所需的数学知识,以及实现这些解决⽅案所需的软件⼯具,这是⼀个巨⼤的挑战。 在我们开始写这本书的时候,没有资源能够同时满⾜⼀些条件:(1)是最新的;(2)涵盖了现代机器学习的所 有领域,技术深度丰富;(3)在⼀本引⼈⼊胜的教科书中,你可以在实践教程中找到⼲净的可运⾏代码,并 从中穿插⾼质量的阐述。我们发现了⼤量关于如何使⽤给定的深度学习框架(例如,如何对TensorFlow中的 矩阵进⾏基本的数值计算)或实现特定技术的代码⽰例(例如,LeNet、AlexNet、ResNet的代码⽚段),这些 代码⽰例分散在各种博客帖⼦和GitHub库中。但是,这些⽰例通常关注如何实现给定的⽅法,但忽略了为什 么做出某些算法决策的讨论。虽然⼀些互动资源已经零星地出现以解决特定主题。例如,在⽹站Distill1上发 布的引⼈⼊胜的博客帖⼦或个⼈博客,但它们仅覆盖深度学习中的选定主题,并且通常缺乏相关代码。另⼀ ⽅⾯,虽然已经出现了⼏本教科书,其中最著名的是 [Goodfellow et al., 2016](中⽂名《深度学习》),它对 深度学习背后的概念进⾏了全⾯的调查,但这些资源并没有将这些概念的描述与这些概念的代码实现结合起 来。有时会让读者对如何实现它们⼀⽆所知。此外,太多的资源隐藏在商业课程提供商的付费壁垒后⾯。 我们着⼿创建的资源可以:(1)每个⼈都可以免费获得;(2)提供⾜够的技术深度,为真正成为⼀名应⽤机 器学习科学家提供起步;(3)包括可运⾏的代码,向读者展⽰如何解决实践中的问题;(4)允许我们和社区 的快速更新;(5)由⼀个论坛2作为补充,⽤于技术细节的互动讨论和回答问题。 这些⽬标经常是相互冲突的。公式、定理和引⽤最好⽤LaTeX来管理和布局。代码最好⽤Python描述。⽹⻚ 原⽣是HTML和JavaScript的。此外,我们希望内容既可以作为可执⾏代码访问、作为纸质书访问,作为可下 载的PDF访问,也可以作为⽹站在互联⽹上访问。⽬前还没有完全适合这些需求的⼯具和⼯作流程,所以我 们不得不⾃⾏组装。我们在 16.5节 中详细描述了我们的⽅法。我们选择GitHub来共享源代码并允许编辑,选 择Jupyter记事本来混合代码、公式和⽂本,选择Sphinx作为渲染引擎来⽣成多个输出,并为论坛提供讨论。 虽然我们的体系尚不完善,但这些选择在相互冲突的问题之间提供了⼀个很好的妥协。我们相信,这可能是 第⼀本使⽤这种集成⼯作流程出版的书。 1 http://distill.pub 2 http://discuss.d2l.ai 2 ⽬录
在实践中学习 许多教科书教投一系列的主题,每一个都非常详细。例如,Chris Bishop的优秀教科书[Bishop,2006],对每 个主题都教得很透彻,以至于要读到线性回归这一章需要大量的工作。虽然专家们喜欢这本书正是因为它的 透彻性,但对于初学者来说,这一特性限制了它作为介绍性文本的实用性。 在这本书中,我们将适时教授大部分概念。换句话说,你将在实现某些实际目的所需的非常时刻学习概念 虽然我们在开始时花了一些时间来教授基础的背景知识,如线性代数和概率,但我们希望你在思考更深奥的 概率分布之前,先体会一下训练模型的满足感。 除了提供基本数学背景速成课程的几节初步课程外,后续的每一章都介绍了适量的新概念,并提供可独立工 作的例子一 使用真实的数据集。这带来了组织上的挑战。某些模型可能在逻辑上组合在单节中。而一些想 法可能最好是通过连续允许几个模型来传授。另一方面,坚持“一个工作例子一节”的策略有一个很大的好 处:这使你可以通过利用我们的代码尽可能轻松地启动你自己的研究项目。只需复制这一节的内容并开始修 改即可。 我们将根据需要将可运行代码与背景材料交错。通常,在充分解释工具之前,我们常常会在提供工具这一方 面犯错误(我们将在稍后解释背最)。例如,在充分解释随机梯度下降为什么有用或为什么有效之前,我们可 以使用它。这有助于给从业者提供快速解决问题所需的弹药,同时需要读者相信我们的一些决定。 这本书将从头开始教授深度学习的概念。有时,我们想深入研究模型的细节,这些的细节通常会被深度学习 框架的高级抽象隐藏起来。特别是在基础教程中,我们希望你了解在给定层或优化器中发生的一切。在这些 情况下,我们通常会提供两个版本的示例:一个是我们从零开始实现一切,仅依赖于NumPy接口和自动微分; 另一个是更实际的示例,我们使用深度学习框架的高级API编写简洁的代码。一旦我们教了您一些组件是如 何工作的,我们就可以在随后的教程中使用高级API了。 内容和结构 全书大致可分为三个部分,在图1中用不同的颜色呈现: 目录
在实践中学习 许多教科书教授⼀系列的主题,每⼀个都⾮常详细。例如,Chris Bishop的优秀教科书 [Bishop, 2006] ,对每 个主题都教得很透彻,以⾄于要读到线性回归这⼀章需要⼤量的⼯作。虽然专家们喜欢这本书正是因为它的 透彻性,但对于初学者来说,这⼀特性限制了它作为介绍性⽂本的实⽤性。 在这本书中,我们将适时教授⼤部分概念。换句话说,你将在实现某些实际⽬的所需的⾮常时刻学习概念。 虽然我们在开始时花了⼀些时间来教授基础的背景知识,如线性代数和概率,但我们希望你在思考更深奥的 概率分布之前,先体会⼀下训练模型的满⾜感。 除了提供基本数学背景速成课程的⼏节初步课程外,后续的每⼀章都介绍了适量的新概念,并提供可独⽴⼯ 作的例⼦——使⽤真实的数据集。这带来了组织上的挑战。某些模型可能在逻辑上组合在单节中。⽽⼀些想 法可能最好是通过连续允许⼏个模型来传授。另⼀⽅⾯,坚持“⼀个⼯作例⼦⼀节”的策略有⼀个很⼤的好 处:这使你可以通过利⽤我们的代码尽可能轻松地启动你⾃⼰的研究项⽬。只需复制这⼀节的内容并开始修 改即可。 我们将根据需要将可运⾏代码与背景材料交错。通常,在充分解释⼯具之前,我们常常会在提供⼯具这⼀⽅ ⾯犯错误(我们将在稍后解释背景)。例如,在充分解释随机梯度下降为什么有⽤或为什么有效之前,我们可 以使⽤它。这有助于给从业者提供快速解决问题所需的弹药,同时需要读者相信我们的⼀些决定。 这本书将从头开始教授深度学习的概念。有时,我们想深⼊研究模型的细节,这些的细节通常会被深度学习 框架的⾼级抽象隐藏起来。特别是在基础教程中,我们希望你了解在给定层或优化器中发⽣的⼀切。在这些 情况下,我们通常会提供两个版本的⽰例:⼀个是我们从零开始实现⼀切,仅依赖于NumPy接⼝和⾃动微分; 另⼀个是更实际的⽰例,我们使⽤深度学习框架的⾼级API编写简洁的代码。⼀旦我们教了您⼀些组件是如 何⼯作的,我们就可以在随后的教程中使⽤⾼级API了。 内容和结构 全书⼤致可分为三个部分,在 图1 中⽤不同的颜⾊呈现: ⽬录 3