奎克的藏经阁 · MinerU 解析内容

智慧的疆界 从图灵机到人工智能

456 个 PDF 物理页 · 本页显示文件第 211–220 页

PDF 物理页索引 210

文件中的第 211 页 · 印刷页码:195

数据预处理阶段虽然是建模的准备阶段,是为建模服务的,但实际上在机器学习处理问题的过程中,这个阶段的工作量往往要占总工作量的一半甚至更多。并且它与建模及其他阶段并不是严格的先后顺序关系,而是贯穿在模型训练的全过程之中。有句圈子内常说的话:“数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。”由此可见,数据预处理,尤其是特征选择在机器学习中占有相当重要的地位。

6.6.5 损失函数

完成数据预处理之后,便进入了电子邮件过滤系统的建模阶段。我们可以先从最简单的单一特征开始,构造一个最简单的垃圾邮件判别模型。假设我们选择以“收件人数量”这个特征为依据,对训练集中的 110 封电子邮件样例按照该特征进行统计,得到不同收件人数量的邮件样例分布,如图 6-9 所示。

第 6 章 机器学习概览

195

PDF 物理页索引 211

文件中的第 212 页 · 印刷页码:196

从样例分布图中可以看出,只有收件人数量为 1 的邮件是完全不包含垃圾邮件的,如果我们以“收件人是否多于 1 人”来划分是否垃圾邮件的话,很快就能构造出一个最简单的垃圾邮件判别模型,形式如下:

$$
f ( x ) = { \binom { 0 , x > 1 } { 1 , x \leqslant 1 } }
$$

这个模型在训练集上的判别结果将如图 6-10 所示。

显然,即使凭肉眼观察,读者也可以知道这个结果并不是最优的,因为它虽然正确区分出了一部分垃圾邮件和非垃圾邮件,但是同时存在非常大量的误判,在 110 封邮件中足足有 40 封邮件被模型误判了。

我们只要稍微调整一下判定标准中收件人的数量,以“收件人是否多于 2人”来划分垃圾邮件的话,效果就有所改善,虽然还是有一部分垃圾邮件成为“漏网之鱼”,被认定为非垃圾邮件,但是这时在 110 封邮件样例中只有 20 封邮件被误判,如图 6-11 所示。

由收件人数量从 1 到 2 的简单调整所带来的结果变化可知,根据模型的工作效果来决定选取哪些特征、什么特征值作为标准才是合适的。对于如何衡量机器学习模型的工作效果这个问题,我们最容易想到的指标是正确分辨或者错判的样本数占样本总数的比例,即“正确率”(Accuracy)或“错误率”(ErrorRate,其含义为“1- 正确率”)。实际上,正确率确实是一个比较常用的度量指标,但具体采用什么度量标准还是要取决于具体的任务需求,有一些情况会选择其他指标,譬如精确率、召回率、F1 分数等作为评估性能的度量标准,这部分内容将在 6.7 节中再展开说明。

196

第三部分 第三波高潮

PDF 物理页索引 212

文件中的第 213 页 · 印刷页码:197

上面这个例子里,收件人数量从 1 到 2 所带来的结果变化是显而易见的,建模过程似乎简单到有点粗糙的地步,不过这已经足够揭示机器学习建模的基本思路了:通过各种方法,包括但不限于选定适当的策略、优化算法,根据训练集中蕴含的信息找出最相关的特征和合理的模型结构等,实现让模型的输出结果与实际结果差异最小。请读者特别注意黑体部分的文字,这就是所有监督学习的共同目标。

我们把邮件分类问题这个特例向用监督学习解决问题的思路推广,会得到以下更具普适性的结论:使用符号f代表模型的决策函数,这个模型接收真实世界的输入x,将f(x)的输出记作 $y _ { \mathrm { ~ o ~ } } ^ { \prime }$ 由于模型只是对真实世界的模拟,所以输出值 $y ^ { \prime }$ 与真实世界中的实际值y是存在差异的,而机器学习中性能高低的度量标准,就是追求这个差异值的最小化程度,模型输出与真实值的差距越小,模型性能就越好。我们把衡量实际值y与模型输出值 $y ^ { \prime }$ 间差距大小的函数称作“损失函数”(Loss Function,有些资料中也称为“成本函数”或“代价函数”,Cost Function),记作 $^ { * } \mathrm { L o s s } ( y , y ) ^ { * }$ 或者直接用f(x)代替 $y ^ { \prime } ,$ ,把损失函数记作 $^ { * } \mathrm { L o s s } ( y , f ( x ) ) ^ { * }$

