乐读窝

深度学习

乐读窝 > 文学理论 > 深度学习

第5章 机器学习基础

书籍名:《深度学习》    作者:伊恩.古德费洛



深度学习是机器学习的一个特定分支。我们要想充分理解深度学习,必须对机器学习的基本原理有深刻的理解。本章将探讨贯穿本书其余部分的一些机器学习的重要原理。我们建议新手读者或是希望更全面了解的读者参考一些更全面覆盖基础知识的机器学习参考书,例如Murphy(2012)或者Bishop(2006)。如果你已经熟知机器学习,可以跳过前面的部分,前往第5.11节。第5.11节涵盖了一些传统机器学习技术观点,这些技术对深度学习的发展有着深远影响。

首先,我们将介绍学习算法的定义,并介绍一个简单的示例:线性回归算法。接下来,我们会探讨拟合训练数据与寻找能够泛化到新数据的模式存在哪些不同的挑战。大部分机器学习算法都有超参数(必须在学习算法外设定),我们将探讨如何使用额外的数据设置超参数。机器学习本质上属于应用统计学,更多地关注于如何用计算机统计地估计复杂函数,不太关注为这些函数提供置信区间,因此我们会探讨两种统计学的主要方法:频率派估计和贝叶斯推断。大部分机器学习算法可以分成监督学习和无监督学习两类,我们将探讨不同的分类,并针对每个分类提供一些简单的机器学习算法作为示例。大部分深度学习算法都是基于被称为随机梯度下降的算法求解的。我们将介绍如何组合不同的算法部分,例如优化算法、代价函数、模型和数据集,来建立一个机器学习算法。最后在第5.11节,我们会介绍一些限制传统机器学习泛化能力的因素。这些挑战促进了解决这些问题的深度学习算法的发展。



5.1 学习算法


机器学习算法是一种能够从数据中学习的算法。然而,我们所谓的“学习”是什么意思呢?Mitchell(1997)提供了一个简洁的定义:“对于某类任务T和性能度量P,一个计算机程序被认为可以从经验E中学习是指,通过经验E改进后,它在任务T上由性能度量P衡量的性能有所提升。”经验E、任务T和性能度量P的定义范围非常宽广,在本书中我们并不会试图去解释这些定义的具体意义。相反,我们会在接下来的章节中提供直观的解释和示例来介绍不同的任务、性能度量和经验,这些将被用来构建机器学习算法。



5.1.1 任务T


机器学习可以让我们解决一些人为设计和使用确定性程序很难解决的问题。从科学和哲学的角度来看,机器学习之所以受到关注,是因为提高我们对机器学习的认识需要提高我们自身对智能背后原理的理解。

从“任务”的相对正式的定义上说,学习过程本身不能算是任务。学习是我们所谓的获取完成任务的能力。例如,我们的目标是使机器人能够行走,那么行走便是任务。我们可以编程让机器人学会如何行走,或者可以人工编写特定的指令来指导机器人如何行走。

通常机器学习任务定义为机器学习系统应该如何处理样本(example)。样本是指我们从某些希望机器学习系统处理的对象或事件中收集到的已经量化的特征(feature)的集合。我们通常会将样本表示成一个向量,其中向量的每一个元素xi是一个特征。例如,一张图片的特征通常是指这张图片的像素值。

机器学习可以解决很多类型的任务。一些非常常见的机器学习任务列举如下。

分类:在这类任务中,计算机程序需要指定某些输入属于k类中的哪一类。为了完成这个任务,学习算法通常会返回一个函数。当y=f(x)时,模型将向量x所代表的输入分类到数字码y所代表的类别。还有一些其他的分类问题,例如,f输出的是不同类别的概率分布。分类任务中有一个任务是对象识别,其中输入是图片(通常由一组像素亮度值表示),输出是表示图片物体的数字码。例如,Willow  Garage  PR2机器人能像服务员一样识别不同饮料,并送给点餐的顾客(Goodfellow  et  al.,2010)。目前,最好的对象识别工作正是基于深度学习的(Krizhevsky  et  al.,2012a;Ioffe  and  Szegedy,2015)。对象识别同时也是计算机识别人脸的基本技术,可用于标记相片合辑中的人脸(Taigman  et  al.,2014),有助于计算机更自然地与用户交互。

