第 3 章 学习需要方法

第 3 章 学习需要方法

数据挖掘,名词,对数据进行的严刑逼供……
如果拷打得足够久,它会向你坦白任何事情。

无论是对于人类,还是对于机器来说,学习都是一种强大却又微妙的能力。真正的学习涉及如何从一个现象中提取深层次的、基础的关系,如何简要地概括各种不同的事件所遵循的规律,以及如何通过发现基本的定律来统一解释不同的情况

最重要的是,我们真正的目标是能够泛化的模型,以及模型对新实例的解释能力,新实例是指与训练实例来自同一个应用领域,但在学习阶段没有遇见过的实例,而从实例中学习仅仅是走向这一终点的途径之一。与此相反,死记硬背常常被认为是非常低效的学习方式,它虽然对初学者有一定的作用,但是无法使你成为真正的专家。如果目标是泛化,那么模型在学习集上的表现并不能保证泛化是正确的,还可能导致我们对结果过于乐观,因此要极其谨慎地估计这个模型的性能。归根结底,只擅于死记硬背的学生日后在生活中未必能取得个人的成功。

我们需要定义机器学习(简称为ML)的上下文,让其能够全力发挥,又不会因使用不当或过于乐观而造成损害。另外,使用ML并不意味着就不需要使用我们的头脑了。

事实上,开始机器学习流程之前,用户会根据直觉和智能在原始数据中提取一个具有代表性的子集,这一步是非常有用的。特征(或属性)是观察到的现象的各个可度量的性质,这些性质包含了与输出有关的有用的信息。这一准备阶段称为特征选择 (选出一个集),以及 特征提取(生成一个组合,见图3-1)。

图 3-1 监督的学习体系:特征提取和分类

举例来说,字母和数字的图像可以作为输入,输出则是与图像对应的字母或数字符号。与此相关的应用包括邮政编码的自动读取、旧书页图片自动转换为相应文本内容等,这些被称为光学字符识别。直觉告诉我们,图片的绝对亮度不是一个能提供信息的属性(无论亮度如何,数字都保持不变)。在这种情况下,合适的属性可能与图像中的边缘或灰度直方图等有关。一些更为复杂的技术尝试确保那些经过平移和放大的图像也能被正确识别,例如在提取特征的时候参考图像的重心(将一个像素的灰度值当作那个点的质量),或者将图像进行伸缩,使得黑色部分面积尽可能大,等等。提取有用的特征通常需要对该问题的专注、见解和知识储备,这样做将大大简化接下来的自动学习阶段。这就好比一位学识渊博的教授为他所擅长的一门课精心准备教材。

考虑 \ell 元组(元素的有序列表)的训练集,其中每一个元组是形如(\boldsymbol{x}_i,y_i),\,i=1,\cdots,\ell的有序对,\boldsymbol{x}_i是一个d 维空间里(\boldsymbol{x}_i\in\mathbb{R}^d)的输入参数向量(数列),y_i是测量到的输出,即算法要学习的部分。如前所述,我们将会考虑两类问题:当y_i可以取实数值时,为回归问题(regression);当y_i在一个有限集里取值时,为分类问题(classification)。

分类问题(识别以特征x 描述的某一特定目标的类别)中,输出是类别的相应编码。输出y属于一个有限集,例如y_i=\pm1, 或者y_i\in{1,\cdots,N\}。例如,可以将蘑菇分为两类:可食用的和有毒的。

回归问题的输出从一开始就是一个实数值,它的目标是通过建模研究因变量(输出值y)与一个或多个自变量(输入值x)之间的关系。例如,根据蘑菇的特征来预测其有毒物质的含量。

在某些情况下,分类很难始终保持清晰,因为不同类别之间的界线可能是模糊的。试想如何区分秃顶的人和有头发的人?二者之间并不存在明确的界线,正如为掉头发而焦虑的人和卖防脱发产品的人所知的那样。

