18 第1章什么是深度学习 几乎全都投给了浅层机器学习方法的实际应用。到了2014年,这一数字已经涨到了惊人的3.94 亿美元。这三年里创办了数十家创业公司,试图从深度学习炒作中获利。与此同时,Go0ge、 Facebook、百度、微软等大型科技公司已经在内部研究部门进行投资,其金额很可能已经超过 了风险投资的现金流。其中只有少数金额被公之于众:2013年,Google收购了深度学习创业公 司DeepMind,报道称收购价格为5亿美元,这是历史上对人工智能公司的最高收购价格。2014 年,百度在硅谷启动了深度学习研究中心,为该项目投资3亿美元。2016年,深度学习硬件创 业公司Nervana Systems被英特尔收购,收购价格逾4亿美元。 机器学习,特别是深度学习,已成为这些科技巨头产品战略的核心。2015年末,Go0gle首 席执行官Sundar Pichai表示:“机器学习这一具有变革意义的核心技术将促使我们重新思考做所 有事情的方式。我们用心将其应用于所有产品,无论是搜索、广告、YouTube还是Google Play。 我们尚处于早期阶段,但你将会看到我们系统性地将机器学习应用于所有这些领域。”① 由于这波投资热潮,短短五年间从事深度学习的人数从几千人涨到数万人,研究进展也达 到了惊人的速度。目前没有迹象表明这种趋势会在短期内放缓。 1.3.5深度学习的大众化 有许多新面孔进入深度学习领域,而主要的驱动因素之一是该领域所使用工具集的大众 化。在早期,从事深度学习需要精通C+和CUDA,而它们只有少数人才能掌握。如今,具 有基本的Python脚本技能,就可以从事高级的深度学习研究。这主要得益于Theano及随后的 TensorFlow的开发,以及Keras等用户友好型库的兴起。Theano和TensorFlow是两个符号式的 张量运算的Python框架,都支持自动求微分,这极大地简化了新模型的实现过程。Kers等用 户友好型库则使深度学习变得像操纵乐高积木一样简单。Kers在20l5年初发布,并且很快就 成为大量创业公司、研究生和研究人员转向该领域的首选深度学习解决方案。 1.3.6这种趋势会持续吗 深度神经网络成为企业投资和研究人员纷纷选择的正确方法,它究竟有何特别之处?换句 话说,深度学习是否只是难以持续的昙花一现?20年后我们是否仍在使用深度神经网络? 深度学习有几个重要的性质,证明了它确实是人工智能的革命,并且能长盛不衰。20年后 我们可能不再使用神经网络,但我们那时所使用的工具都是直接来自于现代深度学习及其核心 概念。这些重要的性质可大致分为以下三类。 口简单。深度学习不需要特征工程,它将复杂的、不稳定的、工程量很大的流程替换为简 单的、端到端的可训练模型,这些模型通常只用到五六种不同的张量运算。 口可扩展。深度学习非常适合在GPU或TPU上并行计算,因此可以充分利用摩尔定律。此外 深度学习模型通过对小批量数据进行迭代来训练,因此可以在任意大小的数据集上进行 训练。(唯一的瓶颈是可用的并行计算能力,而由于摩尔定律,这一限制会越来越小。) ①参见“Alphabet earnings call'",2015年10月22日
18 第 1 章 什么是深度学习 几乎全都投给了浅层机器学习方法的实际应用。到了 2014 年,这一数字已经涨到了惊人的 3.94 亿美元。这三年里创办了数十家创业公司,试图从深度学习炒作中获利。与此同时,Google、 Facebook、百度、微软等大型科技公司已经在内部研究部门进行投资,其金额很可能已经超过 了风险投资的现金流。其中只有少数金额被公之于众:2013 年,Google 收购了深度学习创业公 司 DeepMind,报道称收购价格为 5 亿美元,这是历史上对人工智能公司的最高收购价格。2014 年,百度在硅谷启动了深度学习研究中心,为该项目投资 3 亿美元。2016 年,深度学习硬件创 业公司 Nervana Systems 被英特尔收购,收购价格逾 4 亿美元。 机器学习,特别是深度学习,已成为这些科技巨头产品战略的核心。2015 年末,Google 首 席执行官 Sundar Pichai 表示:“机器学习这一具有变革意义的核心技术将促使我们重新思考做所 有事情的方式。我们用心将其应用于所有产品,无论是搜索、广告、YouTube 还是 Google Play。 我们尚处于早期阶段,但你将会看到我们系统性地将机器学习应用于所有这些领域。”a 由于这波投资热潮,短短五年间从事深度学习的人数从几千人涨到数万人,研究进展也达 到了惊人的速度。目前没有迹象表明这种趋势会在短期内放缓。 1.3.5 深度学习的大众化 有许多新面孔进入深度学习领域,而主要的驱动因素之一是该领域所使用工具集的大众 化。在早期,从事深度学习需要精通 C++ 和 CUDA,而它们只有少数人才能掌握。如今,具 有基本的 Python 脚本技能,就可以从事高级的深度学习研究。这主要得益于 Theano 及随后的 TensorFlow 的开发,以及 Keras 等用户友好型库的兴起。Theano 和 TensorFlow 是两个符号式的 张量运算的 Python 框架,都支持自动求微分,这极大地简化了新模型的实现过程。Keras 等用 户友好型库则使深度学习变得像操纵乐高积木一样简单。Keras 在 2015 年初发布,并且很快就 成为大量创业公司、研究生和研究人员转向该领域的首选深度学习解决方案。 1.3.6 这种趋势会持续吗 深度神经网络成为企业投资和研究人员纷纷选择的正确方法,它究竟有何特别之处?换句 话说,深度学习是否只是难以持续的昙花一现? 20 年后我们是否仍在使用深度神经网络? 深度学习有几个重要的性质,证明了它确实是人工智能的革命,并且能长盛不衰。20 年后 我们可能不再使用神经网络,但我们那时所使用的工具都是直接来自于现代深度学习及其核心 概念。这些重要的性质可大致分为以下三类。 简单。深度学习不需要特征工程,它将复杂的、不稳定的、工程量很大的流程替换为简 单的、端到端的可训练模型,这些模型通常只用到五六种不同的张量运算。 可扩展。深度学习非常适合在GPU或TPU上并行计算,因此可以充分利用摩尔定律。此外, 深度学习模型通过对小批量数据进行迭代来训练,因此可以在任意大小的数据集上进行 训练。(唯一的瓶颈是可用的并行计算能力,而由于摩尔定律,这一限制会越来越小。) a 参见“Alphabet earnings call”,2015 年 10 月 22 日
书籍下载qg群6089740钉钉群21734177 IT书籍http:/t.cn/RDIAj5D 1.3为什么是深度学习,为什么是现在 19 口多功能与可复用。与之前的许多机器学习方法不同,深度学习模型无须从头开始就可以 在附加数据上进行训练,因此可用于连续在线学习,这对于大型生产模型而言是非常 要的特性。此外,训练好的深度学习模型可用于其他用途,因此是可以重复使用的。举 个例子,可以将一个对图像分类进行训练的深度学习模型应用于视频处理流程。这样我 们可以将以前的工作重新投入到日益复杂和强大的模型中。这也使得深度学习可以适用 于较小的数据集。 深度学习数年来一直备受关注,我们还没有发现其能力的界限。每过一个月,我们都会学 到新的用例和工程改进,从而突破先前的局限。在一次科学革命之后,科学发展的速度通常会 遵循一条S形曲线:首先是一个快速发展时期,接着随着研究人员受到严重限制而逐渐稳定下来, 然后进一步的改进又逐渐增多。深度学习在2017年似乎处于这条S形曲线的前半部分,在未来 几年将会取得更多进展。 电子书寻找看手相钉钉或微信pythontesting
1.3 为什么是深度学习,为什么是现在 19 1 5 3 7 2 6 4 8 9 多功能与可复用。与之前的许多机器学习方法不同,深度学习模型无须从头开始就可以 在附加数据上进行训练,因此可用于连续在线学习,这对于大型生产模型而言是非常重 要的特性。此外,训练好的深度学习模型可用于其他用途,因此是可以重复使用的。举 个例子,可以将一个对图像分类进行训练的深度学习模型应用于视频处理流程。这样我 们可以将以前的工作重新投入到日益复杂和强大的模型中。这也使得深度学习可以适用 于较小的数据集。 深度学习数年来一直备受关注,我们还没有发现其能力的界限。每过一个月,我们都会学 到新的用例和工程改进,从而突破先前的局限。在一次科学革命之后,科学发展的速度通常会 遵循一条 S 形曲线:首先是一个快速发展时期,接着随着研究人员受到严重限制而逐渐稳定下来, 然后进一步的改进又逐渐增多。深度学习在 2017 年似乎处于这条 S 形曲线的前半部分,在未来 几年将会取得更多进展。 书籍下载qq群6089740 钉钉群21734177 IT书籍 http://t.cn/RDIAj5D 电子书寻找看手相 钉钉或微信pythontesting
第2章 神经网络的数学基础 本章包括以下内容: 口第一个神经网络示例 口张量与张量运算 ▣神经网络如何通过反向传播与梯度下降进行学习 要理解深度学习,需要熟悉很多简单的数学概念:张量、张量运算、微分、梯度下降等。 本章目的是用不那么技术化的文字帮你建立对这些概念的直觉。特别地,我们将避免使用数学 符号,因为数学符号可能会令没有任何数学背景的人反感,而且对解释问题也不是绝对必要的。 本章将首先给出一个神经网络的示例,引出张量和梯度下降的概念,然后逐个详细介绍。 请记住,这些概念对于理解后续章节中的示例至关重要。 读完本章后,你会对神经网络的工作原理有一个直观的理解,然后就可以学习神经网络的 实际应用了(从第3章开始)。 2.1初识神经网络 我们来看一个具体的神经网络示例,使用Python的Keras库来学习手写数字分类。如果你 没用过Keras或类似的库,可能无法立刻搞懂这个例子中的全部内容。甚至你可能还没有安装 Keras。没关系,下一章会详细解释这个例子中的每个步骤。因此,如果其中某些步骤看起来有 些随意,或者像魔法一样,也请你不要担心。下面我们要开始了。 我们这里要解决的问题是,将手写数字的灰度图像(28像素×28像索)划分到10个类别 中(0-9)。我们将使用MNST数据集,它是机器学习领域的一个经典数据集,其历史几乎和这 个领域一样长,而且已被人们深入研究。这个数据集包含60000张训练图像和10000张测试图 像,由美国国家标准与技术研究院(National Institute of Standards and Technology,即MNIST中 的NIST)在20世纪80年代收集得到。你可以将“解决”MNIST问题看作深度学习的“Hllo Wold”,正是用它来验证你的算法是否按预期运行。当你成为机器学习从业者后,会发现 MNST一次又一次地出现在科学论文、博客文章等中。图2-1给出了MNIST数据集的一些样本
2 第2章 神经网络的数学基础 本章包括以下内容: 第一个神经网络示例 张量与张量运算 神经网络如何通过反向传播与梯度下降进行学习 要理解深度学习,需要熟悉很多简单的数学概念:张量、张量运算、微分、梯度下降等。 本章目的是用不那么技术化的文字帮你建立对这些概念的直觉。特别地,我们将避免使用数学 符号,因为数学符号可能会令没有任何数学背景的人反感,而且对解释问题也不是绝对必要的。 本章将首先给出一个神经网络的示例,引出张量和梯度下降的概念,然后逐个详细介绍。 请记住,这些概念对于理解后续章节中的示例至关重要。 读完本章后,你会对神经网络的工作原理有一个直观的理解,然后就可以学习神经网络的 实际应用了(从第 3 章开始)。 2.1 初识神经网络 我们来看一个具体的神经网络示例,使用 Python 的 Keras 库来学习手写数字分类。如果你 没用过 Keras 或类似的库,可能无法立刻搞懂这个例子中的全部内容。甚至你可能还没有安装 Keras。没关系,下一章会详细解释这个例子中的每个步骤。因此,如果其中某些步骤看起来有 些随意,或者像魔法一样,也请你不要担心。下面我们要开始了。 我们这里要解决的问题是,将手写数字的灰度图像(28 像素×28 像素)划分到 10 个类别 中(0~9)。我们将使用 MNIST 数据集,它是机器学习领域的一个经典数据集,其历史几乎和这 个领域一样长,而且已被人们深入研究。这个数据集包含 60 000 张训练图像和 10 000 张测试图 像,由美国国家标准与技术研究院(National Institute of Standards and Technology,即 MNIST 中 的 NIST)在 20 世纪 80 年代收集得到。你可以将“解决”MNIST 问题看作深度学习的“Hello World”,正是用它来验证你的算法是否按预期运行。当你成为机器学习从业者后,会发现 MNIST 一次又一次地出现在科学论文、博客文章等中。图 2-1 给出了 MNIST 数据集的一些样本
书籍下载qg群6089740钉钉群21734177 IT书籍http:/t.cn/RDIAj5D 2.1初识神经网络 21 关于类和标签的说明 在机器学习中,分类问题中的某个类别叫作类(class)。数据,点叫作样本(sample)。某 个样本对应的类叫作标签(label)。 2 图2-1 MNIST数字图像样本 你不需要现在就尝试在计算机上运行这个例子。但如果你想这么做的话,首先需要安装 Keras,安装方法见3.3节。 MNST数据集预先加载在Keras库中,其中包括4个Numpy数组。 代码清单2-1加载Keras中的MNIST数据集 from keras.datasets import mnist (train images,train labels),(test images,test labels)=mnist.load data() train_images和train_labels组成了训练集(training set),模型将从这些数据中进行 学习。然后在测试集(test set,即test_images和test_labels)上对模型进行测试。 图像被编码为Numpy数组,而标签是数字数组,取值范围为O~9。图像和标签一一对应。 我们来看一下训练数据: >>>train images.shape (60000,28,28) >>len(train labels) 60000 >>trainlabels array([5,0,4,...,5,6,8],dtype:=uint8) 下面是测试数据: >>>test_images.shape (10000,28,28) >>len(test_labels) 10000 >>test_labels array([7,2,1,...,4,5,6],dtype:=uint8) 接下来的工作流程如下:首先,将训练数据(train_images和train_labels)输入神 经网络;其次,网络学习将图像和标签关联在一起;最后,网络对test_images生成预测, 而我们将验证这些预测与test_1 abels中的标签是否匹配。 下面我们来构建网络。再说一遍,你现在不需要理解这个例子的全部内容。 电子书寻找看手相钉钉或微信pythontesting
2.1 初识神经网络 21 1 5 3 7 2 6 4 8 9 关于类和标签的说明 在机器学习中,分类问题中的某个类别叫作类(class)。数据点叫作样本(sample)。某 个样本对应的类叫作标签(label)。 图 2-1 MNIST 数字图像样本 你不需要现在就尝试在计算机上运行这个例子。但如果你想这么做的话,首先需要安装 Keras,安装方法见 3.3 节。 MNIST 数据集预先加载在 Keras 库中,其中包括 4 个 Numpy 数组。 代码清单 2-1 加载 Keras 中的 MNIST 数据集 from keras.datasets import mnist (train_images, train_labels), (test_images, test_labels) = mnist.load_data() train_images 和 train_labels 组成了训练集(training set),模型将从这些数据中进行 学习。然后在测试集(test set,即 test_images 和 test_labels)上对模型进行测试。 图像被编码为 Numpy 数组,而标签是数字数组,取值范围为 0~9。图像和标签一一对应。 我们来看一下训练数据: >>> train_images.shape (60000, 28, 28) >>> len(train_labels) 60000 >>> train_labels array([5, 0, 4, ..., 5, 6, 8], dtype=uint8) 下面是测试数据: >>> test_images.shape (10000, 28, 28) >>> len(test_labels) 10000 >>> test_labels array([7, 2, 1, ..., 4, 5, 6], dtype=uint8) 接下来的工作流程如下:首先,将训练数据(train_images 和 train_labels)输入神 经网络;其次,网络学习将图像和标签关联在一起;最后,网络对 test_images 生成预测, 而我们将验证这些预测与 test_labels 中的标签是否匹配。 下面我们来构建网络。再说一遍,你现在不需要理解这个例子的全部内容。 书籍下载qq群6089740 钉钉群21734177 IT书籍 http://t.cn/RDIAj5D 电子书寻找看手相 钉钉或微信pythontesting
22 第2章神经网络的数学基础 代码清单2-2网络架构 from keras import models from keras import layers network models.Sequential() network.add(layers.Dense(512,activation='relu',input_shape=(28 28,))) network.add(layers.Dense(10,activation='softmax')) 神经网络的核心组件是层(lyer),它是一种数据处理模块,你可以将它看成数据过滤器 进去一些数据,出来的数据变得更加有用。具体来说,层从输入数据中提取表示一我们期望 这种表示有助于解决手头的问题。大多数深度学习都是将简单的层链接起来,从而实现渐进式 的数据蒸馏(data distillation)。深度学习模型就像是数据处理的筛子,包含一系列越来越精细的 数据过滤器(即层)。 本例中的网络包含2个Dense层,它们是密集连接(也叫全连接)的神经层。第二层(也 是最后一层)是一个10路softmax层,它将返回一个由10个概率值(总和为1)组成的数组。 每个概率值表示当前数字图像属于10个数字类别中某一一个的概率。 要想训练网络,我们还需要选择编译(compile)步骤的三个参数。 口损失函数(loss function):网络如何衡量在训练数据上的性能,即网络如何朝着正确的 方向前进。 口优化器(optimizer):基于训练数据和损失函数来更新网络的机制。 口在训川练和测试过程中需要监控的指标(metric):本例只关心精度,即正确分类的图像所 占的比例。 后续两章会详细解释损失函数和优化器的确切用途。 代码清单2-3编译步骤 network.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy']) 在开始训练之前,我们将对数据进行预处理,将其变换为网络要求的形状,并缩放到所 有值都在[0,1]区间。比如,之前训练图像保存在一个uit8类型的数组中,其形状为 (60000,28,28),取值区间为[0,255]。我们需要将其变换为一个f1oat32数组,其形 状为(60000,28*28),取值范围为0-1。 代码清单24准备图像数据 train_images train_images.reshape((60000,28 *28)) train_images train_images.astype('float32')/255 test_images test_images.reshape((10000,28 *28)) testimages test_images.astype('float32')/255 我们还需要对标签进行分类编码,第3章将会对这一步骤进行解释
22 第 2 章 神经网络的数学基础 代码清单 2-2 网络架构 from keras import models from keras import layers network = models.Sequential() network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,))) network.add(layers.Dense(10, activation='softmax')) 神经网络的核心组件是层(layer),它是一种数据处理模块,你可以将它看成数据过滤器。 进去一些数据,出来的数据变得更加有用。具体来说,层从输入数据中提取表示——我们期望 这种表示有助于解决手头的问题。大多数深度学习都是将简单的层链接起来,从而实现渐进式 的数据蒸馏(data distillation)。深度学习模型就像是数据处理的筛子,包含一系列越来越精细的 数据过滤器(即层)。 本例中的网络包含 2 个 Dense 层,它们是密集连接(也叫全连接)的神经层。第二层(也 是最后一层)是一个 10 路 softmax 层,它将返回一个由 10 个概率值(总和为 1)组成的数组。 每个概率值表示当前数字图像属于 10 个数字类别中某一个的概率。 要想训练网络,我们还需要选择编译(compile)步骤的三个参数。 损失函数(loss function):网络如何衡量在训练数据上的性能,即网络如何朝着正确的 方向前进。 优化器(optimizer):基于训练数据和损失函数来更新网络的机制。 在训练和测试过程中需要监控的指标(metric):本例只关心精度,即正确分类的图像所 占的比例。 后续两章会详细解释损失函数和优化器的确切用途。 代码清单 2-3 编译步骤 network.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy']) 在开始训练之前,我们将对数据进行预处理,将其变换为网络要求的形状,并缩放到所 有值都在 [0, 1] 区间。比如,之前训练图像保存在一个 uint8 类型的数组中,其形状为 (60000, 28, 28),取值区间为 [0, 255]。我们需要将其变换为一个 float32 数组,其形 状为 (60000, 28 * 28),取值范围为 0~1。 代码清单 2-4 准备图像数据 train_images = train_images.reshape((60000, 28 * 28)) train_images = train_images.astype('float32') / 255 test_images = test_images.reshape((10000, 28 * 28)) test_images = test_images.astype('float32') / 255 我们还需要对标签进行分类编码,第 3 章将会对这一步骤进行解释