输入缺失分类:当输入向量的每个度量不被保证时,分类问题将会变得更有挑战性。为了解决分类任务,学习算法只需要定义一个从输入向量映射到输出类别的函数。当一些输入可能丢失时,学习算法必须学习一组函数,而不是单个分类函数。每个函数对应着分类具有不同缺失输入子集的x。这种情况在医疗诊断中经常出现,因为很多类型的医学测试是昂贵的,对身体有害的。有效地定义这样一个大集合函数的方法是学习所有相关变量的概率分布,然后通过边缘化缺失变量来解决分类任务。使用n个输入变量,我们现在可以获得每个可能的缺失输入集合所需的所有2n个不同的分类函数,但是计算机程序仅需要学习一个描述联合概率分布的函数。参见Goodfellow  et  al.(2013d)了解以这种方式将深度概率模型应用于这类任务的示例。本节中描述的许多其他任务也可以推广到缺失输入的情况;缺失输入分类只是机器学习能够解决的问题的一个示例。

回归:在这类任务中,计算机程序需要对给定输入预测数值。为了解决这个任务,学习算法需要输出函数。除了返回结果的形式不一样外,这类问题和分类问题是很像的。这类任务的一个示例是预测投保人的索赔金额(用于设置保险费),或者预测证券未来的价格。这类预测也用在算法交易中。

转录:在这类任务中,机器学习系统观测一些相对非结构化表示的数据,并转录信息为离散的文本形式。例如,光学字符识别要求计算机程序根据文本图片返回文字序列(ASCII码或者Unicode码)。谷歌街景以这种方式使用深度学习处理街道编号(Goodfellow  et  al.,2014d)。另一个例子是语音识别,计算机程序输入一段音频波形,输出一序列音频记录中所说的字符或单词ID的编码。深度学习是现代语音识别系统的重要组成部分,被各大公司广泛使用,包括微软、IBM和谷歌(Hinton  et  al.,2012b)。

机器翻译:在这类任务中,输入是一种语言的符号序列,计算机程序必须将其转化成另一种语言的符号序列。这通常适用于自然语言,如将英语译成法语。最近,深度学习已经开始在这类任务上产生重要影响(Sutskever  et  al.,2014;Bahdanau  et  al.,2015)。

结构化输出:结构化输出任务的输出是向量或者其他包含多个值的数据结构,并且构成输出的这些不同元素间具有重要关系。这是一个很大的范畴,包括上述转录任务和翻译任务在内的很多其他任务。例如语法分析——映射自然语言句子到语法结构树,并标记树的节点为动词、名词、副词等。参考Collobert(2011)将深度学习应用到语法分析的示例。另一个例子是图像的像素级分割,将每一个像素分配到特定类别。例如,深度学习可用于标注航拍照片中的道路位置(Mnih  and  Hinton,2010)。在这些标注型的任务中,输出的结构形式不需要和输入尽可能相似。例如,在为图片添加描述的任务中,计算机程序观察到一幅图,输出描述这幅图的自然语言句子(Kiros  et  al.,2014a,b;Mao  et  al.,2014;Vinyals  et  al.,2015b;Donahue  et  al.,2014;Karpathy  and  Li,2015;Fang  et  al.,2015;Xu  et  al.,2015)。这类任务被称为结构化输出任务,是因为输出值之间内部紧密相关。例如,为图片添加标题的程序输出的单词必须组合成一个通顺的句子。

异常检测:在这类任务中,计算机程序在一组事件或对象中筛选,并标记不正常或非典型的个体。异常检测任务的一个示例是信用卡欺诈检测。通过对你的购买习惯建模,信用卡公司可以检测到你的卡是否被滥用。如果窃贼窃取你的信用卡或信用卡信息,窃贼采购物品的分布通常和你的不同。当该卡发生了不正常的购买行为时,信用卡公司可以尽快冻结该卡以防欺诈。参考Chandola  et  al.(2009)了解欺诈检测方法。

合成和采样:在这类任务中,机器学习程序生成一些和训练数据相似的新样本。通过机器学习,合成和采样可能在媒体应用中非常有用,可以避免艺术家大量昂贵或者乏味费时的手动工作。例如,视频游戏可以自动生成大型物体或风景的纹理,而不是让艺术家手动标记每个像素(Luo  et  al.,2013)。在某些情况下,我们希望采样或合成过程可以根据给定的输入生成一些特定类型的输出。例如,在语音合成任务中,我们提供书写的句子,要求程序输出这个句子语音的音频波形。这是一类结构化输出任务,但是多了每个输入并非只有一个正确输出的条件,并且我们明确希望输出有很多变化,这可以使结果看上去更加自然和真实。