这种情况下,“清晰的”分类问题很自然地转换成回归问题。为了谨慎起见,输出可以是0~1的实数值。对于给定的输入值,我们可以认为这个输出值是某个给定类别的后验概率;如果不能以概率来解释的话,也可以当作模糊隶属度。举例来说,如果有个人只有几根头发了,说他有头发的概率是0.2并没什么意义,这种情况下说他以0.2这个值模糊隶属于有头发的人可能更合适。当实验的输出数据不确定但可重复时,使用概率是合适的。

以连续值作为输出,例如0~1,可以增加分类系统在实际使用中的灵活性。 还可以通过设定阈值,判断是由人还是由更复杂的系统来帮助解决一些令人迷惑的案例(例如案例的输出落在0.4~0.6的范围内)。简单明了的案例由系统自动处理,而最棘手的案例则由人来处理。在光学字符识别中,比如有一个图像,它可能是数字0(零),也可能是字母O(就像单词Old中的那个),系统最好告诉我们每种情况都有50%的可能性,而不是强行做一个硬分类。当然,接下来还可以使用这个字符的邻近字符或语义信息来进一步分辨。

3.1 从已标记的案例中学习:最小化和泛化

监督学习方法使用实例构造一个函数y=\hat{f}(\boldsymbol{x}),将输入x 和输出y 关联起来。这一关联选自一个灵活的模型 \hat{f}(\boldsymbol{x};\boldsymbol{w}),其中的灵活性 来自可调整的参数(即权重系数w

为了能有具体的印象,想象一台将输入转化为输出的绞肉机,可以通过齿轮与杠杆来调节它。或者想象一个等待输入的“多功能盒子”,它能根据内部参数的影响产生输出。用于“自定义”这个盒子的信息取自给定的训练实例集。 ML的神奇之处在于,这些齿轮的调节不是手动完成的,而是自动通过正确的输入-输出对的示例来进行优化。

图3-1展示了该架构的一种方案,其中区别了两个部分,即特征提取,以及分类器内部最优权重的确定。在许多情况下,特征提取需要一些来自人类的洞见, 然而最优参数的确定则是完全自动的,这也是这一方法被称为机器学习的原因。让模型对训练集中的实例进行正确的分析,从而确定那些自由参数。

认为优化具有强大力量的真正信徒会先从定义误差度量(errormeasure)最小化开始1,并通过合适的(自动化的)优化过程来确定最优参数。这里的误差度量指所有正确答案(由实例的标记得出)与模型输出(由这个多功能盒子的输出得出)之间误差的总和。通常这个误差是一个绝对值,并经常取其平方值。“误差平方和”可能是机器学习领域应用最为广泛的一种误差度量。如果误差为零,表明这一模型在给定的实例上能百分之百地正确工作。误差越小,模型在这些实例上的平均表现就越好。

1把要优化的函数乘以(-1),就可以将最小变为最大。这就是为什么经常谈论“最优化”时通常不会谈及特定方向的最大或最小的原因。

监督学习因此变成了最小化某个特定的误差函数,这一误差函数依赖于参数w。如果只关心最终结果,你可以把优化部分当作多功能盒子上的红色大按钮,当你将已标记的实例集输入这个盒子后,按下这个按钮,它会就某个具体问题提供自定义的结果。

如果你有兴趣开发新的LION工具,接下来的章节将为你呈现优化技术的更多细节。它们的要领是,如果函数是光滑的(想象一下宜人的草木丰茂的加州群山),人们可以蒙住眼睛,像跳伞那样找到一个随机初始点,然后用脚来感觉周围的地势,并总是向着最速下降的方向移动,这样就可以找到海拔很低的那些点(如湖泊)。计算机并未配备“人类视觉”来“看到”这些湖泊,只能每次抽样一个点。通过重复两个步骤,在当前点的邻域进行抽样——在w 空间中——并移动到误差更小的邻居,可以生成一个值越来越小的轨迹。神奇的是,对许多应用而言,这个简单的过程足以达到适当的\boldsymbol{w}^*值。

现在用数学的语言来表述。如果需要优化的函数是可微的,一个简单的方法是使用梯度下降(gradientdescent)。人们可以重复地计算这个函数关于权重的梯度,并朝着负梯度的方向移动一小步。事实上,这是神经网络里很流行的一种技术,称为基于误差反向传播(backpropagation)的学习[115, 116, 92]

函数是平滑的,这一假设并非凭空捏造,而是基于监督学习的一个基础的平滑假设:若两个输入\boldsymbol{x}_1\boldsymbol{x}_2距离很近2,则它们对应的输出y1y2应该也很相近。如果这一假设不成立,那么就不可能将有限训练集泛化到可能无限多的尚未见过的新测试案例上。可以注意到,人们大脑中的信号和相互作用的物理现实都满足这一平滑假设。树突中的化学和电信号交互可看作神经元的输入,神经元的活动(输出)平滑地依赖这些输入,并依次作出反应。

2有些情况下可以测量\boldsymbol{x}_1\boldsymbol{x}_2之间的标准欧几里得距离,但其他情况下需要更有针对性的度量方法。

到现在,你可能会认为机器学习等同于对训练集上的某性能度量的优化,但还缺失了一个部件。误差函数的最小化是首要的关键因素,但并不是唯一的。如果模型复杂度(灵活性、需要调整的参数个数)极高,模型在训练实例上达到零误差是非常容易的,但若将这个模型用于预测新实例的输出,则很可能会一塌糊涂。用人类的学习来打比方,如果死记硬背却未抓住真正的规律,学生将很难做到举一反三。这与偏差-方差(bias-variance)困境有关,它要求我们在选择模型的时候倍加小心,或者将目标函数最小化,改为训练实例误差与模型复杂度的加权组合。

偏差-方差困境可表述如下。

  • 参数过少的模型会因较大的偏差而失准:它们缺乏灵活性。
  • 参数过多的模型则会因较大的方差而失准:它们对于样本中的细节过于敏感(细节中的改变将会使模型产生大的变化)。
  • 找到最佳模型需要控制“模型复杂度”,即模型的结构和参数数量都要恰到好处,从而在偏差和方差之间达成折中方案。

避免过于复杂的模型,而优先选用简单的模型,这种偏好有一个有趣的名字:奥卡姆剃刀,意指“剃去”理论中那些不必要的复杂性3。优化仍在使用,但由于顾及模型的复杂度问题,误差度量需要进行整合。

3奥卡姆剃刀归功于14世纪的神学家和方济会修士奥卡姆的威廉,他写道:“如无必要,勿增实体(entia non suntmultiplicanda praeternecessitatem)。”引用艾萨克·牛顿的解释:“我们要承认,无须为自然事物寻找更多的原因,能正确并充分地解释事物的表现就够了。因此,对于相同的自然现象,我们尽可能给出相同的原因。”

区分监督分类的两类方法也是有意义的。第一类热衷于得到某个关于输入是如何产生输出的“构造性的模型”;第二类更在意结果,即获得正确的分类。前者关心对内在机制的解释,后者则单纯地在意其性能。

第一类情况下,生成方法(generativemethod)尝试在实例中建模,为不同的类型y 生成实测数据x 的过程进行建模。给定某个类,比如有毒的蘑菇,它具有某种外形的概率是多少?用数学的术语来说,学习到的是一个类条件概率密度p(\boldsymbol{x}|y),即在给定y的情况下x 的概率。那么,在给定一个新测量x 时,根据贝叶斯定理,分类y 可以通过最大化后验概率得到:

p(y|\boldsymbol{x}) = \frac{p(\boldsymbol{x}|y) p(y)}{\sum\nolimits_y p(\boldsymbol{x}|y)p(y) }\qquad\qquad\qquad\qquad\qquad\qquad\qquad(3.1)

其中p(\boldsymbol{x}|y)称为数据的似然性,p(y)是先验概率,用以反映在测量之前各种结果的可能性。分母中的项就是普通的规范化条件,使得概率之和为1。有个用于帮助记忆贝叶斯定理的口诀:后验=先验×似然性。

判别算法(discriminativealgorithm)就不会尝试建模数据的生成过程,它们直接估计p(y|\boldsymbol{x}),这个问题在某些情况下比之前生成方法的两步过程(首先建模p(\boldsymbol{x}|y),然后才导出p(y|\boldsymbol{x}))要更简单。判别型方法的例子包括多层感知器神经网络,以及支持向量机(SVM)等,接下来的章节里将会讨论。

判别算法所示的捷径具有深远意义,我们不必知道某些类别如何产生输入实例,也不必为此建立一个详尽的模型,就可以构造精确的分类器。想要不用冒着生命危险去采摘蘑菇,并不需要成为真菌学家,你只需要大量有代表性的蘑菇实例集,并且它们已经正确地分好了类。

认识到不需要成为某个领域的专家就可以做出贡献,这是个人的一小步,却是LION发展道路上的一大步。不用说,成功的企业用朴实低调而又功能强大的数据驱动和优化驱动的工具,弥补了专业知识方面的缺憾。

3.2 学习、验证、测试

基于已标记实例的学习要求我们采用细致的实验程序来测量学习过程的效果。尤其注意,不能将已经用于训练的实例再用于测试学习系统的性能,如果这么做,将是一个可耻且无法原谅的错误。机器学习的目标是获得一个拥有泛化能力的系统,用以分析新的或以往未见过的数据;否则,这个系统就不是在学习,而只是记住了一些已经知道的模式,这也是学校不停更换考试题的原因……

假设有一个能从给定的概率分布中生成标记实例的监督者(一个软件程序或实验过程)。在训练阶段,我们最好向监督者索要一些实例,在测试性能阶段再索要一些新的实例。理想情况下,用于训练的实例数量应足以确保收敛,并且用于测试的实例数量也应该足以保证这个估计具有统计学意义。如果一个用于区分可食用蘑菇和毒蘑菇的机器学习系统只测试了7个蘑菇,那么我们强烈建议你不要认为这个系统是可用的。

然而现实可能与理想相差甚远。一些情况下,训练集是相当小的,并且需要尽可能保证它们能同时满足训练性能测试的要求。这种情况下,实例集必须清楚地分为训练集验证集,前者用来训练,后者用来测试性能,如图3-2所示。一个典型的性能测试是系统输出与监督者给出的正确输出之间的均方根(root meansquare,RMS)误差。值集的RMS值是原始值的平方的算术平均平方根。若e_i是第i 个实例的误差,则RMS值由下式给出:

{\rm RMS}=\sqrt{\frac{e_1^2+e_2^2+\cdots+e_\ell^2}{\ell}}

图 3-2 标记的实例必须分为训练集、验证集和测试集

一般而言,学习过程通过优化模型参数以使得模型尽可能好地拟合训练数据的输出。那样的话,如果我们从验证数据的同一个总体中取一个独立的抽样作为训练数据,一般会导致验证数据集的误差大于训练数据集的误差。如果训练过度的话,这种差异很可能会变得非常严重,并导致过拟合过度训练)。当训练实例很少,或者模型中的参数很多时,更容易发生这种情况。

