
深度学习如今已经成为了科技领域最炙手可热的技术,在本书中,我们将帮助你入门深度学习的领域。本书将从人工智能的介绍入手,了解机器学习和深度学习的基础理论,并学习如何用PyTorch框架对模型进行搭建。通过阅读本书,你将会学习到机器学习中的线性回归和logistic回归,深度学习的优化方法,多层全连接神经网络,卷积神经网络,循环神经网络以及生成对抗网络,同时从零开始对PyTorch进行学习,了解PyTorch基础及如何用其进行模型的搭建,最后通过实战了解最前沿的研究成果和PyTorch在实际项目中的应用。
随着AlphaGo 以3:1 的成绩战胜李世石,人们对人工智能的热情如井喷式增长,你 也许对人工智能充满兴趣,向往着了解机器学习,特别是深度学习,那么本书恰好能够 由浅及深地带你进入深度学习这个世界。 讲深度学习的书有很多,深度学习的框架也有很多,本书将以PyTorch 为工具从基 础的线性回归开始,讲到时下最前沿的生成对抗网络,并在其中穿插PyTorch 的教学, 所以本书不仅仅是深度学习的入门指南,同时也是PyTorch 的入门教程。 本书针对的对象是对深度学习有所了解、用过一些深度学习框架(如使用Tensor- Flow 跑过简单的模型),但是希望能够用PyTorch 进行深度学习研究和学习的入门者。 阅读本书并不需要太多的数学基础,但是需要一定的Python 基础。本书中的数学推导 不多,感觉困难的读者可以跳过,这对理解全书的主要内容不会造成影响。 本书的主要内容包括: 第1 章,深度学习介绍; 第2 章,深度学习框架; 第3 章,多层全连接神经网络; 第4 章,卷积神经网络; 第5 章,循环神经网络; 第6 章,生成对抗网络; 第7 章,深度学习实战。 建议读者按照本书的内容顺序学习,因为后面的内容会以前面的内容为基础,另外 本书的全部代码放在了https://github.com/SherlockLiao/code-of-learn-deep-learning-withpytorch 中,读者可以前往下载。 本书面向的对象是初学者,学习完本书之后,读者能够大致了解深度学习的基本知 识,基本掌握PyTorch 的使用方法,知道如何根据实际问题搭建对应的深层网络结构, 并能够进行调参得到较好的结果。当然本书只是一本入门读物,如果希望以后从事该 领域的研究,仅靠此书是不够的,需要阅读更多专业的书籍和学术论文。 在本书的创作过程离不开很多人对我的帮助,书中的一部分内容参考了李飞飞教 授在斯坦福大学开设的课程cs231n,以及台湾国立大学教授李宏毅开始的MLDS,除此 之外还参考了网络上的一些图例,因为大多找不到出处,所以无法一一列出进行感谢。 除此之外,还感谢在写书的过程中我的家人对我的鼓励和信任,正是他们的支持 让我能够坚持写完整本书。 最后,感谢电子工业出版社给我这次机会让我能够出版此书,同时也感谢孙学瑛 编辑全程对我的帮助。 由于本人水平有限,书中存在的纰漏,欢迎大家向我指出,我也很高兴收到大家的 意见和建议,不胜感激。 廖星宇 中国科学技术大学数学系 E-mail:sherlockliao01@gmail.com
第1 章深度学习介绍1 1.1 人工智能. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2 数据挖掘、机器学习与深度学习. . . . . . . . . . . . . . . . . . . . . . . 2 1.2.1 数据挖掘. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.2.2 机器学习. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.2.3 深度学习. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.3 学习资源与建议. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 第2 章深度学习框架11 2.1 深度学习框架介绍. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.2 PyTorch 介绍. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.2.1 什么是PyTorch . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.2.2 为何要使用PyTorch . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.3 配置PyTorch 深度学习环境. . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.3.1 操作系统的选择. . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.3.2 Python 开发环境的安装. . . . . . . . . . . . . . . . . . . . . . . . 16 2.3.3 PyTorch 的安装. . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 第3 章多层全连接神经网络24 3.1 热身:PyTorch 基础. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 3.1.1 Tensor(张量) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 3.1.2 Variable(变量) . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 3.1.3 Dataset(数据集) . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 3.1.4 nn.Module(模组) . . . . . . . . . . . . . . . . . . . . . . . . . . 29 3.1.5 torch.optim(优化) . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.1.6 模型的保存和加载. . . . . . . . . . . . . . . . . . . . . . . . . . 31 3.2 线性模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 3.2.1 问题介绍. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 3.2.2 一维线性回归. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 3.2.3 多维线性回归. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 3.2.4 一维线性回归的代码实现. . . . . . . . . . . . . . . . . . . . . . 35 3.2.5 多项式回归. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 3.3 分类问题. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 3.3.1 问题介绍. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 3.3.2 Logistic 起源. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 3.3.3 Logistic 分布. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 3.3.4 二分类的Logistic 回归. . . . . . . . . . . . . . . . . . . . . . . . 43 3.3.5 模型的参数估计. . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 3.3.6 Logistic 回归的代码实现. . . . . . . . . . . . . . . . . . . . . . . 45 3.4 简单的多层全连接前向网络. . . . . . . . . . . . . . . . . . . . . . . . . 49 3.4.1 模拟神经元. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 3.4.2 单层神经网络的分类器. . . . . . . . . . . . . . . . . . . . . . . . 50 3.4.3 激活函数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 3.4.4 神经网络的结构. . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 3.4.5 模型的表示能力与容量. . . . . . . . . . . . . . . . . . . . . . . . 55 3.5 深度学习的基石:反向传播算法. . . . . . . . . . . . . . . . . . . . . . . 57 3.5.1 链式法则. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 3.5.2 反向传播算法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 3.5.3 Sigmoid 函数举例. . . . . . . . . . . . . . . . . . . . . . . . . . . 58 3.6 各种优化算法的变式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 3.6.1 梯度下降法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 3.6.2 梯度下降法的变式. . . . . . . . . . . . . . . . . . . . . . . . . . 62 3.7 处理数据和训练模型的技巧. . . . . . . . . . . . . . . . . . . . . . . . . 64 3.7.1 数据预处理. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 3.7.2 权重初始化. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 3.7.3 防止过拟合. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 3.8 多层全连接神经网络实现MNIST 手写数字分类. . . . . . . . . . . . . . 69 3.8.1 简单的三层全连接神经网络. . . . . . . . . . . . . . . . . . . . . 70 3.8.2 添加激活函数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 3.8.3 添加批标准化. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 3.8.4 训练网络. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 第4 章卷积神经网络76 4.1 主要任务及起源. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 4.2 卷积神经网络的原理和结构. . . . . . . . . . . . . . . . . . . . . . . . . 77 4.2.1 卷积层. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 4.2.2 池化层. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 4.2.3 全连接层. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 4.2.4 卷积神经网络的基本形式. . . . . . . . . . . . . . . . . . . . . . 85 4.3 PyTorch 卷积模块. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 4.3.1 卷积层. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 4.3.2 池化层. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 4.3.3 提取层结构. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 4.3.4 如何提取参数及自定义初始化. . . . . . . . . . . . . . . . . . . . 91 4.4 卷积神经网络案例分析. . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 4.4.1 LeNet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 4.4.2 AlexNet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 4.4.3 VGGNet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 4.4.4 GoogLeNet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 4.4.5 ResNet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 4.5 再实现MNIST 手写数字分类. . . . . . . . . . . . . . . . . . . . . . . . . 103 4.6 图像增强的方法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 4.7 实现cifar10 分类. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 第5 章循环神经网络111 5.1 循环神经网络. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 5.1.1 问题介绍. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 5.1.2 循环神经网络的基本结构. . . . . . . . . . . . . . . . . . . . . . 112 5.1.3 存在的问题. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 5.2 循环神经网络的变式:LSTM 与GRU . . . . . . . . . . . . . . . . . . . . 116 5.2.1 LSTM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 5.2.2 GRU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 5.2.3 收敛性问题. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 5.3 循环神经网络的PyTorch 实现. . . . . . . . . . . . . . . . . . . . . . . . 122 5.3.1 PyTorch 的循环网络模块. . . . . . . . . . . . . . . . . . . . . . . 122 5.3.2 实例介绍. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 5.4 自然语言处理的应用. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 5.4.1 词嵌入. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 5.4.2 词嵌入的PyTorch 实现. . . . . . . . . . . . . . . . . . . . . . . . 133 5.4.3 N Gram 模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 5.4.4 单词预测的PyTorch 实现. . . . . . . . . . . . . . . . . . . . . . . 134 5.4.5 词性判断. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 5.4.6 词性判断的PyTorch 实现. . . . . . . . . . . . . . . . . . . . . . . 137 5.5 循环神经网络的更多应用. . . . . . . . . . . . . . . . . . . . . . . . . . . 140 5.5.1 Many to one . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 5.5.2 Many to Many(shorter) . . . . . . . . . . . . . . . . . . . . . . . 141 5.5.3 Seq2seq . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 5.5.4 CNN+RNN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 第6 章生成对抗网络144 6.1 生成模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 6.1.1 自动编码器. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 6.1.2 变分自动编码器. . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 6.2 生成对抗网络. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 6.2.1 何为生成对抗网络. . . . . . . . . . . . . . . . . . . . . . . . . . 153 6.2.2 生成对抗网络的数学原理. . . . . . . . . . . . . . . . . . . . . . 160 6.3 Improving GAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 6.3.1 Wasserstein GAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 6.3.2 Improving WGAN . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 6.4 应用介绍. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 6.4.1 Conditional GAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 6.4.2 Cycle GAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 第7 章深度学习实战173 7.1 实例一——猫狗大战:运用预训练卷积神经网络进行特征提取与预测. 173 7.1.1 背景介绍. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 7.1.2 原理分析. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 7.1.3 代码实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 7.1.4 总结. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 7.2 实例二——Deep Dream:探索卷积神经网络眼中的世界. . . . . . . . . 183 7.2.1 原理介绍. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 7.2.2 预备知识:backward . . . . . . . . . . . . . . . . . . . . . . . . . 185 7.2.3 代码实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 7.2.4 总结. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 7.3 实例三——Neural-Style:使用PyTorch 进行风格迁移. . . . . . . . . . . 196 7.3.1 背景介绍. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 7.3.2 原理分析. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 7.3.3 代码实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 7.3.4 总结. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 7.4 实例四——Seq2seq:通过RNN 实现简单的Neural Machine Translation . 205 7.4.1 背景介绍. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 7.4.2 原理分析. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 7.4.3 代码实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 7.4.4 总结. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
廖星宇,目前就读于中国科学技术大学应用数学系,获得国家一等奖学金。在个人博客、知乎等平台上发布多篇关于深度学习的文章,具有一定的阅读量和人气。