缺失值填补:在这类任务中,机器学习算法给定一个新样本,x中某些元素xi缺失。算法必须填补这些缺失值。

去噪:在这类任务中,机器学习算法的输入是,干净样本经过未知损坏过程后得到的损坏样本。算法根据损坏后的样本预测干净的样本x,或者更一般地预测条件概率分布。

密度估计或概率质量函数估计:在密度估计问题中,机器学习算法学习函数pmodel:,其中pmodel(x)可以解释成样本采样空间的概率密度函数(如果x是连续的)或者概率质量函数(如果x是离散的)。要做好这样的任务(在讨论性能度量P时,我们会明确定义任务是什么),算法需要学习观测到的数据的结构。算法必须知道什么情况下样本聚集出现,什么情况下不太可能出现。以上描述的大多数任务都要求学习算法至少能隐式地捕获概率分布的结构。密度估计可以让我们显式地捕获该分布。原则上,我们可以在该分布上计算以便解决其他任务。例如,如果通过密度估计得到了概率分布p(x),我们可以用该分布解决缺失值填补任务。如果xi的值是缺失的,但是其他的变量值x−i已知,那么我们可以得到条件概率分布。实际情况中,密度估计并不能够解决所有这类问题,因为在很多情况下p(x)是难以计算的。

当然,还有很多其他同类型或其他类型的任务。这里我们列举的任务类型只是用来介绍机器学习可以做哪些任务,并非严格地定义机器学习任务分类。



5.1.2 性能度量P


为了评估机器学习算法的能力,我们必须设计其性能的定量度量。通常性能度量P是特定于系统执行的任务T而言的。

对于诸如分类、缺失输入分类和转录任务,我们通常度量模型的准确率(accuracy)。准确率是指该模型输出正确结果的样本比率。我们也可以通过错误率(errorrate)得到相同的信息。错误率是指该模型输出错误结果的样本比率。我们通常把错误率称为0−1损失的期望。在一个特定的样本上,如果结果是对的,那么0−1损失是0;否则是1。但是对于密度估计这类任务而言,度量准确率,错误率或者其他类型的0−1损失是没有意义的。反之,我们必须使用不同的性能度量,使模型对每个样本都输出一个连续数值的得分。最常用的方法是输出模型在一些样本上概率对数的平均值。

通常,我们会更加关注机器学习算法在未观测数据上的性能如何,因为这将决定其在实际应用中的性能。因此,我们使用测试集(test  set)数据来评估系统性能,将其与训练机器学习系统的训练集数据分开。

性能度量的选择或许看上去简单且客观,但是选择一个与系统理想表现对应的性能度量通常是很难的。

在某些情况下,这是因为很难确定应该度量什么。例如,在执行转录任务时,我们是应该度量系统转录整个序列的准确率,还是应该用一个更细粒度的指标,对序列中正确的部分元素以正面评价?在执行回归任务时,我们应该更多地惩罚频繁犯一些中等错误的系统,还是较少犯错但是犯很大错误的系统?这些设计的选择取决于应用。

还有一些情况,我们知道应该度量哪些数值,但是度量它们不太现实。这种情况经常出现在密度估计中。很多最好的概率模型只能隐式地表示概率分布。在许多这类模型中,计算空间中特定点的概率是不可行的。在这些情况下,我们必须设计一个仍然对应于设计对象的替代标准,或者设计一个理想标准的良好近似。



5.1.3 经验E


根据学习过程中的不同经验,机器学习算法可以大致分类为无监督(unsupervised)算法和监督(supervised)算法。

本书中的大部分学习算法可以被理解为在整个数据集(dataset)上获取经验。数据集是指很多样本组成的集合,如第5.1.1节所定义的。有时我们也将样本称为数据点(data  point)。

Iris(鸢尾花卉)数据集(Fisher,1936)是统计学家和机器学习研究者使用了很久的数据集。它是150个鸢尾花卉植物不同部分测量结果的集合。每个单独的植物对应一个样本。每个样本的特征是该植物不同部分的测量结果:萼片长度、萼片宽度、花瓣长度和花瓣宽度。这个数据集也记录了每个植物属于什么品种,其中共有3个不同的品种。