如果实例数量非常有限,就会面临一个问题:我们是希望用其中的大多数来训练,但要承担一个差劲的有噪声的性能测量的风险,还是拥有一个更具健壮性的性能测量,但要放弃一些训练实例?具体来说,如果有50个蘑菇实例,你是用其中的45个来训练,用剩下的5个来做测试,还是30个用于训练,20个用于测试?……幸好交叉验证(cross-validation)可以帮我们跳过这个尴尬的境况,这是一种普遍适用的方法,它通过重复实验来预测模型的性能,而不是依靠数学分析。

交叉验证的基本思路是以不同的划分形式将原实例集多次划分成两部分,一部分用于训练,另一部分用于测试,再重复多次训练-测试实验,最后取测试结果的平均值。这一思路可以通过k 折交叉验证来实现:将原集随机分为k 个子样本,K-1个子样本用于训练,还有一个子样本用于测试。重复这一过程k 次,保证每个子样本有且仅有一次作为验证数据。最后,将各次的结果平均计算出一个估计值。这种方法的优势是每一个测点都既充当过训练数据,又充当过验证数据,并且刚好有一次用于验证。若实例集实在是非常小,则可使用交叉验证的一种极端情况——留一验证(leave-one-out cross-validation),每次留下原实例集中单独的一个测点用作验证数据,余下的实例都用作训练数据(这种情况下,k 等于实例数)。

