基于TensorFlow的深度学习:神经网络、计算机视觉和NLP的理论与实践 [美]马格努斯·埃克曼 周翊民 译
定 价:149 元
- 作者:[美]马格努斯·埃克曼
- 出版时间:2024/1/1
- ISBN:9787111741725
- 出 版 社:机械工业出版社
- 中图法分类:TP18
- 页码:
- 纸张:纯质纸
- 版次:
- 开本:16开
本书系统地讲解了深度学习技术,阐明核心概念和实践编程技术,是开发者、数据科学家、分析师,以及之前没有机器学习或统计经验的人员人员的理想选择。
本书介绍了深度神经网络的人工神经元和全连接、卷积和循环层等基本构建模块,展示了如何使用它们来构建先进的架构。书中还讲解了如何使用这些概念构建计算机视觉和自然语言处理(NLP)网络,包括Mask R-CNN、GPT和BERT。此外,书中还描述了自然语言翻译器和能根据图像内容生成自然语言系统的原理。
本书使用TensorFlow和Keras提供了简洁、注释良好的代码示例,还提供了相应的PyTorch示例,涵盖了工业和学术界关于深度学习的两个主要Python库。最后,介绍了神经结构搜索(NAS),并探索了重要的伦理问题,为进一步学习深度学习提供了资源。
Preface
前 言
深度学习(DL)是一个快速发展的领域,它在图像分类、生成图像的自然语言描述、自然语言翻译、语音到文本和文本到语音的转换等方面取得了惊人的成果。本书详细阐述了深度学习这个主题,并提供了实践经验,为进一步学习打下坚实基础。
在本书中,使用绿色文本框来突出特别重要和关键的概念。首先指出的是,深度学习这个概念很重要。
我们首先学习感知器和其他人工神经元(深度神经网络的基本构件),以及全连接的前馈网络和卷积网络,并应用这些网络来解决实际问题,例如基于大量数据预测房价或识别图像属于哪个类别,图P-1是CIFAR-10图像数据集的分类和示例,我们将在第7章中对该数据集进行详细研究。
图P-1 CIFAR-10图像数据集的分类和示例(Krizhevsky,2009) (见彩插)
(图片来源:https://www.cs.toronto.edu/ kriz/cifar.html)
我们接着学习如何使用编码来表示自然语言中的单词,这种编码技术可以捕捉被编码的单词的语义词。然后,使用这些编码与循环神经网络一起创建自然语言翻译器,如图P-2所示。这个翻译器可以自动将简单句子从英语翻译为法语或其他类似语言。
最后,我们将学习如何构建一个结合图像和语言处理的图像字幕网络。该网络以图像为输入,可自动生成图像的自然语言描述。
在本书的学习进程中,还将讨论许多其他细节。此外,本书将一些其他重要主题作为附录,供读者深入学习。
图P-2 输入为英语而输出为对应法语的神经网络翻译器
认识深度学习
DL可解释为一类机器学习算法,使用多层计算单元,其中每一层学习自身的输入数据表示,这些表示由后面的层以分层方式组合。这个定义有些抽象,特别是考虑到还没有描述层和计算单元的概念,但在前几章将提供更多具体实例来阐明这个定义。
深度神经网络(DNN)是DL的基本组成部分,它是受生物神经元启发而产生的。关于DL技术究竟能在多大程度上模拟大脑活动一直存在争论,其中有人认为使用神经网络这个术语会让人觉得它比实际情况更先进。因此,他们建议使用“单元”而不是“人工神经元”,使用“网络”而不是“神经网络”。毫无疑问,DL和更广泛的 AI领域已经被主流媒体大肆炒作。在写作本书时,很容易产生这样的感觉,即我们将创造出像人类一样思考的机器,尽管最近表达怀疑的文章更为常见。读了本书后,你会对DL可以解决哪些问题有更准确的了解。在本书中,我们会自由选择使用“神经网络”和“神经元”这些词,不过读者也应当注意到,本书所介绍的算法更多地与机器能力,而不是人类大脑的实际工作方式有关。图P-3所示为人工智能、机器学习、深度学习和深度神经网络之间的关系。不同椭圆的面积大小并不代表该类相对于另一类的类别范畴。
在本书中,斜体部分的内容是陈述一些题外话或主观观点。如果你认为它们对你的阅读没有价值,可以完全忽略。
DNN是DL的子集。
DL是ML的子集,而ML是AI的子集。
本书不重点讨论DL的确切定义及其边界,也不深入讨论ML或AI其他领域的细节,而是重点阐述DNN及其应用。
图P-3 人工智能、机器学习、深度学习和深度神经网络之间的关系
深度神经网络简史
上述内容只是粗略地提到网络但没有描述什么是网络。本书前几章详细讨论了网络架构,这里只把网络视为一个有输入和输出的不透明系统就足够了。使用模型可将信息(图像或文本序列)作为网络输入,然后网络会输出相应信息,比如对图像的解释(见图P-4),或不同语言的自然语言翻译(见图P-2)。
图P-4 深度神经网络作为一种不透明系统,将图像作为输入,然后输出图像中的对象类型
如前所述,神经网络的核心部分是人工神经元。第一个人工神经元模型在1943年问世(McCulloch and Pitts,1943),掀启了第一次神经网络研究的浪潮。随后,在1957年Rosenblatt感知器出现(Rosenblatt,1958)。感知器的重要贡献是自动学习算法,即系统自动学习所期望的行为。本书第1章详细介绍了感知器。感知器有其局限性,尽管通过将多个感知器组合成多层网络可以打破这些局限性,但最初的学习算法并没有扩展到多层网络。根据普遍说法,这是导致神经网络研究开始衰落的原因。人工智能进入了第一个寒冬,据说是因Minsky和Papert在他们于1969年所著一书中提出缺失多层网络学习算法是一个严重问题引起的。但这个话题和说法颇具争议性。Olazaran研究了Minsky和Papert的陈述是否被歪曲(Olazaran,1996)。此外,Schmidhuber(2015)指出,早在Minsky和Papert的书出版4年之前,文献(Ivakhnenko和Lapa,1965)中就提出了一种用于多层网络的学习
算法。
第二次神经网络研究浪潮始于20世纪80年代,很大程度上受到了(Rumelhart et al.,1986)文献的影响(该文献描述了用于多层网络自动训练的反向传播算法)。Rumelhart和他的同事证明,这种算法可以用来突破感知器的局限性,解决Minsky和Papert提出的问题。Rumelhart和他的同事在神经网络的背景下推广了反向传播算法,但这并不是该算法在文献中首次出现。早在1970年该算法就被用于类似问题领域(Linnainmaa,1970)。1981年,Werbos(1981)又在神经网络背景下对该算法进行了描述。
周翊民
中国科学院深圳先进技术研究院研究
员,博士生导师。2008 年在英国牛津大学
工程科学系获得博士学位,曾在英国拉夫
堡大学电子电气工程系从事博士后研究工
作。主要从事非线性控制、人工智能、模
糊神经网络、机器人、无人机控制系统、
智能电网等相关技术的研究。以项目负责
人身份申请并获批国家自然基金、科技部
重点研发计划、广东省科技专项、深圳市
基础重点研究项目等多个项目。发表SCI/
EI文章100余篇,申请专利50余项,出版
英文专著2 部,译著1部。
CONTENTS
目 录
推荐序一
推荐序二
前言
第1章 Rosenblatt 感知器 1
1.1 双输入感知器示例 3
1.2 感知器学习算法 4
1.3 感知器的局限性 9
1.4 组合多个感知器 11
1.5 感知器的几何解释 13
1.6 理解偏差项 14
第2章 基于梯度的学习 16
2.1 感知器学习算法的直观解释 16
2.2 用梯度下降法解决学习问题 18
2.3 网络中的常量与变量 20
2.4 感知器学习算法的解析 20
2.5 感知器学习算法的几何描述 22
2.6 重新审视不同类型的感知器 22
2.7 使用感知器进行模式识别 24
第3章 Sigmoid神经元与反向
传播 26
3.1 改进的神经元实现多层网络的
梯度下降 26
3.2 激活函数的选择 30
3.3 复合函数和链式法则 30
3.4 利用反向传播计算梯度 31
3.4.1 前向传播阶段 37
3.4.2 后向传播阶段 37
3.4.3 权重调整 38
3.5 每层具有多个神经元的反向
传播 39
3.6 编程示例:学习XOR函数 40
3.7 网络结构 43
第4章 用于多分类的全连接网络 45
4.1 训练网络时所用数据集简介 45
4.1.1 探索数据集 46
4.1.2 数据集中的人为偏见 48
4.1.3 训练集、测试集和泛化 49
4.1.4 超参数调优和测试集信息
泄漏 50
4.2 训练与推理 51
4.3 扩展网络和学习算法以进行
多分类 51
4.4 用于数字分类的网络 52
4.5 多分类的损失函数 52
4.6 编程示例:手写数字分类 53
4.7 小批量梯度下降 60
第5章 走向DL:框架和网络
调整 61
5.1 编程示例:转移到DL框架 61
5.2 饱和神经元和梯度消失问题 65
5.3 避免神经元饱和的初始化和归一化
技术 66
5.3.1 权重初始化 67
5.3.2 输入标准化 68
5.3.3 批归一化 68
5.4 用于缓解饱和输出神经元影响的
交叉熵损失函数 69
5.5 使用不同激活函数以避免隐藏层
中梯度消失问题 73
5.6 提高学习的梯度下降法中的
变量 76
5.7 实验:调整网络和学习参数 78
5.8 超参数调优和交叉验证 80
5.8.1 使用验证集来避免过
拟合 81
5.8.2 交叉验证以改善训练数据
的使用 81
第6章 全连接网络在回归中的
应用 83
6.1 输出单元 83
6.1.1 二元分类的逻辑单元 84
6.1.2 用于多分类的Softmax
单元 84
6.1.3 线性回归单元 86
6.2 波士顿住房数据集 87
6.3 编程示例:用DNN预测房价 88
6.4 用正则化改进泛化 91
6.5 实验:更深层次和正则化的房价
预测模型 93
第7章 卷积神经网络在图像分类中
的应用 94
7.1 CIFAR-10数据集 95
7.2 卷积层的特征和构建模块 97
7.3 将特征映射组合成一个卷积层 99
7.4 将卷积层和全连接层结合成一个
网络 100
7.5 稀疏连接和权重共享的影响 102
7.6 编程示例:用卷积网络进行图像
分类 105
第8章 深度卷积神经网络和预训练
模型 113
8.1 VGGNet 113
8.2 GoogLeNet 116
8.3 ResNet 119
8.4 编程示例:使用预先训练的ResNet实现 124
8.5 迁移学习 126
8.6 CNN和池化的反向传播 128
8.7 正则化技术的数据增强 128
8.8 CNN的局限性 129
8.9 用深度可分离卷积进行参数
约简 130
8.10 用高效网络实现正确的网络
设计平衡 131
第9章 用循环神经网络预测时间
序列 132
9.1 前馈网络的局限性 134
9.2 循环神经网络 135
9.3 循环层的数学表示 135
9.4 将图层组合成一个RNN 136
9.5 RNN的另一视图并按时间展开 137
9.6 基于时间的反向传播 138
9.7 编程示例:预测图书销量 140
9.7.1 标准化数据并创建训练
示例 144
9.7.2 创建一个简单的RNN 145
9.7.3 与无循环网络的比较 148
9.7.4 将示例扩展为多输入
变量 149
9.8 RNN的数据集注意事项 149
第10章 长短期记忆 151
10.1 保持梯度健康 151
10.2 LSTM介绍 154
10.3 LSTM激活函数 157
10.4 创建LSTM单元构成的网络 157
10.5 LSTM的其他理解 158
10.6 相关话题:高速神经网络和跳
连接 159
第11章 使用LSTM和集束搜索
自动补全文本 161
11.1 文本编码 161
11.2 长期预测和自回归模型 162
11.3 集束搜索 163
11.4 编程示例:使用LSTM实现
文本自动补全 164
11.5 双向RNN 169
11.6 输入和输出序列的不同组合 170
第12章 神经语言模型和词嵌入 172
12.1 语言模型介绍及其用例简介 172
12.2 不同语言模型的例子 174
12.2.1 n-gram模型 174
12.2.2 skip-gram模型 176
12.2.3 神经语言模型 176
12.3 词嵌入的好处及对其工作方式
的探究 178
12.4 基于神经语言模型创建词
嵌入 179
12.5 编程示例:神经语言模型和产生的嵌入 182
12.6 King–Man + Woman! = Queen 188
12.7 King–Man+Woman != Queen 190
12.8 语言模型、词嵌入和人类
偏见 190
12.9 相关话题:文本情感分析 191
12.9.1 词袋法和N元词袋法 192
12.9.2 相似性度量 194
12.9.3 组合BoW和深度学习 195
第13章 Word2vec和GloVe的
词嵌入 197
13.1 使用Word2vec在没有语言模型的情况下创建词嵌入 197
13.1.1 与语言模型相比降低计算复杂性 198
13.1.2 连续词袋模型 199
13.1.3 连续skip-gram模型 199
13.1.4 进一步降低计算复杂度的优化连续skip-gram模型 200
13.2 关于Word2vec的其他思考 201
13.3 矩阵形式的Word2vec 202
13.4 Word2vec总结 203
13.5 编程示例:探索GloVe嵌入的
属性 204
第14章 序列到序列网络和自然
语言翻译 209
14.1 用于序列到序列学习的编-解码器模型 210
14.2 Keras函数式API简介 212
14.3 编程示例:神经机器翻译 214
14.4 实验结果 226
14.5 中间表示的性质 227
第15章 注意力机制和Transformer
架构 229
15.1 注意力机制的基本原理 229
15.2 序列到序列网络中的注意力
机制 230
15.2.1 计算对齐向量 234
15.2.2 对齐向量上的数学符号与
变量 235
15.2.3 关注更深层的网络 236
15.2.4 其他注意事项 237
15.3 循环网络的替代方法 238
15.4 自注意力 239
15.5 多头注意力 240
15.6 Transformer架构 241
第16章 用于图像字幕的一对多
网络 245
16.1 用注意力扩展图像字幕网络 247
16.2 编程示例:基于注意力的图像
字幕 248
第17章 其他主题 264
17.1 自编码器 264
17.1.1 自编码器的使用案例 265
17.1.2 自编码器的其他方面 266
17.1.3 编程示例:用于异常值
检测的自编码器 267
17.2 多模态学习 272
17.2.1 多模态学习的分类 272
17.2.2 编程示例:使用多模态
输入数据进行分类 275
17.3 多任务学习 279
17.3.1 为什么要执行多任务
学习 279
17.3.2 如何实现多任务学习 279
17.3.3 其他方向和变体的基本
实现 280
17.3.4 编程示例:多分类和用单一网络回答问题 281
17.4 网络调优过程 284
17.5 神经网络架构搜索 287
17.5.1 神经网络架构搜索的关键
组成部分 287
17.5.2 编程示例:搜索一个用于CIFAR-10分类的架构 290
17.5.3 神经架构搜索的内在
含义 300
第18章 总结和未来展望 301
18.1 你现在应该知道的事情 301
18.2 伦理AI和数据伦理 302
18.2.1 需要注意的问题 303
18.2.2 问题清单 304
18.3 你还不知道的事情 305
18.3.1 强化学习 305
18.3.2 变分自编码器和生成
对抗网络 305
18.3.3 神经风格迁移 306
18.3.4 推荐系统 307
18.3.5 语音模型 307
18.4 未来展望 307
附录A 线性回归和线性分类 309
A.1 机器学习算法:线性回归 309
A.1.1 一元线性回归 309
A.1.2 多元线性回归 310
A.1.3 用线性函数建模曲率 311
A.2 计算线性回归系数 312
A.3 逻辑回归分类 313
A.4 用线性分类器对XOR进行
分类 314
A.5 支持向量机分类 317
A.6 二元分类器的评价指标 318
附录B 目标检测和分割 321
B.1 目标检测 321
B.1.1 R-CNN 322
B.1.2 Fast R-CNN 324
B.1.3 Faster R-CNN 325
B.2 语义分割 327
B.2.1 上采样技术 328
B.2.2 反卷积网络 332
B.2.3 U-Net 333
B.3 Mask R-CNN 实例分割 334
附录C Word2vec和GloVe之外的词嵌入 337
C.1 Wordpieces 337
C.2 FastText 339
C.3 基于字符的方法 339
C.4 ELMo 343
C.5 相关工作 345
附录D GPT、BERT和
RoBERTa 346
D.1 GPT 346
D.2 BERT 349
D.2.1 掩码语言模型任务 349
D.2.2 下一句预测任务 350
D.2.3 BERT的输入输出表示 351
D.2.4 BERT在NLP任务中的
应用 352
D.3 RoBERTa 352
D.4 GPT和BERT的前期工作 354
D.5 基于Transformer的其他模型 354
附录E Newton-Raphson法与梯度
下降法 356
E.1 Newton-Raphson求根法 356
E.2 Newton-Raphson法与梯度下降法
的关系 358
附录F 数字分类网络的矩阵实现 359
F.1 单一矩阵 359
F.2 小批量实现 361
附录G 卷积层与数学卷积的关系 365
附录H 门控循环单元 369
H.1 GRU的替代实现 371
H.2 基于GRU的网络 371
附录I 搭建开发环境 374
I.1 Python 374
I.2 编程环境 375
I.2.1 Jupyter Notebook 375
I.2.2 使用集成开发环境 375
I.3 编程示例 376
I.4 数据集 376
I.4.1 MNIST数据集 377
I.4.2 来自美国人口普查局的
书店销售数据 377
I.4.3 古腾堡工程的FRANKENSTEIN文本 378
I.4.4 GloVe词嵌入 378
I.4.5 ANKI双语句子对 378
I.4.6 COCO数据集 378
I.5 安装深度学习框架 378
I.5.1 系统安装 378
I.5.2 虚拟环境安装 379
I.5.3 GPU加速 379
I.5.4 Docker容器 379
I.5.5 使用云服务 380
I.6 TensorFlow具体注意事项 380
I.7 PyTorch与TensorFlow的关键
区别 380
I.7.1 需要编写我们自己的拟合/
训练函数 381
I.7.2 NumPy和PyTorch之间的
数据显式移动 381
I.7.3 CPU和GPU之间的数据
显式传输 382
I.7.4 明确区分训练和推理 382
I.7.5 顺序式API与函数式
API 382
I.7.6 缺乏编译功能 383
I.7.7 循环层和状态处理 383
I.7