无监督学习算法(unsupervised  learning  algorithm)训练含有很多特征的数据集,然后学习出这个数据集上有用的结构性质。在深度学习中,我们通常要学习生成数据集的整个概率分布,显式地,比如密度估计,或是隐式地,比如合成或去噪。还有一些其他类型的无监督学习任务,例如聚类,将数据集分成相似样本的集合。

监督学习算法(supervised  learning  algorithm)训练含有很多特征的数据集,不过数据集中的样本都有一个标签(label)或目标(target)。例如,Iris数据集注明了每个鸢尾花卉样本属于什么品种。监督学习算法通过研究Iris数据集,学习如何根据测量结果将样本划分为3个不同品种。

大致说来,无监督学习涉及观察随机向量x的好几个样本,试图显式或隐式地学习出概率分布p(x),或者是该分布一些有意思的性质;而监督学习包含观察随机向量x及其相关联的值或向量y,然后从x预测y,通常是估计p(y|x)。术语监督学习(supervised  learning)源自这样一个视角,教员或者老师提供目标y给机器学习系统,指导其应该做什么。在无监督学习中,没有教员或者老师,算法必须学会在没有指导的情况下理解数据。

无监督学习和监督学习不是严格定义的术语。它们之间界线通常是模糊的。很多机器学习技术可以用于这两个任务。例如,概率的链式法则表明对于随机向量,联合分布可以分解成

该分解意味着我们可以将其拆分成n个监督学习问题,来解决表面上的无监督学习p(x)。另外,我们求解监督学习问题p(y|x)时,也可以使用传统的无监督学习策略学习联合分布p(x,y),然后推断

尽管无监督学习和监督学习并非完全没有交集的正式概念,它们确实有助于粗略分类我们研究机器学习算法时遇到的问题。传统上,人们将回归、分类或者结构化输出问题称为监督学习,将支持其他任务的密度估计称为无监督学习。

学习范式的其他变种也是有可能的。例如,半监督学习中,一些样本有监督目标,但其他样本没有。在多实例学习中,样本的整个集合被标记为含有或者不含有该类的样本,但是集合中单独的样本是没有标记的。参考Kotzias  et  al.(2015)了解最近深度模型进行多实例学习的示例。

有些机器学习算法并不是训练于一个固定的数据集上。例如,强化学习(reinforcement  learning)算法会和环境进行交互,所以学习系统和它的训练过程会有反馈回路。这类算法超出了本书的范畴。请参考Sutton  and  Barto(1998)或Bertsekas  and  Tsitsiklis(1996)了解强化学习相关知识,Mnih  et  al.(2013)介绍了强化学习方向的深度学习方法。

大部分机器学习算法简单地训练于一个数据集上。数据集可以用很多不同方式来表示。在所有的情况下,数据集都是样本的集合,而样本是特征的集合。

表示数据集的常用方法是设计矩阵(design  matrix)。设计矩阵的每一行包含一个不同的样本。每一列对应不同的特征。例如,Iris数据集包含150个样本,每个样本有4个特征。这意味着我们可以将该数据集表示为设计矩阵,其中Xi,1表示第i个植物的萼片长度,Xi,2表示第i个植物的萼片宽度等。我们在本书中描述的大部分学习算法都是讲述它们是如何运行在设计矩阵数据集上的。

当然,每一个样本都能表示成向量,并且这些向量的维度相同,才能将一个数据集表示成设计矩阵。这一点并非永远可能。例如,你有不同宽度和高度的照片的集合,那么不同的照片将会包含不同数量的像素。因此不是所有的照片都可以表示成相同长度的向量。第9.7节和第10章将会介绍如何处理这些不同类型的异构数据。在上述这类情况下,我们不会将数据集表示成m行的矩阵,而是表示成m个元素的结合:{x(1),x(2),...,x(m)}  。这种表示方式意味着样本向量x(i)和x(j)可以有不同的大小。

在监督学习中,样本包含一个标签或目标和一组特征。例如,我们希望使用学习算法从照片中识别对象。我们需要明确哪些对象会出现在每张照片中。我们或许会用数字编码表示,如0表示人、1表示车、2表示猫等。通常在处理包含观测特征的设计矩阵X的数据集时,我们也会提供一个标签向量y,其中yi表示样本i的标签。

