动⼿学深度学习
A. Zhang, M. Li, Z. C. Lipton, and A. J. Smola
2018年 12⽉ 23⽇
⽬录
1 引⾔
1.1 前⾔ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 深度学习简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3 如何使⽤本书 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2 预备知识
2.1 获取和运⾏本书代码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 数据操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3 ⾃动求梯度 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.4 查阅 MXNet⽂档 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3 深度学习基础
3.1 线性回归 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2 线性回归的从零开始实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.3 线性回归的 Gluon实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Softmax回归 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.5 图像分类数据集(Fashion-MNIST) . . . . . . . . . . . . . . . . . . . . . . . .
Softmax回归的从零开始实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Softmax回归的 Gluon实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.8 多层感知机 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.6
3.7
3.4
1
1
6
16
21
21
25
33
36
41
41
47
53
57
62
66
71
73
i
81
83
84
93
3.9 多层感知机的从零开始实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.10 多层感知机的 Gluon实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.11 模型选择、⽋拟合和过拟合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.12 权重衰减 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.13 丢弃法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
3.14 正向传播、反向传播和计算图 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
3.15 数值稳定性和模型初始化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
3.16 实战 Kaggle⽐赛:房价预测 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
4 深度学习计算
4.1 模型构造 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
4.2 模型参数的访问、初始化和共享 . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
4.3 模型参数的延后初始化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
4.4 ⾃定义层 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
4.5 读取和存储 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
4.6 GPU计算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
5 卷积神经⽹络
5.1 ⼆维卷积层 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
5.2 填充和步幅 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
5.3 多输⼊通道和多输出通道 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
5.4 池化层 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
5.5 卷积神经⽹络(LeNet) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
5.6 深度卷积神经⽹络(AlexNet) . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
5.7 使⽤重复元素的⽹络(VGG) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
5.8 ⽹络中的⽹络(NiN) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
5.9 含并⾏连结的⽹络(GoogLeNet) . . . . . . . . . . . . . . . . . . . . . . . . . . 181
5.10 批量归⼀化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
5.11 残差⽹络(ResNet) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
5.12 稠密连接⽹络(DenseNet) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
6 循环神经⽹络
6.1 语⾔模型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
6.2 循环神经⽹络 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
6.3 语⾔模型数据集(周杰伦专辑歌词) . . . . . . . . . . . . . . . . . . . . . . . . 210
203
121
145
ii
6.4 循环神经⽹络的从零开始实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
6.5 循环神经⽹络的 Gluon实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
6.6 通过时间反向传播 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
6.7 ⻔控循环单元(GRU) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
6.8 ⻓短期记忆(LSTM) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
6.9 深度循环神经⽹络 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
6.10 双向循环神经⽹络 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
7 优化算法
7.1 优化与深度学习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
7.2 梯度下降和随机梯度下降 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
7.3 小批量随机梯度下降 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
7.4 动量法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
249
7.5 Adagrad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
7.6 RMSProp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
7.7 Adadelta
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
7.8 Adam . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
8 计算性能
8.1 命令式和符号式混合编程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
8.2 异步计算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
8.3 ⾃动并⾏计算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
8.4 多 GPU计算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
8.5 多 GPU计算的 Gluon实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
9 计算机视觉
9.1 图像增⼴ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
9.2 微调 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
9.3 ⽬标检测和边界框 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
9.4 锚框 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
9.5 多尺度⽬标检测 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
9.6 ⽬标检测数据集(⽪卡丘) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356
9.7 单发多框检测(SSD) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
9.8 区域卷积神经⽹络(R-CNN)系列 . . . . . . . . . . . . . . . . . . . . . . . . . . 371
9.9 语义分割和数据集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378
293
323
iii
423
9.10 全卷积⽹络(FCN) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384
9.11 样式迁移 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
9.12 实战 Kaggle⽐赛:图像分类(CIFAR-10) . . . . . . . . . . . . . . . . . . . . . 404
9.13 实战 Kaggle⽐赛:狗的品种识别 (ImageNet Dogs) . . . . . . . . . . . . . . . . . 413
10 ⾃然语⾔处理
10.1 词嵌⼊(word2vec) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
10.2 近似训练 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
10.3 Word2vec的实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432
10.4 ⼦词嵌⼊(fastText) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443
10.5 全局向量的词嵌⼊(GloVe) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444
10.6 求近义词和类⽐词 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448
10.7 ⽂本情感分类:使⽤循环神经⽹络 . . . . . . . . . . . . . . . . . . . . . . . . . . 452
10.8 ⽂本情感分类:使⽤卷积神经⽹络(textCNN) . . . . . . . . . . . . . . . . . . 458
10.9 编码器—解码器(seq2seq) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
10.10 束搜索 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468
10.11 注意⼒机制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
10.12 机器翻译 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476
11 附录
11.1 主要符号⼀览 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487
11.2 数学基础 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489
11.3 使⽤ Jupyter记事本 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496
11.4 使⽤ AWS运⾏代码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503
11.5 GPU购买指南 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514
11.6 如何为本书贡献 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517
11.7 gluonbook包索引 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522
487
iv
1
引⾔
深度学习在近年来发展极为迅速。它在智能时代深刻改变着⼈类的⽣产⽣活⽅式。本章将简要介
绍什么是深度学习,以及如何使⽤本书。
1.1 前⾔
就在⼏年前,不管在⼤公司还是创业公司,都鲜有⼯程师和科学家来将深度学习应⽤到智能产品
与服务中。作为深度学习前⾝的神经⽹络,才刚刚摆脱被机器学习学术界认为是过时⼯具的印象。
那个时候,即使是机器学习也⾮新闻头条的常客。它仅仅被看作是⼀⻔具有前瞻性,并拥有⼀系
列小范围实际应⽤的学科。在包含计算机视觉和⾃然语⾔处理在内的实际应⽤通常需要⼤量的相
关领域知识:这些实际应⽤被视为相互独⽴的领域,而机器学习只占其中⼀小部分。
然而仅仅在这⼏年之内,深度学习便令全世界⼤吃⼀惊。它⾮常有⼒地推动了计算机视觉、⾃然
语⾔处理、⾃动语⾳识别、强化学习和统计建模等多个领域的快速发展。随着这些领域的不断进
步,我们现在可以制造⾃动驾驶的汽⻋,通过短信、邮件甚⾄电话的⾃动回复系统,以及在围棋
中击败最优秀⼈类选⼿的软件。这些由深度学习带来的新⼯具也正产⽣着⼴泛的影响:它们改变
1
了电影制作和疾病诊断的⽅式,并在从天体物理学到⽣物学等各个基础科学中扮演越来越重要的
⻆⾊。
与此同时,深度学习也给它的使⽤者们带来了独⼀⽆⼆的挑战:任何单⼀的应⽤都汇集了各学科
的知识。具体来说,应⽤深度学习需要同时理解:
1. 问题的动机和特点;
2. 将⼤量不同类型神经⽹络层通过特定⽅式组合在⼀起的模型背后的数学原理;
3. 在原始数据上拟合极复杂的深层模型的优化算法;
4. 有效训练模型、避免数值计算陷阱以及充分利⽤硬件性能所需的⼯程技能;
5. 为解决⽅案挑选合适的变量(超参数)组合的经验。
同样,我们⼏位作者也⾯临前所未有的挑战:我们需要在有限的篇幅⾥糅合深度学习的多⽅⾯知
识,从而使读者能够较快理解并应⽤深度学习技术。本书代表了我们的⼀种尝试:我们将教给读
者概念、背景知识和代码;我们将在同⼀个地⽅阐述剖析问题所需的批判性思维、解决问题所需
的数学知识,以及实现解决⽅案所需的⼯程技能。
1.1.1 包含代码、数学、⽹⻚、讨论的统⼀资源
我们在 2017年 7⽉启动了写作这本书的项⽬。当时我们需要向⽤⼾解释 Apache MXNet在那时
的新接口 Gluon。不幸的是,我们并没有找到任何⼀个资源可以同时满⾜以下⼏点需求:
1. 包含较新的⽅法和应⽤,并不断更新;
2. ⼴泛覆盖现代深度学习技术并具有⼀定的技术深度;
3. 既是严谨的教科书,⼜是包含可运⾏代码的⽣动的教程。
那时,我们在博客和 Github上找到了⼤量的演⽰特定深度学习框架(例如⽤ TensorFlow进⾏
数值计算)或实现特定模型(例如 AlexNet、ResNet等)的⽰例代码。这些⽰例代码的⼀⼤价值
在于提供了教科书或论⽂往往省略的实现细节,⽐如数据的处理和运算的⾼效率实现。如果不了
解这些,即使能将算法倒背如流,也难以将算法应⽤到⾃⼰的项⽬中去。此外,这些⽰例代码还
使得⽤⼾能通过观察修改代码所导致的结果变化而快速验证想法、积累经验。因此,我们坚信动
⼿实践对于学习深度学习的重要性。然而可惜的是,这些⽰例代码通常侧重于如何实现给定的⽅
法,却忽略了有关算法设计的探究或者实现细节的解释。虽然在像 Distill这样的⽹站和某些博客
上出现了⼀些有关算法设计和实现细节的讨论,但它们常常缺少⽰例代码,并通常仅覆盖深度学
习的⼀小部分。
2
1. 引⾔