人工智能的发展日新月异,大学等研究机构和互联网巨头投入大量的经费和人力到这场没有硝烟的战争中,谁能在这场天王山之战占据有利地位,谁就能在未来的竞争中一马当先。2016年3月,Google研发的AlphaGo与围棋世界冠军、职业九段棋手李世石进行了惊心动魄的围棋人机大战,并以4:1的比分赢得胜利。2017年3月,第二代的AlphaGo与柯洁在乌镇围棋峰会上的比赛中以3:0获胜。2017年10月,Google推出了最强版的AlphaGoAlphaGo Zero,经过3天的自我训练就打败了第一版的AlphaGo,经过40天的自我训练打败了第二代的AlphaGo。2018年5月,Google在I/O大会上推出打电话的AIDuplex,模仿真人的语气打电话,通过多轮对话,帮助用户完成餐馆预订和美发沙龙预约等。Google母公司董事长宣称,Duplex部分通过了图灵测试。(图灵测试被认为是考验机器是否拥有智能的测试:如果一个机器能在与人交流沟通的过程中不被识别出机器身份,那么这个机器就具有智能。)这个系统虽然离真正的人工智能尚远,但是这种人机交互技术对很多产业产生了深远的影响。这些影响深远的技术背后就是深度学习。
各大巨头尽力建立以深度学习框架为核心的AI生态系统。2017年年初,深度学习框架PyTorch横空出世。这个Facebook推出的框架是一个支持强大GPU加速的张量计算,构建基于Autograd系统的深度学习研究平台。其一面世,就以简洁优雅的接口、能够快速实现的代码和直观灵活且简单的网络结构给业界留下了深刻的印象。作为一个在2017年才诞生的深度学习框架,PyTorch相关学习文档和资料缺乏,而笔者在研究和实践的过程中进行了大量的深度学习模型构建和使用,对PyTorch简洁且灵活的编程风格深有体会,因此决定编写一本用PyTorch进行机器学习和深度学习入门的图书。
本书主要针对的是对深度学习有一定了解、希望用PyTorch进行机器学习和深度学习研究的初学者。阅读本书不需要太多的数学基础,但需要有一定的编程基础,特别是要求有Python编程经验。希望读者学完本书后,能够对深度学习有大致的了解,基本掌握PyTorch的使用方法,知道如何根据基于PyTorch的深度神经网络模型来解决实际问题,并能够利用各种模型调参的方法进行模型优化。本书仅仅是一本入门的图书,要对深度学习进行深入研究的学习者,还要更加深入阅读相关专业书籍和学术论文。
本书从机器学习原理入手,延伸到神经网络,直至深度学习,由浅入深地阐述深度学习中的各个分支,即深度神经网络、卷积神经网络、自编码器、循环神经网络等,同时穿插PyTorch框架的知识点和基于知识点的实例。最后,综合运用PyTorch和深度学习理论来解决实践中的具体问题,比如文本分类和关键词识别等。可以说,本书是深度学习和PyTorch的入门教程,引导读者进入机遇和挑战共存的人工智能领域。
本书的代码开源在GitHub上,具体地址是https://github.com/xiaobaoonline/pytorch-in-action。代码以章节划分文件夹,每个函数的作用和细节在代码中均有注释,以便帮助理解。本书的代码在PyTorch0.3上运行,由于Python2即将过时,因此本书代码只支持Python3。大部分代码既支持CPU又支持GPU,但第8章有部分代码只支持GPU,读者在运行代码的过程中要注意相关提示。
由于编者水平有限,书中难免出现不太准确的地方,恳请读者批评指正。大家可以在https://github.com/xiaobaoonline/pytorch-in-action/issues处提出意见和反馈,让我们在机器学习之路上共同进步。
在本书写作的过程中,得到不少人的鼓励和支持。首先要感谢校宝在线(杭州)科技股份公司(证券代码:870705)上下的鼎力支持,特别是公司董事长兼CEO张以弛先生的大力支持,让我们在工作之余有足够的时间投入本书写作中。然后,感谢家人的鼓励和支持,没有他们,这本书的写作将不可能完成。除此之外,在写作和编码的过程中,还参考了很多书籍和资料,在此表示感谢。
编 者
2018年7月
序
前言
第1章 深度学习介绍1
1.1 人工智能、机器学习与深度学习2
1.2 深度学习工具介绍5
1.3
PyTorch介绍7
1.4 你能从本书中学到什么9
第2章 PyTorch安装和快速上手11
2.1
PyTorch安装12
2.1.1
Anaconda安装12
2.1.2
PyTorch安装19
2.2
Jupyter Notebook使用19
2.3
NumPy基础知识22
2.3.1
基本概念23
2.3.2
创建数组24
2.3.3
基本运算26
2.3.4
索引、切片和迭代27
2.3.5 数组赋值32
2.3.6
更改数组的形状33
2.3.7
组合、拆分数组34
2.3.8
广播35
2.4
PyTorch基础知识37
2.4.1
Tensor简介37
2.4.2
Variable简介38
2.4.3
CUDA简介38
2.4.4
模型的保存与加载39
2.4.5
第一个PyTorch程序40
第3章 神经网络43
3.1 神经元与神经网络44
3.2 激活函数46
3.2.1
Sigmoid47
3.2.2
Tanh48
3.2.3
Hard Tanh49
3.2.4
ReLU50
3.2.5
ReLU的扩展51
3.2.6
Softmax54
3.2.7
LogSoftmax55
3.3 前向算法55
3.4 损失函数57
3.4.1
损失函数的概念57
3.4.2
回归问题57
3.4.3
分类问题58
3.4.4
PyTorch中常用的损失函数59
3.5 反向传播算法62
3.6 数据的准备65
3.7
PyTorch实例:单层神经网络实现66
第4章 深度神经网络及训练70
4.1 深度神经网络72
4.1.1
神经网络为何难以训练72
4.1.2
改进策略74
4.2 梯度下降75
4.2.1
随机梯度下降75
4.2.2
Mini-Batch梯度下降75
4.3 优化器77
4.3.1
SGD77
4.3.2
Momentum77
4.3.3
AdaGrad78
4.3.4
RMSProp79
4.3.5
Adam80
4.3.6
选择正确的优化算法81
4.3.7
优化器的使用实例82
4.4 正则化85
4.4.1
参数规范惩罚85
4.4.2
Batch Normalization86
4.4.3
Dropout87
4.5
PyTorch实例:深度神经网络实现89
第5章 卷积神经网络93
5.1 计算机视觉95
5.1.1
人类视觉和计算机视觉95
5.1.2
特征提取95
5.1.3
数据集97
5.2 卷积神经网络100
5.2.1
卷积层102
5.2.2
池化层104
5.2.3
经典卷积神经网络105
5.3
MNIST数据集上卷积神经网络的实现110
第6章 嵌入与表征学习114
6.1 PCA115
6.1.1
PCA原理115
6.1.2
PCA的PyTorch实现116
6.2 自编码器117
6.2.1
自编码器原理118
6.2.2
PyTorch实例:自编码器实现118
6.2.3
PyTorch实例:基于自编码器的图形去噪122
6.3 词嵌入125
6.3.1
词嵌入原理125
6.3.2
PyTorch实例:基于词向量的语言模型实现128
第7章 序列预测模型132
7.1 序列数据处理133
7.2 循环神经网络134
7.3
LSTM和GRU138
7.4
LSTM在自然语言处理中的应用142
7.4.1
词性标注142
7.4.2
情感分析144
7.5 序列到序列网络145
7.5.1
序列到序列网络原理145
7.5.2
注意力机制146
7.6
PyTorch实例:基于GRU和Attention 的机器翻译147
7.6.1
公共模块147
7.6.2
数据处理147
7.6.3
模型定义151
7.6.4
训练模块定义155
7.6.5
训练和模型保存161
7.6.6
评估过程162
第8章 PyTorch项目实战165
8.1 图像识别和迁移学习猫狗大战166
8.1.1
迁移学习介绍166
8.1.2
计算机视觉工具包166
8.1.3
猫狗大战的PyTorch实现167
8.2 文本分类172
8.2.1
文本分类的介绍173
8.2.2
计算机文本工具包174
8.2.3
基于CNN的文本分类的PyTorch实现174
8.3 语音识别系统介绍182
8.3.1
语音识别介绍182
8.3.2
命令词识别的PyTorch实现183