当然,有时标签可能不止一个数。例如,如果我们想要训练语音模型转录整个句子,那么每个句子样本的标签是一个单词序列。

正如监督学习和无监督学习没有正式的定义,数据集或者经验也没有严格的区分。这里介绍的结构涵盖了大多数情况,但始终有可能为新的应用设计出新的结构。



5.1.4 示例:线性回归


我们将机器学习算法定义为:通过经验以提高计算机程序在某些任务上性能的算法。这个定义有点抽象。为了使这个定义更具体点,我们展示一个简单的机器学习示例:线性回归(linear  regression)。当我们介绍更多有助于理解机器学习特性的概念时,会反复回顾这个示例。

顾名思义,线性回归解决回归问题。换言之,我们的目标是建立一个系统,将向量作为输入,预测标量作为输出。线性回归的输出是其输入的线性函数。令表示模型预测y应该取的值。我们定义输出为

其中是参数(parameter)向量。

参数是控制系统行为的值。在这种情况下,wi是系数,会和特征xi相乘之后全部相加起来。我们可以将w看作一组决定每个特征如何影响预测的权重(weight)。如果特征xi对应的权重wi是正的,那么特征的值增加,我们的预测值也会增加。如果特征xi对应的权重wi是负的,那么特征的值增加,我们的预测值会减少。如果特征权重的大小很大,那么它对预测有很大的影响;如果特征权重的大小是零,那么它对预测没有影响。

因此,我们可以定义任务T:通过输出预测y。接下来我们需要定义性能度量——P。

假设我们有m个输入样本组成的设计矩阵,不用它来训练模型,而是评估模型性能如何。我们也有每个样本对应的正确值y组成的回归目标向量。因为这个数据集只是用来评估性能,我们称之为测试集(test  set)。我们将输入的设计矩阵记作X(test),回归目标向量记作y(test)。

度量模型性能的一种方法是计算模型在测试集上的均方误差(mean  squared  error)。如果表示模型在测试集上的预测值,那么均方误差表示为

直观上,当时,我们会发现误差降为0。我们也可以看到

所以当预测值和目标值之间的欧几里得距离增加时,误差也会增加。

为了构建一个机器学习算法,我们需要设计一个算法,通过观察训练集获得经验,减少MSEtest以改进权重w。一种直观方式(我们将在后续的第5.5.1节说明其合法性)是最小化训练集上的均方误差,即MSEtrain。

最小化MSEtrain,我们可以简单地求解其导数为0的情况:

通过式(5.12)给出解的系统方程被称为正规方程(normal  equation)。计算式(5.12)构成了一个简单的机器学习算法。图5.1展示了线性回归算法的使用示例。

图5.1 一个线性回归问题,其中训练集包括10个数据点,每个数据点包含一个特征。因为只有一个特征,权重向量w也只有一个要学习的参数w1。(左)我们可以观察到线性回归学习w1,从而使得直线y=w1x能够尽量接近穿过所有的训练点。(右)标注的点表示由正规方程学习到的w1的值,我们发现它可以最小化训练集上的均方误差

值得注意的是,术语线性回归(linear  regression)通常用来指稍微复杂一些,附加额外参数(截距项b)的模型。在这个模型中,

因此从参数到预测的映射仍是一个线性函数,而从特征到预测的映射是一个仿射函数。如此扩展到仿射函数意味着模型预测的曲线仍然看起来像是一条直线,只是这条直线没必要经过原点。除了通过添加偏置参数b,我们还可以使用仅含权重的模型,但是x需要增加一项永远为1的元素。对应于额外1的权重起到了偏置参数的作用。当我们在本书中提到仿射函数时,会经常使用术语“线性”。

截距项b通常被称为仿射变换的偏置(bias)参数。这个术语的命名源自该变换的输出在没有任何输入时会偏移b。它和统计偏差中指代统计估计算法的某个量的期望估计偏离真实值的意思是不一样的。

线性回归当然是一个极其简单且有局限的学习算法,但是它提供了一个说明学习算法如何工作的例子。在接下来的章节中,我们将会介绍一些设计学习算法的基本原则,并说明如何使用这些原则来构建更复杂的学习算法。