损失函数虽然是机器学习中的入门知识,却是整个统计机器学习的核心和精髓,现在机器学习的所有研究,很大一部分都是围绕着如何找到合适的损失函数、如何优化损失函数来进行的。统计机器学习中主要的模型和算法,如线性回归、逻辑回归、支持向量机、Boost 算法、神经网络等,本质上都是基于不同的损失函数建立起来的,尽管各有自己的思想和依据,但从损失函数的角度来看,它们在数学原理上有共通之处。稍后要介绍的关于过拟合的处理内容,还有前面数据预处理中只提到名字的 $\mathrm { L } _ { 1 }$ 正则项(如何用 $\mathrm { L } _ { 1 }$ 正则项做特征提取)等,所依赖的正则项(惩罚函数)也都是服务于损失函数,以损失函数修正项的形式存在的,这些知识同样需要基于损失函数去理解。

第 6 章 机器学习概览

197

PDF 物理页索引 213

文件中的第 214 页 · 印刷页码:198

看到这里,部分读者可能有一个疑问:要判断y 和 $y ^ { \prime }$ 之间的误差,直接把二者相减看看结果大小不就行了吗?就算是向量也可以做加减法,为何还要专门搞个函数来衡量误差呢?答案是此处进行的并非两个向量值之间的简单对比,而是在连续多个输入(x)下得到的多个多维向量 $\left( \boldsymbol { \mathbf { \mathit { y } } } ^ { \prime } \right.$ 和y)之间按照不同的差异度量指标进行比较。

举个例子,假设y 和 $y ^ { \prime }$ 都是二维向量(由两个值构成的向量),由于实际样本来源于传感器或者数据库收集的数据,因此通常是离散的,而模型的输出值是决策函数的计算结果,完全可以是连续的。我们在二维平面中把实际输出值y 用点表示,模型的输出值 $y ^ { \prime }$ 用线表示,把两者放在同一个坐标系中,形成如图 6-12 所示的结果。现在请思考一个问题,有什么依据可以用来判定这样一条线与所有点的差异最小?换句话说,这条线是最能拟合所有点的线吗?如果把线上下稍微偏移一下,或者角度稍微旋转 $3 ^ { \circ }$ 或者 $5 ^ { \circ }$ ,它与实际值的差距有没有可能更小呢?

要解答这个问题,就必须先确定“差距”是如何定义的。其中一种比较直观的衡量差距大小的方法是,把y 与 $y ^ { \prime }$ 之间的差距理解为它们在欧氏空间中位置的距离,即两个向量之间的欧氏距离<sup>○一</sup>。我们要让 $\boldsymbol { y }$ 与 $y ^ { \prime }$ 的误差最小,就要使得它们的欧氏距离最短,其背后等价的意义就是在这一群点中画一条线,让所有点到直线的距离之和最小。

198

第三部分 第三波高潮

○一 在数学中,欧氏距离或欧氏度量是欧氏空间中两点之间的“普通”(即直线)距离。使用这个距离,欧氏空间成为度量空间。

PDF 物理页索引 214

文件中的第 215 页 · 印刷页码:199

我们将图 6-12 中的一个局部区域放大,如图 6-13 所示,实际样本值与模型输出值之间的空间差距以平行于纵坐标轴的线段表示。

这种以y 与 $y ^ { \prime }$ 的欧氏距离来度量误差的标准,在统计学里被称为“均方误差”(Mean Squared Error,MSE)。对于以均方误差最小化作为目标的损失函数,我们称为“平方损失函数”(Squared Loss Function)。两个名词中都带有“ Squared”这个单词,体现了欧氏空间里欧氏距离的数学公式就是两个向量差值的平方,所以,平方损失函数的表达式如下所示:

$$
\operatorname { L o s s } ( y , y ^ { \prime } ) = ( y - f ( x ) ) ^ { 2 }
$$

