1.5.3 范数和正则化

了解距离之后,探讨范数,会发现它不过是一种特殊情况。内积空间中两个向量的距离为,如果其中一个向量是零向量,设,则,即:

其实,这个式子表示了一个向量的终点和起点之间的距离,因此,它被称为向量的长度大小范数(norm)。在欧几里得空间,根据点积的定义,范数的具体计算方法为:

由于它是欧几里得空间中的计算方式,所以被称为欧几里得范数,又因为要对每个坐标的平方后求和,所以还被称为范数(注意,是字母的小写,为了与数字区分,也可以用大写字母表示,特别是手写的时候)。

范数之外,与1.5.1中的曼哈顿距离类似,也有曼哈顿范数,又被称为范数

继续比照1.5.1中的闵可夫斯基距离的定义,延续前面的思路,就可以定义其他范数:

只不过,在机器学习中,范数是常用的。

对于范数,还可以使用NumPy中的函数np.linalg.norm(),通过设置参数ord的值计算不同类型的范数类型。例如计算范数:

如果不设置参数ord的值,则默认为None,对于向量而言,就是计算范数。

在机器学习中,用训练集得到的模型,我们希望它对验证集也能有良好的表现,即预测准确率能够让人满意。但是,如果所使用模型参数过多、或过于复杂,常常会出现一种被称为过拟合(Overfitting)的现象(在统计学中,同样有这个问题),如图1-5-8所示。假设对于训练集而言,从上帝视角看,其模型就是比较简单的那条曲线所示;但是人把问题搞复杂了,弄出来的模型是比较复杂的那条曲线,这条复杂的曲线相对“上帝真相”就是过拟合。

图1-5-8

如何解决过拟合问题?一种比较简单的思路,就是引入一个正则项。注意,这里并没有从最根本的理论上证明正则项的必要性和可行性,只是说明以范数作为正则项的结果。

假设有一个机器学习模型,记作。并且还有一个数据集(dataset),其中的是由观测活动得到的数据,作为模型自变量的值;是每个样本的观测标签,作为模型响应变量的值。如果将输入给模型,所得就是用这个模型进行预测的结果,记作(预测值):

这里的表示模型中的参数。要想衡量模型,显然就可以考查预测值和观测值之间的差异—注意,不一定就是“差”()。在机器学习中,常定义一个损失函数(Loss Function,在第4章4.4.3节对损失函数有专门介绍)度量这个差异,比如一种常用的损失函数定义是:

我们当然希望模型作用于数据集后的平均损失函数越小越好,即:

(1.5.1)

为了让(1.5.1)式能够取到最小值,必须选择适合的参数,实现的方法为著名的最小二乘法,此处不对这个方法进行详细介绍,有兴趣的可以参阅第3章3.6节。

正如图1-5-8所示那样,为了追求(1.5.1)式——损失函数最小化,就会不断提升模型复杂度—显然对已知数据而言,图1-5-8中的“人”所训练出的模型要比“上帝真相”模型更接近(1.5.1)式的目标,这就导致了“过拟合”。

在实际业务中,避免过拟合的方法比较多,比如增加数据量、进行交叉验证等。在这里我们把上面讨论的模型具体化为一种比较简单的模型:线性回归模型,即:(在3.4.5节表示为形式,其中表示组成的矩阵),再参考点积的定义,于是(1.5.1)式可以写成:

(1.5.2)

正则化(Regularization)是针这种模型最常用的避免过拟合的方法。如(1.5.3)式所示,对(1.5.2)式增加惩罚项

(1.5.3)

中的是一个系数,用以平衡惩罚项的权重;表示模型的复杂度。对于函数,也会有不同的形式,一般地,可以选择:

● 使用范数:

惩罚项使用范数的线性回归称为LASSO回归

● 使用范数:

惩罚项使用范数的线性回归称为岭回归(Ridge回归)。

除此之外,还有其他实现正则化的方法,比如弹性网络(Elastic Net),就是通过平衡范数和实现了正则化。在Sklearn库的sklearn.linear_model模块中,有专门针对正则化的线性模型,不妨参考。