分层交叉验证(stratifiedcross-validation)作为一种改进,可以避免训练集和测试集中不同类的平衡问题。它能够避免有时发生这种情况,即某一个类在训练集中很多,而在验证集中很少(相对于所有实例的平均出现率)。应用分层能够分别从每个类别中抽取出\ell/K个测试样本,以保证不同类别的实例分布均衡(见图3-3)。

图 3-3 分层交叉验证,图中是两个类别的例子。在普通的交叉验证中,实例的1/K用于测试,然后该切片“轮换”k 次。在分层的情形中,每个类别中有一个独立切片,用于保持两个类别的相对均衡

如果机器学习方法本身也有一些需要调节的参数,那么将产生一个附加问题。为了避免与模型中的基本参数混淆,或者说为了避免与多功能盒子中自定义的权重相混淆,我们称这些参数为元参数。假设我们想要确定一个迭代的最小化方法的终止条件(什么时候停止训练),或者一个多层感知器中的隐藏神经元的数量,再或者一个支持向量机(SVM)中的关键参数的合适取值。为元参数寻找最优值意味着需要多次重用验证集。而重用验证集又意味着它们也成为了训练过程的一部分。事实上我们正在处理一种元学习,也就是要学会学习的最佳方法。验证集被重用得越多,测得的性能就越可能过于乐观,这很危险,因为已经和新的数据上的真实表现不一致了。这就是现实版的“对数据进行的严刑逼供……如果拷打得足够久,它会向你坦白任何事情”。

