Python深度学习
上QQ阅读APP看书,第一时间看更新

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

深度学习已经得到了人工智能历史上前所未有的公众关注度和产业投资,但这并不是机器学习的第一次成功。可以这样说,当前工业界所使用的绝大部分机器学习算法都不是深度学习算法。深度学习不一定总是解决问题的正确工具:有时没有足够的数据,深度学习不适用;有时用其他算法可以更好地解决问题。如果你第一次接触的机器学习就是深度学习,那你可能会发现手中握着一把深度学习“锤子”,而所有机器学习问题看起来都像是“钉子”。为了避免陷入这个误区,唯一的方法就是熟悉其他机器学习方法并在适当的时候进行实践。

关于经典机器学习方法的详细讨论已经超出了本书范围,但我们将简要回顾这些方法,并介绍这些方法的历史背景。这样我们可以将深度学习放入机器学习的大背景中,并更好地理解深度学习的起源以及它为什么如此重要。

1.2.1 概率建模

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

朴素贝叶斯是一类基于应用贝叶斯定理的机器学习分类器,它假设输入数据的特征都是独立的。这是一个很强的假设,或者说“朴素的”假设,其名称正来源于此。这种数据分析方法比计算机出现得还要早,在其第一次被计算机实现(很可能追溯到20世纪50年代)的几十年前就已经靠人工计算来应用了。贝叶斯定理和统计学基础可以追溯到18世纪,你学会了这两点就可以开始使用朴素贝叶斯分类器了。

另一个密切相关的模型是logistic回归(logistic regression,简称logreg),它有时被认为是现代机器学习的“hello world”。不要被它的名称所误导——logreg是一种分类算法,而不是回归算法。与朴素贝叶斯类似,logreg的出现也比计算机早很长时间,但由于它既简单又通用,至今仍然很有用。面对一个数据集,数据科学家通常会首先尝试使用这个算法,以便初步熟悉手头的分类任务。

1.2.2 早期神经网络

神经网络早期的迭代方法已经完全被本章所介绍的现代方法所取代,但仍有助于我们了解深度学习的起源。虽然人们早在20世纪50年代就将神经网络作为玩具项目,并对其核心思想进行研究,但这一方法在数十年后才被人们所使用。在很长一段时间内,一直没有训练大型神经网络的有效方法。这一点在20世纪80年代中期发生了变化,当时很多人都独立地重新发现了反向传播算法——一种利用梯度下降优化来训练一系列参数化运算链的方法(本书后面将给出这些概念的具体定义),并开始将其应用于神经网络。

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

1.2.3 核方法

上节所述神经网络取得了第一次成功,并在20世纪90年代开始在研究人员中受到一定的重视,但一种新的机器学习方法在这时声名鹊起,很快就使人们将神经网络抛诸脑后。这种方法就是核方法(kernel method)。核方法是一组分类算法,其中最有名的就是支持向量机(SVM, support vector machine)。虽然Vladimir Vapnik和Alexey Chervonenkis早在1963年就发表了较早版本的线性公式VAPNIK V, CHERVONENKIS A. A note on one class of perceptrons [J]. Automation and Remote Control, 1964, 25(1).,但SVM的现代公式由Vladimir Vapnik和Corinna Cortes于20世纪90年代初在贝尔实验室提出,并发表于1995年VAPNIK V, CORTES C. Support-vector networks [J]. Machine Learning, 1995, 20(3): 273-297.

SVM的目标是通过在属于两个不同类别的两组数据点之间找到良好决策边界(decision boundary,见图1-10)来解决分类问题。决策边界可以看作一条直线或一个平面,将训练数据划分为两块空间,分别对应于两个类别。对于新数据点的分类,你只需判断它位于决策边界的哪一侧。

图1-10 决策边界

SVM通过两步来寻找决策边界。

(1) 将数据映射到一个新的高维表示,这时决策边界可以用一个超平面来表示(如果数据像图1-10那样是二维的,那么超平面就是一条直线)。

(2) 尽量让超平面与每个类别最近的数据点之间的距离最大化,从而计算出良好决策边界(分割超平面),这一步叫作间隔最大化(maximizing the margin)。这样决策边界可以很好地推广到训练数据集之外的新样本。

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

SVM刚刚出现时,在简单的分类问题上表现出了最好的性能。当时只有少数机器学习方法得到大量的理论支持,并且适合用于严肃的数学分析,因而非常易于理解和解释,SVM就是其中之一。由于SVM具有这些有用的性质,很长一段时间里它在实践中非常流行。

但是,SVM很难扩展到大型数据集,并且在图像分类等感知问题上的效果也不好。SVM是一种比较浅层的方法,因此要想将其应用于感知问题,首先需要手动提取出有用的表示(这叫作特征工程),这一步骤很难,而且不稳定。

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

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

图1-11 决策树:需要学习的参数是关于数据的问题。举个例子,问题可能是:“数据中第2个系数是否大于3.5? ”

