PDF 物理页索引 240
文件中的第 241 页 · 印刷页码:225
梯度下降算法本身还存在一些算力层面的限制,虽然理论上求解函数图像特定点的梯度仅是计算一阶方向导数,但现在的工作毕竟不是简单地对一个已知的光滑连续函数求导,已知的数据是由一堆训练样本构成的不连续的采样点。如果每一次都是通过样本代入来求解梯度的话,那么当样本数量很庞大,且选定的学习速率的值相对较小时,就需要进行很多次求解梯度的操作,因此所有样本都参与运算是相当耗费计算资源的。实践中常常每次都只随机挑选一个样本来计算梯度,这种做法是梯度下降算法的一种改进形式,称为“随机梯度下降”(Stochastic Gradient Descent,SGD)算法,之前使用全部样本进行训练的原始形式称为“批量梯度下降”(Batch Gradient Descent,BGD)算法。这两种算法各自的优缺点非常明显,在训练速度方面,随机梯度下降算法由于每次仅采用一个样本来迭代,虽然迭代次数会多一些,但训练速度很快,解决了批量梯度下降算法在大量样本下的计算效率问题。但在准确率方面,随机梯度下降算法仅用一个样本决定梯度方向,由于迭代方向变化很大,不一定能很快地收敛到局部最优解,可能会不断地在最优解附近振荡,导致解有可能不是全局最优的。为了平衡这些优缺点,日常应用时会在这两种算法之间折中,每次随机选择一小批样本来进行训练,这种形式被称为“小批量梯度下降”(Mini-Batch Gradient Descent,MBGD)算法,该算法使得训练过程较快,也能保证最终参数训练的准确率。
第 6 章 机器学习概览
225
○一 凸函数、凹函数是数学概念,其本质是描述函数斜率增减。语义上凸为正,代表斜率单调不减;凹为负,代表斜率单调不增。
PDF 物理页索引 241
文件中的第 242 页 · 印刷页码:226
梯度下降算法只是机器学习中常用的优化算法中的一种,适用于无约束优化的场景,除了梯度下降算法以外,其他常见的优化算法还有前面提到的最小二乘法、牛顿法和拟牛顿法等。从运算角度来看,它们各有优势。最小二乘法是求误差的最小平方和,如果求解目标是线性问题,本质上就是解线性方程组,是有全局最优的解析解的,但是如果样本量很大,就要对一个很大的矩阵求逆,这就很困难或者需要花费很长时间才能求得解析解了,此时反而不如梯度下降算法的快速收敛更有效。梯度下降算法、牛顿法、拟牛顿法都是迭代求解,不过梯度下降算法依赖的是梯度,而牛顿法、拟牛顿法是用二阶的海森矩阵的逆矩阵或伪逆矩阵求解。相对而言,使用牛顿法、拟牛顿法收敛更快,但是每次迭代的时间比梯度下降算法的时间长。
6.6.10 终极算法
利用优化算法求解出模型的参数后,所训练的模型已经产生。至此,机器学习建模过程的所有步骤,从数据采集、预处理、选取特征、确定损失函数、解决欠拟合和过拟合问题,到最后通过优化算法获得模型我们都一一讲解过了,读者是否会有这样一种感觉:虽然说是实战,属于实际操作的内容,但这里每个步骤似乎都有很大的灵活性,或者说有很大的不确定性。笔者几乎在每一个知识点的讲解里,都说过类似“必须根据实际情况去权衡选择”之类的话,这话听起来是合理的,但我们真的只能如此吗?事事都需要有人来参与,“机器学习”这事做起来只见“人工”,一点都不“智能”。
在本章开篇笔者曾提过一个问题:有没有可能存在一种能够遵从的模型算法,一步一步地根据这个步骤做下来,就能一揽子解决所有机器学习问题?根据现在各种学习算法并存的现状,读者自然能推测出目前并不存在能应对所有场景的完美无缺的学习算法。但是,未来是否有可能找到这样的完美算法呢?如果真的有,无论它多么烦琐、复杂,我们都可以把它变为计算机能执行的程序,计算机最擅长的就是解决烦琐却有具体步骤的问题。
226
第三部分 第三波高潮
PDF 物理页索引 242
文件中的第 243 页 · 印刷页码:227
有这样的想法并不奇怪,研究机器学习天生就有一种对“终极算法”的向往,与被热力学第二定律“判处死刑”之前的永动机一样,令许多人趋之若鹜。从“古”至今有很多这方面的论文,意图通过三个特例来说明自己改进的算法多么高效、适用于诸多应用场景,或者得出类似论断的比比皆是。
1997 年,两位数学家威廉·麦克雷迪(William Macready)和戴维·沃尔珀特(David Wolpert)深入研究并解决了“终极算法”问题,他们通过数理逻辑严格地证明了一个结论:
假设所有问题出现的机会相等,或者说所有问题都是同等重要的,那不论学习算法 A 有多“聪明”、学习算法 B 有多“笨拙”,它们的性能期望都是相同的。
这个结论蕴含了一个听起来颇违反直觉的事实:如果一个算法解决某类问题的效率比解决其他类型的问题的效率高,那么它一定不具有普适性,一定存在另外一类问题使得这个算法的性能低于随机选择的结果。简而言之,对于没有特定上下文和目标偏好的笼统问题,高效与普适是矛盾的。这个结论被麦克雷迪和沃尔珀特很形象地命名为“没有免费的午餐定理”(No Free LunchTheorem,NFLT)。“没有免费的午餐定理”让我们认清楚一个事实:若脱离实际情况,空谈哪种机器学习算法更是毫无意义的,无论算法怎样,无论它有多复杂,它和随机抛几枚硬币来胡乱猜测参数值这样的方法所取得的效果都是一样的。要谈论一种算法的优劣,一定是在具体问题上才有相对优和劣的概念,没有绝对最好的“终极算法”存在,在某些问题上表现好的算法,在另一个问题上一定会不尽如人意。
“没有免费的午餐定理”并不是说研究不同的模型算法没有意义,它生效的前提是“所有问题都同等重要”,而实际情形肯定不是这样。一般我们只需要关注自己真正要解决的问题,而不需要关心我们的解决方案在另一个问题上的表现是否同等出色。为了解决真实世界中的问题,我们可能需要提出多个不同的模型。对于每一种模型,我们同样有多种算法来训练模型。在实现算法的过程中,也同样存在算法准确度、效率和存储空间之间的折中。但是真正身处其中时,人们往往还是容易陷入盲目的算法崇拜,如在今天的机器学习研究中,很多人就沉迷于“深度学习”不可自拔,心中多少都有深度学习比其他算法更好的想法。其实有时候探究解决问题的具体步骤反而是其次的,深刻理解问题本身,因地制宜地制定解决问题的策略更为重要。
第 6 章 机器学习概览
227
PDF 物理页索引 243
文件中的第 244 页 · 印刷页码:228
6.7 评估验证
在机器学习领域,模型完成训练之后,还有最后一个必要步骤:对建立的模型进行性能评估(Evaluation),得到该模型的性能指标,只有有了量化的标准,才能更好地衡量我们选择的模型和训练的过程是否正确。而如何评估模型性能,这其实已经不是什么新的知识了,传统统计学中已有成熟的方法可供使用。
6.7.1 性能度量
在之前介绍损失函数的时候,我们已经初步涉及模型性能度量的问题。关于评价一个机器学习模型的性能指标,根据其解决问题的类型,前人已总结出许多指标可供选择。与分类问题相关的指标有“正确率”(它和错误率是同一个指标,即“1- 错误率”)、“精确率”(Precision)、“召回率”(Recall)和“F1 分数”(F1-Measure)等,而与回归问题相关的指标有各种类型的误差指标,如“平均绝对误差”(Mean Absolute Error)、“均方误差”(Mean Squared Error)、“标准差”(Standard Deviation)等,还有分数类型的指标,如“F2 分数”(F2-Measure)、“可释方差分数”(Explained Variance Score)等。
限于篇幅,笔者不一一解释上述指标的概念和用途,依然以实践优先的原则,仅以前文实战里邮件分类过程中遇到的指标作为范例展开讲解,这里首先要说清楚“正确率”“精确率”和“召回率”这三个指标的意义。现在,先假定一个具体场景作为后续讨论的基础:
228
第三部分 第三波高潮
PDF 物理页索引 244
文件中的第 245 页 · 印刷页码:229
假设测试集中包含有效邮件 8000 封,垃圾邮件 2000 封,共计10000 封邮件。我们的目标是找出所有的垃圾邮件。现在使用某个模型从中挑选出 5000 封垃圾邮件,经核实,模型挑选的垃圾邮件中有2000 封确实是垃圾邮件,但还错误地把 3000 封有效邮件也当作垃圾邮件挑选出来了。
作为评估者,我们采用不同的指标来评估一下该模型的性能。首先我们知道垃圾邮件的识别模型是一个典型的 0-1 分类器,它的输出结果可能有以下四种:
1)将垃圾邮件识别为垃圾邮件,这种 0-1 分类器将正面结果识别为真的称为“真正”(True Positive,TP)。
2)将垃圾邮件识别为有效邮件,这种 0-1 分类器将正面结果识别为假的称为“假正”(False Positive,FP)。
3)将有效邮件识别为垃圾邮件,这种 0-1 分类器将负面结果识别为假的称为“假反”(False Negative,FN)。
4)将有效邮件识别为有效邮件,这种 0-1 分类器将负面结果识别为真的称为“真反”(True Negative,TN)。
这四种结果所包含的预测值和实际值的关系,可以通过图 6-32 直观地反映出来。
第 6 章 机器学习概览
229
PDF 物理页索引 245
文件中的第 246 页 · 印刷页码:230
有了“真正”“假正”“假反”和“真反”这四个概念,就可以给出“正确率”“精确率”和“召回率”的定义了。
正确率是指对于给定的测试数据集,分类器正确分类的样本数与总样本数之比,即
$$
\mathbb { E } \oplus \sharp \sharp \sharp \frac { \partial \mathbb { E } \oplus } { \mathrm { ~ \tiny ~ \textnormal ~ { ~ T N ~ } ~ \textnormal { ~ F N ~ } ~ \textnormal { ~ T P ~ } ~ \textnormal { ~ F P } ~ } }
$$
具体体现到我们预设的讨论场景中,正确率是此模型分辨正确的邮件数量占总邮件数量的比例,我们可知该模型判断正确的邮件是 7000 封(2000 封垃圾邮件、5000 封有效邮件),而总邮件数量是 10000 封,所以模型的正确率就是 70%,或者换句话说,模型的错误率是 30%。
正确率是模型非常常用的指标之一,它很直观地反映了人们对模型能够“正确工作”的需求,对某些问题它能够衡量模型的性能,但是在另外一些场景里,它却会陷入“正确率悖论”(Accuracy Paradox)<sup>○一</sup>的尴尬之中。现在修改一下讨论场景中的数据,以便为读者展示什么是“正确率悖论”:假设测试集的 10000 封电子邮件中只包含 150 封垃圾邮件,其余都是有效邮件。在这个数据基础下,提供以下两个模型供读者择优选择:
第一个模型从 10000 封邮件中识别出了 250 封垃圾邮件,而这 250 封被标记的垃圾邮件中,有 100 封确实是垃圾邮件,另外 150 封则是被错误标记的有效邮件,如表 6-2 所示。
根据正确率的定义,易知在此测试集下,该模型的正确率是 98%,计算过程为:
230
第三部分 第三波高潮
○一 正确率悖论的解释:https://en.wikipedia.org/wiki/Accuracy\_paradox。
PDF 物理页索引 246
文件中的第 247 页 · 印刷页码:231
第二个模型是一个压根不能工作的“坏模型”,它在这 10000 封邮件中完全没有找出任何垃圾邮件,如表 6-3 所示。
奇怪的是,按照正确率的计算公式,在此场景下,这个不能工作的模型算出来的正确率居然更高,为 98.5%。计算过程为:
显然,第二个不能工作的模型对我们而言没有任何价值,该场景下的正确率不能正确反映模型的性能,即我们所说的“正确率悖论”。这也是另外一个从侧面说明我们做机器学习研究时必须先理解问题,因地制宜地选取指标,不能抱着特定方法僵化操作的例子。
现在我们需要采用另外的评价指标来对这个测试集进行度量,“精确率”是一个比较合适的选择。精确率是针对模型预测结果而言的,它是指“被模型正确标记的正例样本”在“被模型检索到的所有样本”中所占的比例,通俗点说就是“预测为正的样本中有多少是真正的正例样本”,再通俗点的说法就是“你的预测有多少是对的”。精确率反映的是模型的“查准比例”,它的计算公式如下所示:
$$
\$ 123,456
$$
根据这个公式,可以算出前面两个模型的精确率,模型一的精确率是 100/$( 1 0 0 + 1 5 0 ) = 4 0 \%$ ,而模型二没有工作,不论正确与否,它没有检索出任何一个样本,即公式中分母部分为零,因此精确率对模型二是毫无意义的,这就如实地反映出了一个无法工作的模型是没有意义的这个事实。使用精确率评估这两个模型的预测结果要比正确率更为合适。
最后一个指标“召回率”是针对测试集中被正确检索的样本而言的,它表示的是样本中有多少正例被模型正确预测了。“正确预测”有两种可能,一种是把实际中的正例预测成真正例(TP),另一种是把实际中的反例预测成假反例(FN),即以下公式:
第 6 章 机器学习概览
231
PDF 物理页索引 247
文件中的第 248 页 · 印刷页码:232
$$
\bigstar \bigstar | \bigstar | \bigstar \bigstar \bigstar \bigstar \bigstar \bigstar
$$
召回率的通俗解释就是“在样本的正例里面,有多少正例被正确预测了”,它度量的是模型的“查全比例”,因此也叫“查全率”。根据公式,模型一的召回率是 $1 0 0 / ( 1 0 0 + 5 0 ) \approx 6 6 . 7 \%$ ,而模型二的召回率为 0,看来在我们的讨论场景里,召回率是最佳的衡量指标。
我们还需要注意到,类似于偏差和方差的关系,精确率和召回率其实也是一对互相影响、需要权衡的指标,这点倒是比偏差和方差更容易理解:过分精确就难以全面,过分追求全面可能就容易损失精确性。理想情况下肯定希望模型能够做到两者都高,但是在模型性能固定的前提下,精确率高召回率就偏低,召回率高精确率就会偏低,所以偏向精确还是偏向全面,也是需要根据实际情况做出权衡的。
譬如,在做自然灾害预测时,就应该更注重召回率,我们宁愿发出 100 次警报,把 10 次真正发生的自然灾害都预报到了,也不要只发布 10 次警报,对了其中 8 次,漏掉了 2 次灾害。但是在给犯罪嫌疑人定罪的时候,我们就必须把精确率放在优先位置,必须坚持“疑罪从无”原则,查准优先于查全,不能错怪一个好人。
如果模型的这两个指标都偏低,那肯定就是有什么地方出问题了。当我们需要综合衡量精确率和召回率时,通常会以一个名为“ F1 分数”的新指标作为度量,“ F1 分数”并没有什么特殊含义,它就是精确率和召回率的调和平均值,如果模型的 F1 分数还不错的话,那说明它的精确率和召回率都不会过于难看。F1 分数的计算公式如下:
$$
\mathrm { F 1 } \not \gg \not \{ \not \exists \} \qquad \frac { 2 \times \not \mathrm { F } \not \equiv \not \equiv \not \equiv \ \times \not \exists \not \equiv \not \equiv } { \not \mathrm { F } \not \exists \not \equiv \not \equiv + \not \langle \not \exists \not \equiv \not \equiv } \ = \ \frac { 2 \mathrm { T P } } { \ 2 \mathrm { T P } \ : \ : \mathrm { F P } \ : \ : \mathrm { F N } }
$$
对于分类问题,主要度量指标就是以上介绍的这些,而对于回归问题,通常直接用误差(有多种误差的计算方式,如平均绝对误差、均方误差等)来衡量,这部分在之前介绍误差、偏差和方差的章节已经讲得比较详细了,这里不
232
第三部分 第三波高潮
PDF 物理页索引 248
文件中的第 249 页 · 印刷页码:233
再重复。除此之外,还可以使用 ROC、PR 曲线、AUC 等度量指标评价机器学习模型的性能。
6.7.2 交叉验证
无论我们选用哪种性能度量指标来评价模型性能,都需要谨记一点:这个指标一定不能是在训练集中测定出来的,原因在讲解过拟合的时候已经讲过。通常,在建模之后要专门在独立的测试集中进行性能验证,我们一般不会将全部数据用于训练模型,否则就没有测试集对该模型进行验证,评估模型的预测效果了。为了解决这个问题,得到可用的测试集,有以下两个常用的方法。
首先是最容易想到的一个方法,即把供训练的数据按照一定比例分为两个部分,一部分用于训练,一部分用于测试,这样自然就得到训练集和测试集了。但是这个简单的方法存在两个很明显的缺点。第一个缺点是模型性能的测试结果将受到测试集和训练集划分方式的影响,这个影响往往可能是非常显著甚至决定性的。不同的测试集和训练集划分方式,将导致模型从特征参数的选取,到模型决策函数的选定,再到训练策略和优化算法都有可能做出不一样的权衡。
图 6-33 展示了用 10 种不同的划分方式在同一个训练数据集中提取不同样本作为训练集和测试集得到的均方误差,左边是模型在实际数据中测定的均方误差值,右边是 10 种不同划分方式得到的测试集中测定的均方误差值。可以看出,不同的划分方式对模型的性能指标有非常大的影响,由于评价指标的剧烈变化,它们对应的最优模型形式和算法选择必然也有很大差异。
第 6 章 机器学习概览
233
PDF 物理页索引 249
文件中的第 250 页 · 印刷页码:234
因此,划分训练集和测试集的时候,要特别强调均匀取样。均匀取样的目的是减少训练集、测试集与完整集合之间的统计偏差。不过,“均匀”二字虽然听起来简单,却不易做到。一般的做法是随机取样,当样本数量足够时,便可达到均匀取样的效果,然而随机是此做法的盲点,也是实验中可以在数据上做手脚以控制实验结果的漏洞。举例来说,要做一个文字识别的模型,当辨识率不理想时,一般会重新取样划分出一组新的训练集和测试集,直到测试集的识别率令人满意为止,即使每次划分确实是随机的,但严格来说,这样其实也已经算是在作弊了。
第二个缺点是,划分了训练集、测试集之后,就只能采用部分数据进行模型训练了,而用于模型训练的数据量越大,训练出来的模型效果通常会越好,所以训练集和测试集的划分意味着我们无法充分利用手头上所有的已知数据,得到的模型训练效果会受到一定程度的影响。
由于以上这两个缺点,这种在数据集上简单划分的方法,用来理解性能度量和验证是没有问题的,但在实际场景中的用途比较有限。为了解决这两个问题,一种改进的新的验证方法被提出,它被命名为“交叉验证”(CrossValidation)。
交叉验证方法现在已有很多变种形式,前面提到的划分训练集和测试集的方法在许多资料中也被认为是交叉验证中的最基础形式,称为“ Hold-Out 方法”。目前较为常见的、具有实用价值的交叉验证形式叫作“留一验证”或者“ LOOCV”(Leave One Out Cross Validation)方法。如同之前 Hold-Out 方法的训练集和测试集划分一样,LOOCV 方法也有把数据集划分为训练集和测试集这一步骤。但是两者的差别是,LOOCV 方法只采用单个样例数据作为测试集,所有其他的样例都作为训练集使用,然后将此步骤重复 N(N为数据集中的数据总量)次,直至集合中的每一个样例都充当过一次测试集为止,具体操作如图 6-34 所示。
假设我们现在有N个数据组成的数据集,那么 LOOCV 方法会每次取出一个数据作为测试集的唯一元素,其余的N-1 个数据都作为训练集用于训练模型和调参。这样训练N次之后,我们会得到N个不同的模型,假设还是将均方误差作为模型的性能度量指标,那每个模型都能在测试集上计算得到一个均方误差值,而最终的均方误差则是对这N个均方误差值取平均,如下所示:
234
第三部分 第三波高潮