解决以平方损失函数作为损失函数的机器学习问题,也就等同于求解一条距离所有样本点的欧氏距离最短的线。如果选择的是线性模型,即例子中的直线,或者更高维的超平面,在数学上都可以采用“最小二乘法”(LeastSquares Method)来解决平方损失函数的最小化求解问题<sup>○一</sup>。所谓“二乘法”就是中国古代算平方的说法,“最小二乘法”其实就是求解平方最小值的意思。如果所选择的模型并不是线性的,如曲线或者超曲面,那么模型就不会有解析解<sup>○一</sup>,需要用优化算法逐步逼近去求解模型。

第 6 章 机器学习概览

199

○一 关于详细的数学证明,笔者在此就不罗列了,读者可以参考 https://zh.wikipedia.org/wiki/ 最小二乘法。

PDF 物理页索引 215

文件中的第 216 页 · 印刷页码:200

采用欧氏距离最小化来作为差距衡量标准只是众多误差评估标准中的一种,任何一种评估标准都不可能适用于全部场景。除了平方损失函数外,下面再列举部分常见的损失函数及其具有代表性的机器学习模型和策略算法:

1)0-1 损失函数:

$$
\operatorname { L o s s } ( y , y ^ { \prime } ) = { \left\{ \begin{array} { l l } { 1 , y \neq f ( x ) } \\ { 0 , y } & { f ( x ) } \end{array} \right. }
$$

2)绝对值损失函数:

$$
\begin{array} { r l } { \mathrm { L o s s } ( y , y ^ { \prime } ) } & { { } | y - f ( x ) | } \end{array}
$$

3)对数损失函数(广泛用于逻辑回归):

$$
\mathrm { L o s s } ( y , y ^ { \prime } ) = \frac { 1 } { n } \sum _ { i = 1 } ^ { n } \log ( 1 + \mathrm { e } ^ { - w ^ { \mathrm { T } } x _ { i } y _ { i } } )
$$

4)指数损失函数(广泛用于 Boost 算法):

$$
\operatorname { L o s s } ( y , y ^ { \prime } ) = \frac { 1 } { n } \sum _ { i = 1 } ^ { n } \exp ( - y _ { i } f ( x _ { i } ) )
$$

5)Hinge 损失函数(广泛用于支持向量机):

$$
\operatorname { L o s s } ( y , y ^ { \prime } ) = \frac { 1 } { n } \sum _ { i = 1 } ^ { n } \operatorname* { m a x } ( 0 , 1 - w ^ { \operatorname { T } } x _ { i } y _ { i } )
$$

……

与平方损失函数代表欧氏距离的含义类似,以上每一种损失函数都有各自的数学(几何或者概率)中的具体含义。其实,所谓学某种监督学习算法,很大程度上就是理解其损失函数的意义,然后学习如何求解或者优化,得到使损失函数值最小的模型结果。

以讲解机器学习算法为主要目的的书籍,譬如周志华老师的《机器学习》和李航老师的《统计学习方法》,会详细介绍每一种算法的相关内容,而本书的重点是从整体上了解人工智能的全貌,不是解析每种机器学习算法的细节和步骤,所以对这些算法内容感兴趣的读者,可以参考上述两本书继续学习。现在回到我们的邮件过滤系统实战中来。

200

第三部分 第三波高潮

○一 解析解是方程的解析式(比如一元二次方程的求根公式),是方程的精确解,能在任意精度下满足方程;数值解是在一定条件下通过某种近似计算得出的数值,能在给定的精度下满足方程。

PDF 物理页索引 216

文件中的第 217 页 · 印刷页码:201

6.6.6 模型选择

如果只使用“收件人数量”这一个特征的话,最优的结果仅是在 110 封样本邮件中把错误归类的邮件减少到 20 封。显然这样的效果基本上没什么实用价值,它表明靠单个特征作为模型参数不足以建造出性能足够好的模型,因此我们还需要再引入一个或者更多的新特征来参与到模型构造之中,建造一个更高复杂度的模型,使其性能满足需要。

这里仍然先把如何自动、合理地选择特征这个问题放一放,假设我们选择“邮件长度”作为第二个特征,用两个特征共同构造一个判别模型。那么以邮件长度作为统计维度,得出 110 封邮件的分布结果,如图 6-14 所示。

图 6-14 反映了单独采用“邮件长度”作为判别是否垃圾邮件的依据的垃圾邮件分布结果,这个统计结果本身并没有什么可取之处,很明显单独使用邮件长度值作为判别依据也不能获得性能足够好的模型。不过,如果我们把这个统计结果与之前以收件人数量作为判别依据的统计结果联合起来,同时使用两个特征作为判别依据的话,可以得到一个与图 6-15 类似的统计图形,这个结