特别是随机森林(random forest)算法,它引入了一种健壮且实用的决策树学习方法,即首先构建许多决策树,然后将它们的输出集成在一起。随机森林适用于各种各样的问题——对于任何浅层的机器学习任务来说,它几乎总是第二好的算法。广受欢迎的机器学习竞赛网站Kaggle在2010年上线后,随机森林迅速成为平台上人们的最爱,直到2014年才被梯度提升机所取代。与随机森林类似,梯度提升机(gradient boosting machine)也是将弱预测模型(通常是决策树)集成的机器学习技术。它使用了梯度提升方法,通过迭代地训练新模型来专门解决之前模型的弱点,从而改进任何机器学习模型的效果。将梯度提升技术应用于决策树时,得到的模型与随机森林具有相似的性质,但在绝大多数情况下效果都比随机森林要好。它可能是目前处理非感知数据最好的算法之一(如果非要加个“之一”的话)。和深度学习一样,它也是Kaggle竞赛中最常用的技术之一。

1.2.5 回到神经网络

虽然神经网络几乎被整个科学界完全忽略,但仍有一些人在继续研究神经网络,并在2010年左右开始取得重大突破。这些人包括:多伦多大学Geoffrey Hinton的小组、蒙特利尔大学的Yoshua Bengio、纽约大学的Yann LeCun和瑞士的IDSIA。

2011年,来自IDSIA的Dan Ciresan开始利用GPU训练的深度神经网络赢得学术性的图像分类竞赛,这是现代深度学习第一次在实践中获得成功。但真正的转折性时刻出现在2012年,当年Hinton小组参加了每年一次的大规模图像分类挑战赛ImageNet。ImageNet挑战赛在当时以困难著称,参赛者需要对140万张高分辨率彩色图像进行训练,然后将其划分到1000个不同的类别中。2011年,获胜的模型基于经典的计算机视觉方法,其top-5精度top-5精度是指给定一张图像,如果模型预测的前5个标签中包含正确标签,即为预测正确。——译者注只有74.3%。到了2012年,由Alex Krizhevsky带领并由Geoffrey Hinton提供建议的小组,实现了83.6%的top-5精度——这是一项重大突破。此后,这项竞赛每年都由深度卷积神经网络所主导。到了2015年,获胜者的精度达到了96.4%,此时ImageNet的分类任务被认为是一个已经完全解决的问题。

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

1.2.6 深度学习有何不同

深度学习发展得如此迅速,主要原因在于它在很多问题上都表现出更好的性能。但这并不是唯一的原因。深度学习还让解决问题变得更加简单,因为它将特征工程完全自动化,而这曾经是机器学习工作流程中最关键的一步。

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

你可能会问,如果问题的关键在于有多个连续表示层,那么能否重复应用浅层方法,以实现和深度学习类似的效果?在实践中,如果连续应用浅层学习方法,其收益会随着层数增加迅速降低,因为三层模型中最优的第一表示层并不是单层或双层模型中最优的第一表示层。深度学习的变革性在于,模型可以在同一时间共同学习所有表示层,而不是依次连续学习(这被称为贪婪学习)。通过共同的特征学习,一旦模型修改某个内部特征,所有依赖于该特征的其他特征都会相应地自动调节适应,无须人为干预。一切都由单一反馈信号来监督:模型中的每一处变化都是为了最终目标服务。这种方法比贪婪地叠加浅层模型更加强大,因为它可以通过将复杂、抽象的表示拆解为很多个中间空间(层)来学习这些表示,每个中间空间仅仅是前一个空间的简单变换。

深度学习从数据中进行学习时有两个基本特征:第一,通过渐进的、逐层的方式形成越来越复杂的表示;第二,对中间这些渐进的表示共同进行学习,每一层的变化都需要同时考虑上下两层的需要。总之,这两个特征使得深度学习比先前的机器学习方法更加成功。

1.2.7 机器学习现状

要想了解机器学习算法和工具的现状,一个好方法是看一下Kaggle上的机器学习竞赛。Kaggle上的竞争非常激烈(有些比赛有数千名参赛者,并提供数百万美元的奖金),而且涵盖了各种类型的机器学习问题,所以它提供了一种现实方法来评判哪种方法有效、哪种方法无效。那么哪种算法能够可靠地赢得竞赛呢?顶级参赛者都使用哪些工具?

在2016年和2017年,Kaggle上主要有两大方法:梯度提升机和深度学习。具体而言,梯度提升机用于处理结构化数据的问题,而深度学习则用于图像分类等感知问题。使用前一种方法的人几乎都使用优秀的XGBoost库,它同时支持数据科学最流行的两种语言:Python和R。使用深度学习的Kaggle参赛者则大多使用Keras库,因为它易于使用,非常灵活,并且支持Python。

要想在如今的应用机器学习中取得成功,你应该熟悉这两种技术:梯度提升机,用于浅层学习问题;深度学习,用于感知问题。用术语来说,你需要熟悉XGBoost和Keras,它们是目前主宰Kaggle竞赛的两个库。有了本书,你已经向这个目标迈出了一大步。