在上面提到的方法中,有限的实例集中的每一个实例都被用于各种用途,而合理的做法是,需要将数据分为 3个集合:一个训练集、一个验证集和一个(最后的)测试集。其中测试集仅在最后测试性能时用到一次

最后,请注意,在标准的单轮训练-验证循环中,“验证”和“测试”常被用作同义词,这可能会更令人感到困惑。

3.3 不同类型的误差

在测试一个模型的性能时,各种各样的误差带来的影响并不一样。如果你将有毒的蘑菇当作可食用的,你可能会有生命危险;如果你将可食用的蘑菇当作有毒的,你只是浪费了一点时间。根据问题的不同,确定最佳分类的标准也随之改变。考虑一个二元分类(输出“是”或者“否”)。一些可能的标准是:准确率(accuracy)、精确率(precision) 和召回率(recall)。虽然它们的定义都很简单,但是需要小心区分以避免混淆(见图3-4)。

图 3-4 矩阵中的每一行报告一个类别的不同分类。你可以想象从左边进入,按不同的列进行分类,再从顶部退出的情况。准确率定义为正确答案占总体的比例,精确率定义为正确答案占标记为正类的比例,召回率定义为正确答案占本身是正类的比例。图中依据浅灰色区域的案例,对暗灰色区域的案例进行了划分