第 6 章 机器学习概览

201

PDF 物理页索引 217

文件中的第 218 页 · 印刷页码:202

果看起来似乎就豁然开朗了。

上面这个二维坐标系其实表达了不止两个维度的信息:以收件人数量为横坐标,以邮件长度为纵坐标,还有以不同点(空心点和实心点)表示的结果。引入第二个判别特征之后,原本分布在一维坐标轴上的邮件柱状统计图变成了分布在二维平面上的点,这时,可以发现在一维坐标轴上犬牙交错、难以直接划分开的垃圾邮件和非垃圾邮件在二维平面中居然是泾渭分明的,区分得非常完美(当然,这里是笔者为了讲解效果特意处理过的数据,实际情况中两个特征肯定仍是不足以完美区分出垃圾邮件和非垃圾邮件的)。

假如两个特征真的足以将是否垃圾邮件如此完美地区分开,那我们只需要在该二维平面里,沿着两类邮件的中间画出一条分界线,将平面分成两部分。当有一封新的邮件输入时,就将其按照收件人数量和邮件长度映射到该平面中,如图 6-16 中五角星所示。如果它分布在属于垃圾邮件一边的空间,那它就被判别为垃圾邮件,否则它就是一封非垃圾邮件。

这个分类器的思路很符合正常人的逻辑思维习惯,事实上也确实是行之有效的,机器学习中把这种分类方法称为“线性分类器”,它是一种基础但在机器学习中极为常见的应用方式。不过,思路虽然想明白了,但在具体操作层面上我们仍有一个问题没有解决:这里并没有定义清楚到底如何在二维平面里沿着两类邮件的中间画出一条直线。

202

第三部分 第三波高潮

PDF 物理页索引 218

文件中的第 219 页 · 印刷页码:203

在图 6-17 中,笔者随意画了三条划分两类邮件的直线,到底应该以哪条线为准呢?这些分界线当然不可以随意挑选,如图 6-17 右上角和左下角分别有一个代表新邮件的五角星,它们属于垃圾邮件还是非垃圾邮件,完全取决于我们选择了哪条线作为空间的分界线。可见分界线的选定对模型的判定结果是有直接影响的,不可能在满足训练集样例的约束下人为随意地选定一条就能符合需要。

要解决这个问题,首先应该想办法增加训练集中的数据量,样例越多,在平面中形成的点越密集,对空间分界线的约束就越有力,如果周围布满了密密麻麻的点,那分界线可以随意腾挪的空间就很小了。但即使分界线可以腾挪的范围被约束得越来越小,只要它是一个空间,就还是能容纳无数条直线,仍然有无数种分界线方案可供选择。

第 6 章 机器学习概览

203

PDF 物理页索引 219

文件中的第 220 页 · 印刷页码:204

事实上,这条直线的位置是由我们选择的决策算法决定的,基于不同算法构造的线性分类器,对这个问题可能会有不同的解决方案。譬如,我们可以考虑采用下面这个办法来解决这个问题:不再使用“一条直线”来把平面划分为两个区域,因为直线是没有宽度的,在一个很小的空间里就能放置无数条直线,如果改用一根有宽度的“棍子”去代替“直线”,当有了宽度之后就不可能在两类邮件样本之间再塞入无数根“棍子”了。然后,我们再进一步把“棍子”的宽度慢慢变大,空间中能塞入的“棍子”的数量会越来越少,直至只有唯一的一根“棍子”能够塞进去为止,这根“棍子”的边缘已经触碰到两边最接近它的点了,无法再被挪动。最后,我们重新拿出要划分空间的那条直线,安放在这根“棍子”的正中间,这个位置是唯一的,如图 6-18 所示。

采用这种办法来解决最佳空间划分问题的线性分类器,其实是“支持向量机”(Support Vector Machine,SVM)中的一种最简化情况,称为“线性支持向量机”(Linear SVM,LSVM)。上面例子中描述的“棍子的宽度”在支持向量机中被称为“边距”(Margin),接触到“棍子”边缘的向量被称为“支持向量”(Support Vector)。

204

第三部分 第三波高潮