
本书不仅包含人工智能、机器学习及深度学习的基础知识,如卷积神经网络、循环神经网络、生成对抗网络等,而且也囊括了学会使用 TensorFlow、PyTorch 和 Keras 这三个主流的深度学习框架的最小知识量;不仅有针对相关理论的深入解释,而且也有实用的技巧,包括常见的优化技巧、使用多 GPU 训练、调试程序及将模型上线到生产系统中。本书希望同时兼顾理论和实战,使读者既能深入理解理论知识,又能把理论知识用于实战,因此本书每介绍完一个模型都会介绍其实现,读者阅读完一个模型的介绍之后就可以运行、阅读和修改相关代码,从而可以更加深刻地理解理论知识。
前言 我与人工智能 1997 年夏天,我在电脑上跟一个叫“将族”的中国象棋软件(CCH)下棋时,IBM 的深蓝击败了国际象棋世界冠军卡斯帕罗夫。没想到,数年之后我竟亲手编写人工智能应用,比如酒店和机票的爬虫、酒店知识图谱的构建、酒店评论的分析、图片的去重鉴黄、旅游领域全文搜索引擎,相关性搜索的改进和知识图谱的构建工作。没想到,人工智能会如此受关注,我作为一位从业者,当然希望人工智能能有更大的发展,希望不同行业的人能更多地了解目前人工智能,尤其是深度学习,而不希望大家对于人工智能只从一些科谱文章或媒体文章中获取过于乐观或悲观的信息。 从一位人工智能老兵的角度出发,对于人工智能,我认为只有真正地理解其原理,知道目前技术的边界在哪里,并动手用它解决实际问题,才是正确认知人工智能的途径,也是我编写本书的初始动机和最终目标。 本书的特点 市面上关于深度学习的书籍很多,大多分两类:一类只关注理论,多为会议论文集,更多关注基础理论和前沿进展,这类书籍通常比较难懂,而且读完之后仍然不知道怎么动手解决问题;另一类更关注应用,多为框架工具的介绍,偶尔提及一些理论也点到为止,在读者看来各种算法只是一个黑盒子,虽然能跑起来,但是知其然不知其所以然,不知道怎么调优,碰到问题时更加不知道怎么解决。 本书希望同时兼顾理论和应用,使读者既能深入理解理论知识,又能把理论知识用于实践,因此本书每介绍完一个模型都会介绍其实现,读者阅读完一个模型的介绍之后就可以运行、阅读和修改一下相关代码,从而可以更加深刻地理解理论知识。 从我开始写下第一个字到现在,前后跨越四年,一方面是因为工作忙,写作时间都是挤出来的,另一方面是我希望写好书,不奢求立言,但总归对后来进入人工智能行业的技术工程人员能有帮助。书中每一个知识点、每一行代码,均是我学懂、做会之后写下来的,里面有很多技巧也是我从多年工作当中沉淀下来的。 适合读者 我最初的写作目标是让本书具有自包含性,意即初入行者只要买了我的这本书,就什么都能学得到,也能学得会,本书读者只要有 Python 编程基础就能初步踏入人工智能行业的大门,因此本书不仅有人工智能、机器学习的基础知识,而且囊括了学会 Tensorflow、PyTorch 和 Keras 三个主流的深度学习框架的最小知识量;不仅有针对很多理论的深入解释,也能学到一些实用的技巧,包括常见的优化技巧、使用多 GPU 训练、调试程序及把模型上线到生产系统中。 本书主要内容 本书共包含 8 章,每章的主要内容如下: 第 1 章介绍人工智能的发展历程和机器学习的基本概念,使用通俗的语言介绍机器学习任务 的分类、常见模型、损失函数和衡量指标,最后通过一个简单的线性回归示例来加深对这些概念 的理解。 第 2 章介绍全连接神经网络的基本概念和反向传播算法的详细推导过程,不使用框架完全自己实现一个多层的神经网络来识别 MNIST 的手写数字。接下来介绍基本的优化技巧,包括激活函数的选择、参数的初始化、Dropout、Batch Normalization 和 Adam 等学习率自适应算法。 第 3 章介绍卷积神经网络,使用卷积神经网络来解决 MNIST 和 CIFAR-10 数据集的识别问题,通过 CIFAR-10 的例子介绍怎么在 TensorFlow 里使用多 GPU 训练,最后介绍残差神经网络。 第 4 章介绍循环神经网络,使用它来实现姓名分类及生成莎士比亚风格的句子,接着会介绍Seq2Seq 模型和注意力机制,使用它们来实现英语-法语、汉语-英语的机器翻译系统。 第 5 章介绍生成对抗网络,介绍对抗训练的基本原理和 DCGAN 模型,最后使用 DCGAN 来 实现人脸照片的生成。 第 6 章介绍 TensorFlow,首先介绍基本概念、优化器和数据输入输出等,然后介绍全连接神 经网络和卷积神经网络等常见网络结构。因为 RNN 的复杂性,我们单独使用一节来详细介绍怎 么在 TensorFlow 使用 RNN、LSTM 和 GRU。接着介绍高层的 Estimator API 和 TensorBoard,以 及怎么调试 TensorFlow 代码。最后介绍模型的保存和 TensorFlow Serving。 第 7 章介绍 PyTorch,通过使用不同的方法来实现三层的神经网络来重点介绍 Autograd,包 括数据的加载和处理,最后是一个迁移学习的示例。 第 8 章介绍 Keras,包括卷积神经网络、残差神经网络和循环神经网络在 Keras 里的用法,最 后通过简短的代码示例来演示怎么实现文本图片的分类、图片问答和视频问答。 致谢 首先要感谢我的家人尤其是我的妻子对我的支持,让我有更多的时间来完成这本书。感谢我 的女儿,她给了我很多的灵感和持续学习的动力。感谢出版社的编辑团队为这本书的写作和出版 付出的诸多努力。最后本书的写作过程中参考了非常多的文献、资料和开源代码,感谢他们的免 费开放和授权使用。
目录 第 1 章 人工智能的基本概念 1 1.1 人工智能的发展历史 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2 机器学习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.3 常见的监督学习模型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.4 衡量指标 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.5 损失函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 1.6 优化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 1.7 过拟合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 1.8 机器学习示例:线性回归 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 第 2 章 神经网络 27 2.1 手写数字识别问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 2.2 单个神经元和多层神经网络 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 2.3 用代码实战多层神经网络 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 2.4 多层神经网络构建代码解析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 2.5 反向传播算法的推导 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 2.6 代码实现反向传播算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 2.7 为什么反向传播算法是一个高效的算法 . . . . . . . . . . . . . . . . . . . . . . . . . 50 2.8 优化技巧 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 第 3 章 卷积神经网络 59 3.1 卷积神经网络简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 3.2 局部感知域 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 3.3 特征映射 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 3.4 池化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 3.5 构建完整的卷积神经网络 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 3.6 填充和步长 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 3.7 CNN 识别 MNIST 手写数字 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 3.8 CNN 模型识别 CIFAR-10 图像 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 3.9 使用残差网络识别 MNIST 图像 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 第 4 章 循环神经网络 101 4.1 基本概念 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 4.2 RNN 的扩展 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 4.3 Word Embedding 简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 4.4 姓名分类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 4.5 RNN 生成莎士比亚风格句子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 4.6 机器翻译 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 4.7 汉语—英语翻译的批量训练 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 第 5 章 生成对抗网络 156 5.1 为什么研究生成模型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 5.2 生成模型的原理以及 GAN 与其他生成模型的区别 . . . . . . . . . . . . . . . . . . . 159 5.3 GAN 的原理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 5.4 深度卷积生成对抗网络 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 5.5 反卷积 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 5.6 DCGAN 实战 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 第 6 章 TensorFlow 196 6.1 TensorFlow 简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 6.2 Opitimizer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 6.3 数据的处理和输入 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226 6.4 常见网络结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250 6.5 RNN 在 TensorFlow 中的实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 6.6 TensorBoard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 6.7 高层 API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281 6.8 调试 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309 6.9 TensorFlow Serving . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316 第 7 章 PyTorch 343 7.1 基础知识 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343 7.2 PyTorch 神经网络简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350 7.3 训练一个分类器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354 7.4 使用 NumPy 实现三层神经网络 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363 7.5 使用 Tensor 实现三层神经网络 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364 7.6 使用 autograd 实现三层神经网络 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365 7.7 使用自定义的 ReLU 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367 7.8 和 TensorFlow 的对比 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369 7.9 使用 nn 模块实现三层神经网络 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370 7.10 使用 optim 包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 7.11 自定义 nn 模块 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373 7.12 流程控制和参数共享 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374 7.13 迁移学习示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375 7.14 数据的加载和预处理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382 第 8 章 Keras 393 8.1 Keras 简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393 8.2 Hello World . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393 8.3 Sequential API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395 8.4 多分类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398 8.5 两分类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400 8.6 1D 卷积进行序列分类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400 8.7 多层 LSTM 序列分类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402 8.8 有状态的 LSTM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404 8.9 Functional API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405 8.10 判断两个数字是否是同一个数字 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410 8.11 图片问答 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411 8.12 视频问答 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413