2022年 11月 9日

Python深度学习—第1章 什么是深度学习

<< Python深度学习>>

第1章 什么是深度学习

1.1 人工智能、机器学习与深度学习

在这里插入图片描述

1.1.1 人工智能

人工智能的简洁定义如下:努力将通常由人类完成的智力任务自动化。因此,人工智能是一个综合性的领域,不仅包括机器学习与深度学习,还包括更多不涉及学习的方法。

1.1.2 机器学习

在经典的程序设计(即符号主义人工智能的范式)中,人们输入的是规则(即程序)和需要根据这些规则进行处理的数据,系统输出的是答案(见图 1-2)。利用机器学习,人们输入的是数据和从这些数据中预期得到的答案,系统输出的是规则。这些规则随后可应用于新的数据,并使计算机自主生成答案。

在这里插入图片描述

机器学习系统是训练出来的,而不是明确地用程序编写出来的。将与某个任务相关的许多示例输入机器学习系统,它会在这些示例中找到统计结构,从而最终找到规则将任务自动化。

1.1.3 从数据中学习表示

用三个要素来进行机器学习:
1.输入数据点
2.预期输出的示例
3.衡量算法效果好坏的方法,这一衡量方法是为了计算算法的当前输出与预期输出的差距。衡量结果是一种反馈信号,用于调节算法的工作方式。这个调节步骤就是我们所说的学习。

1.1.4 深度学习之“深度”

数据模型中包含多少层,这被称为模型的深度(depth)。这一领域的其他名称包括分层表示学习和层级表示学习。现代深度学习通常包含数十个甚至上百个连续的表示层,这些表示层全都是从训练数据中自动学习的。与此相反,其他机器学习方法的重点往往是仅仅学习一两层的数据表示,因此有时也被称为浅层学习。

1.1.5 理解深度学习的工作原理

深度神经网络通过一系列简单的数据变换(层)来实现这种输入到目标的映射,而这些数据变换都是通过观察示例学习到的。下面来具体看一下这种学习过程是如何发生的。

在这里插入图片描述

1.2 深度学习之前:机器学习简史

1.2.1 概率建模

概率建模(probabilistic modeling)是统计学原理在数据分析中的应用。它是最早的机器学习形式之一,至今仍在广泛使用。其中最有名的算法之一就是朴素贝叶斯算法。朴素贝叶斯是一类基于应用贝叶斯定理的机器学习分类器,它假设输入数据的特征都是独立的。

1.2.2 早期神经网络

贝尔实验室于 1989 年第一次成功实现了神经网络的实践应用,当时 Yann LeCun将卷积神经网络的早期思想与反向传播算法相结合,并将其应用于手写数字分类问题,由此得到名为LeNet 的网络,在 20 世纪 90年代被美国邮政署采用,用于自动读取信封上的邮政编码。

1.2.3 核方法

核方法是一组分类算法,其中最有名的就是支持向量机(SVM,support vector machine)。虽然 Vladimir Vapnik 和 Alexey Chervonenkis 早在 1963 年就发表了较早版本的线性公式 a,但 SVM 的现代公式由 Vladimir Vapnik 和 Corinna Cortes 于 20 世纪 90 年代初在贝尔实验室提出,并发表于 1995 年 b。SVM 的目标是通过在属于两个不同类别的两组数据点之间找到良好决策边界(decision boundary,见图 1-10)来解决分类问题。决策边界可以看作一条直线或一个平面,将训练数据划分为两块空间,分别对应于两个类别。对于新数据点的分类,你只需判断它位于决策边界的哪一侧。

在这里插入图片描述

SVM 通过两步来寻找决策边界:
(1) 将数据映射到一个新的高维表示,这时决策边界可以用一个超平面来表示(如果数据像图 1-10 那样是二维的,那么超平面就是一条直线)。
(2) 尽量让超平面与每个类别最近的数据点之间的距离最大化,从而计算出良好决策边界(分割超平面),这一步叫作间隔最大化(maximizing the margin)。这样决策边界可以很好地推广到训练数据集之外的新样本。

将数据映射到高维表示从而使分类问题简化,这一技巧可能听起来很不错,但在实践中通常是难以计算的。这时就需要用到核技巧(kernel trick,核方法正是因这一核心思想而得名)。其基本思想是:要想在新的表示空间中找到良好的决策超平面,你不需要在新空间中直接计算点的坐标,只需要在新空间中计算点对之间的距离,而利用核函数(kernel function)可以高效地完成这种计算。核函数是一个在计算上能够实现的操作,将原始空间中的任意两点映射为这两点在目标表示空间中的距离,完全避免了对新表示进行直接计算。核函数通常是人为选择的,而不是从数据中学到的——对于 SVM 来说,只有分割超平面是通过学习得到的。

1.2.4 决策树、随机森林与梯度提升机

决策树(decision tree)是类似于流程图的结构,可以对输入数据点进行分类或根据给定输入来预测输出值(见图 1-11)。决策树的可视化和解释都很简单。在 21 世纪前十年,从数据中学习得到的决策树开始引起研究人员的广泛关注。到了 2010 年,决策树经常比核方法更受欢迎。

在这里插入图片描述

随机森林(random forest)算法,它引入了一种健壮且实用的决策树学习方法,即首先构建许多决策树,然后将它们的输出集成在一起。随机森林适用于各种各样的问题——对于任何浅层的机器学习任务来说,它几乎总是第二好的算法。