准确率是这个分类器给出正确结果(真的正类和真的负类)的比例。其他的度量标准都专注于被标记为属于此类(“正类”)的情况。 精确率等于真的正类数(正确地被标记为属于正类的实例数)除以被标记为属于正类的实例数(真的正类数和假的正类数之和,假的正类是指错误地被标记为属于正类的实例)。召回率等于真的正类数除以本身属于正类的实例数(即真的正类数和假的负类数之和,假的负类是本应该标记为正类,却错误地被标记为负类的实例)。精确率回答这个问题:“有多少被标记为正类的案例是正确的?”召回率回答这个问题:“有多少正类的案例被正确地检索为正类了?”那么现在,在采摘蘑菇时,你是希望精确率更高,还是召回率更高?

混淆矩阵(confusionmatrix)展示了不同案例的分类情况,其中有正确的分类,也有被混淆成其他类别的(见图3-5)。

图 3-5 光学字符识别的混淆矩阵(手写的邮政编码数字)。其中的各种混淆也有道理可言。 例如数字“3”被正确识别632次,被错认为“2”8次,被错认为“5”10次, 被错认为“8”7次。“3”从没有被错认为“1”或“4”,因为它们的形状差别太大了

其中的每一行都展示了某个类别的情况:考虑的总实例数,以及其中有多少被正确地识别(对角线上的单元格),或者有多少被错认为其他类别的成员(其他列上的单元格)。

 梗概

机器学习(ML)的目标是用一个训练实例集来建立系统,这个系统能够正确地泛化到新实例上,这些新的实例是在学习阶段没有见过的,但来自同一个问题。

ML的学习即是为一个灵活的模型找到合适的参数值,这些参数要使得实例集上的误差度量自动最小化,同时也需要避免复杂的模型,从而增加正确泛化的概率。

这个系统的输出值可以是一个类(分类问题),或者是一个数值(回归问题)。在某些情况下,为了增加可用性,可以输出某一类的概率。

只要我们有丰富的有代表性的数据,我们可以在不知道背景知识的情况下建立一个准确的分类器。相较于基于专业领域知识的手动构建的系统,这是一个了不起的改变。

ML是非常强大的,但是它要求严格的方法(一种ML的“教育学”)。可以肯定的是,不要在训练集上测试性能,因为这是弥天大罪:重用验证数据将导致过于乐观的估计。如果实例非常稀缺,你可以使用交叉验证这一手段来炫耀你是个ML专家。

为了安全起见,也为了置身于ML的天堂,你应该保留一些实例用于测试,仅在最后测试性能的时候使用它们。

测试一个模型的性能的方法并不是唯一的,不同类型的误差可能造成不同的损失。准确率精确率召回率是二元分类中性能度量的一些可能的选择,对于更多类别的情况,一个混淆矩阵可以给出全部信息。

目录

  • 版权声明
  • 第 1 章 引言
  • 第 2 章 懒惰学习:最近邻方法
  • 第 3 章 学习需要方法
  • 第一部分 监督学习
  • 第 4 章 线性模型
  • 第 5 章 广义线性最小二乘法
  • 第 6 章 规则、决策树和森林
  • 第 7 章 特征排序及选择
  • 第 8 章 特定非线性模型
  • 第 9 章 神经网络:多层感知器
  • 第 10 章 深度和卷积网络
  • 第 11 章 统计学习理论和支持向量机
  • 第 12 章 最小二乘法和健壮内核机器
  • 第 13 章 机器学习中的民主
  • 第 14 章 递归神经网络和储备池计算
  • 第二部分 无监督学习和聚类
  • 第 15 章 自顶向下的聚类:K 均值
  • 第 16 章 自底向上(凝聚)聚类
  • 第 17 章 自组织映射
  • 第 18 章 通过线性变换降维(投影)
  • 第 19 章 通过非线性映射可视化图与网络
  • 第 20 章 半监督学习
  • 第三部分 优化:力量之源
  • 第 21 章 自动改进的局部方法
  • 第 22 章 局部搜索和反馈搜索优化
  • 第 23 章 合作反馈搜索优化
  • 第 24 章 多目标反馈搜索优化
  • 第四部分 应用精选
  • 第 25 章 文本和网页挖掘
  • 第 26 章 协同过滤和推荐
  • 参考文献