与随机森林类似,梯度提升机也是将弱预测模型(通常是决策树)集成的机器学习技术。它使用了梯度提升方法,通过迭代地训练新模型来专门解决之前模型的弱点,从而改进任何机器学习模型的效果。将梯度提升技术应用于决策树时,得到的模型与随机森林具有相似的性质,但在绝大多数情况下效果都比随机森林要好。它可能是目前处理非感知数据最好的算法之一。

1.2.5 神经网络

2012 年以来,深度卷积神经网络(convnet)已成为所有计算机视觉任务的首选算法。更一般地说,它在所有感知任务上都有效。在 2015 年和 2016 年的主要计算机视觉会议上,几乎所有演讲都与 convnet 有关。与此同时,深度学习也在许多其他类型的问题上得到应用,比如自然语言处理。它已经在大量应用中完全取代了 SVM 与决策树。举个例子,欧洲核子研究中心(CERN)多年来一直使用基于决策树的方法来分析来自大型强子对撞机(LHC)ATLAS 探测器的粒子数据,但 CERN 最终转向基于 Keras 的深度神经网络,因为它的性能更好,而且在大型数据集上易于训练。

1.2.6 深度学习有何不同

先前的机器学习技术(浅层学习)仅包含将输入数据变换到一两个连续的表示空间,通常使用简单的变换,比如高维非线性投影(SVM)或决策树。但这些技术通常无法得到复杂问题所需要的精确表示。因此,人们必须竭尽全力让初始输入数据更适合用这些方法处理,也必须手动为数据设计好的表示层。这叫作特征工程。与此相反,深度学习完全将这个步骤自动化:利用深度学习,你可以一次性学习所有特征,而无须自己手动设计。这极大地简化了机器学习工作流程,通常将复杂的多阶段流程替换为一个简单的、端到端的深度学习模型。

1.2.7 机器学习现状

2016 年和 2017 年,Kaggle 上主要有两大方法:梯度提升机和深度学习。具体而言,梯度提升机用于处理结构化数据的问题,而深度学习则用于图像分类等感知问题。使用前一种方法的人几乎都使用优秀的 XGBoost 库,它同时支持数据科学最流行的两种语言:Python 和 R。使用深度学习的 Kaggle 参赛者则大多使用 Keras 库,因为它易于使用,非常灵活,并且支持Python。要想在如今的应用机器学习中取得成功,你应该熟悉这两种技术:梯度提升机,用于浅层学习问题;深度学习,用于感知问题。用术语来说,你需要熟悉 XGBoost 和 Keras,它们是目前主宰 Kaggle 竞赛的两个库。

1.3 为什么是深度学习,为什么是现在

深度学习用于计算机视觉的两个关键思想,即卷积神经网络和反向传播,在 1989 年就已经为人们所知。长短期记忆LSTM,long short-term memory)算法是深度学习处理时间序列的基础,它在 1997 年就被开发出来了,而且此后几乎没有发生变化。那么为什么深度学习在2012 年之后才开始取得成功?这二十年间发生了什么变化?

三种技术力量在推动着机器学习的进步: 硬件、数据集和基准、算法上的改进

1.3.1 硬件

2007 年,NVIDIA 推出了 CUDA,作为其 GPU 系列的编程接口。少量 GPU 开始在各种高度并行化的应用中替代大量 CPU 集群,并且最早应用于物理建模。深度神经网络主要由许多小矩阵乘法组成,它也是高度并行化的。2011 年前后,一些研究人员开始编写神经网络的 CUDA 实现,而 Dan Ciresana 和 Alex Krizhevskyb 属于第一批人。
与此同时,大公司还在包含数百个 GPU 的集群上训练深度学习模型,这种类型的 GPU 是专门针对深度学习的需求开发的,比如 NVIDIA Tesla K80。如果没有现代 GPU,这种集群的超级计算能力是不可能实现的。此外,深度学习行业已经开始超越 GPU,开始投资于日益专业化的高效芯片来进行深度学习。2016 年,Google 在其年度 I/O 大会上展示了张量处理器(TPU)项目,它是一种新的芯片设计,其开发目的完全是为了运行深度神经网络。据报道,它的速度比最好的 GPU 还要快 10 倍,而且能效更高。

1.3.3 算法

除了硬件和数据之外,直到 20 世纪前十年的末期,我们仍没有可靠的方法来训练非常深的神经网络。因此,神经网络仍然很浅,仅使用一两个表示层,无法超越更为精确的浅层方法,比如 SVM 和随机森林。关键问题在于通过多层叠加的梯度传播。随着层数的增加,用于训练神经网络的反馈信号会逐渐消失。
这一情况在 2009—2010 年左右发生了变化,当时出现了几个很简单但很重要的算法改进,可以实现更好的梯度传播。
1.更好的神经层激活函数(activation function)。
2.更好的权重初始化方案(weight-initialization scheme),一开始使用逐层预训练的方法,不过这种方法很快就被放弃了。
3.更好的优化方案(optimization scheme),比如 RMSProp 和 Adam。
只有这些改进可以训练 10 层以上的模型时,深度学习才开始大放异彩。最后,在 2014 年、2015 年和 2016 年,人们发现了更先进的有助于梯度传播的方法,比如批标准化、残差连接和深度可分离卷积。今天,我们可以从头开始训练上千层的模型。