监督学习过程的本质目的-误差函数(Loss Function)
在机器学习的过程中,我们会在很多地方遇到有关模型建立复杂度控制的问题,对模型复杂度控制的目的就在于,可以让我们的模型拥有更好的泛化能力,而不会在实际测试集中得到与训练集完全不一致的误差表现。于是,这个问题就变成了机器学习中经常提到的防止模型过拟合的问题![](http://upload-images.jianshu.io/upload_images/4279093-533f39b0e9a774cf.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/645/format/webp)
如果我们从一个宏观的角度,去分析所有有关分类回归这类机器学习的问题,其中用到最多最有普遍意义的一个做法,就是对模型进行范数正则化方面的改进。事实上,这个方法也几乎加入到了所有经典机器学习方法的模型本身的建立过程中,这里我们就从常见正则化的优点和使用方法,来谈谈机器学习的本质目的,以及如何用范数正则化方法来帮助解决其中的监督学习问题。
1.监督学习的过程与其本质目的
机器学习本身应该划分为监督学习与无监督学习两大类,前者以分类/回归进行预测为主要目的,后者以聚类为主要目的。而监督学习本身最大的目的在于对未知数据进行预测,而待预测的数据的模型情况可能会很复杂,因此才会对模型的泛化能力提出很高的要求。
我们说,对于监督学习来讲,其完成的任务,就是要在训练集中,规定一个误差函数(Loss Function),然后再去找一个数学模型,而我们的目的就是要想法设法让这个数学模型在训练集中得到的结果与实际结果,带入到我们先前定义的误差函数中,让这个误差函数的值越小,那就可以说在这个训练集中得到了一个很好的模型。
但仅仅这样是不够的,我们要考虑到这个模型不仅在这个训练集中效果很好,还要考虑我们喂给这个模型任意可能的一个测试集,依然有很出的效果,因此,无脑的让模型在训练集上最小化误差函数这样的做法不可取,它可能会导致严重的过拟合而让模型在测试集中产生很糟糕的效果,因此,我们需要对误差函数进行修正,让这个误差函数可以控制好数学模型本身的复杂度,以提高它的泛化能力。
因此一句话总结监督学习就是:“minimizeyour error while regularizing your parameters”,也就是在规则化模型参数复杂度的同时,来对误差进行最小化。这就是机器学习迭代训练的本质目的。我们认为,模型复杂度对于模型对未知数据进行拟合的泛化能力具有很大的影响,这个说法是很合理很科学的,异常复杂的模型会考虑到训练集中的所有可能因素,包括那些可能是由于噪声产生的数据波动,而这些因素本身是随机的,绝对不能保证这些噪声也会一致的出现在任何给定的测试集中(否则就不应该叫做噪声了)
因此,通过这样一个对监督学习过程本质的概括,我们可以把监督学习的目标表示如下:
![](http://upload-images.jianshu.io/upload_images/4279093-a7848bea4431c8e9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/554/format/webp)
其中,第一项表示我们所定义的一个误差函数(loss function),误差函数有很多很多,比如均方误差,指数误差,等等。但仅仅有误差函数作为目标函数是不够的,因此加入的第二项就是正则项,它是一个和训练模型参量相关的一个函数,如果模型训练的参量个数特别多,或者这些参量的选值都特别大,那么我们就可以认为这样的一个模型可能太复杂了,我们要控制这样的情况,因而以此作为正则化项,起到一个对模型复杂度惩罚的作用。同时我们也要控制这个惩罚程度对模型建立的“轻重”,所以前面的λ就代表了正则项的影响因子,λ取值越大,模型复杂度对最终代价函数的惩罚力度就越大。很明显,如果这个λ取的太大,以至于我们实际的误差函数的影响力明显减弱,这样的模型就明显没有意义了,导致了适得其反的效果,因此根据实际问题,要对λ进行合适的调整。
![](http://upload-images.jianshu.io/upload_images/4279093-ac8436aadae9d667.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/357/format/webp)
而这一项,才是我们真正要最终作为标准的目标函数,称作“代价函数”(cost function)。监督学习的目的,也正是为了找到某个模型在某个问题中,如何使得这个代价函数达到最小的算法过程。
2.监督学习方法中的误差函数(Loss Function)
既然我们在上面对监督学习过程进行了一个本质的概括,那我们就先来谈谈,代价函数组成的第一部分——误差函数。
在监督学习的问题中,我们通过一个模型在训练集中进行拟合,得到了一组在训练集上的预测结果,我们当然希望这个预测结果和训练集中的实际结果越接近越好(这样才有意义嘛)。误差函数就是来量化的描述你的预测结果与真实结果的偏差值。我们回头思考我们学习过的经典的学习模型:线性回归,逻辑斯蒂回归,支持向量机,boosting集成学习,人工神经网络等等,也都是基于这样的思路围绕展开模型训练的,我们可以举几个例子来说明。
2.1简单的线性回归问题
线性回归是我们接触过的最简单的监督学习方法,而它的模型建立显然是基于这样一个原则建立的——我们的训练模型就是一个线性模型:假如我们是在二维空间中进行训练,模型形式就是y=ax+b,如果是多维空间那就把a和x替换成向量,我们训练的参数的个数就是|a|+1,而模型的误差,则应该就是均方误差,即便预测结果与实际结果的差的平方和。我们从机器学习的角度来考虑,这样做显然是有问题的。如果我们的数据维度非常高,我们无法保证所有变量对我们的线性分析都是有用有意义的,这些变量的一部分可能与因变量不应该有关,另一方面,多变量也可能会产生多重共线性现象:即多个预测变量之间有强相关关系,这样的情况可能会增加模型的复杂度,削弱模型的解释能力。
另一方面,当X列满秩的时候,使用线性回归有解析解
![](http://upload-images.jianshu.io/upload_images/4279093-76479f48fe2754db.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/144/format/webp)
,如果n和m比较接近,则容易产生过拟合;
如果
![](http://upload-images.jianshu.io/upload_images/4279093-f0afa0eb7eceed5e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/55/format/webp)
是奇异的,最小二乘回归得不到有意义的结果。因此线性回归缺少稳定性与可靠性。
因此,我们应该考虑给均方误差
![](http://upload-images.jianshu.io/upload_images/4279093-39da36ceea6eeebf.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/89/format/webp)
加入一个防止过拟合的正则项,如果加入的正则项为L1正则项,即代价函数为:
![](http://upload-images.jianshu.io/upload_images/4279093-8a5ef5360f04a110.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/213/format/webp)
基于这样的代价函数我们继续进行线性模型分析,来最小化上述的J(θ),这样的回归问题我们称为Lasso回归模型。它在特征稀疏筛选问题中有着非常重要的应用。
如果我们加入的正则项策为L2正则项,则代价函数为:
![](http://upload-images.jianshu.io/upload_images/4279093-07133562697bae67.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/213/format/webp)
即把上式的L1正则项直接替换为L2正则项,依然采用线性模型,但得到的模型特点会与上述模型产生不同的效果,这样的回归模型称作Ridge Regression(岭回归或脊回归)。这样做的另一个好处是可以保证在任何条件下,模型参数均有解析解,保证了模型的稳定性。
当然,我们还可以将L1以及L2正则项都加入到线性回归模型中,这样做是有意义的:
依然采用线性回归模型,这个回归方法称为Elastic net模型。
以上便是对于线性回归学校方法的正则化解释,以后会分别对比这几种正则化模型方法各自的特点与应用范围。
2.2线性不可分支持向量机
其实这个结论可以推广到高维线性不可分支持向量机(即考虑使用核函数方法将原空间映射到高维空间),这里我们通过线性不可分支持向量机来进行解释。
回忆我们学习支持向量机方法的经典学习路线:先是线性可分支持向量机,使用的是最大间隔法,并且定义了一个最小的间隔阈值,位于阈值线上的数据点即支持向量,线性可分支持向量机的目的就是要保证两类样本的点都位于间隔阈值的外侧——即支持向量的两侧。最后我们通过了一系列的推导运算,得到了以下我们都喜闻乐见的结果:
并且再转化为以下问题:
这个式子大家都很熟悉了,这是比较理想的线性可分支持向量机模型,然而在实际问题中即便是在很低的维度,两类样本点都可以在最小间隔两边(即找到可以让所有数据的满足yi(Wx+b)≥1)的训练模型不存在,所以我们要引入一个松弛变量——目的就是为了,允许我们的最大间隔小于1,但这个差值又不能太小,我们记做,于是便转换成我们又喜闻乐见的这个式子:
我们把yi(Wx+b)≥1这个条件“放宽”到yi(Wx+b)≥1-上,之后再通过一系列的代数求解得到我们想要的最优解,这边是我们导出的线性不可分支持向量机。
我们经典的SVM学习过程就回忆到此,我们接下来换一个角度来考虑我们最后得到的线性不可分支持向量机模型。
我们将这个模型结合之前我们对监督学习目标的定义,我们是否可以将这个问题也转化成一个误差函数加一个正则化项的形式呢?答案当然是可以的,我们直接给出这个表达式的“误差函数+正则化项”的表达形式:
误差函数为:
其中[z]+={z,(z>0);0,(z≤0)
正则化项就是经典的L2正则化项,即||w||^2
合并加起来即:
接下来我们来证明这个式子与线性不可分支持向量机等价:
令
当
则应该有:
当
又应该有:
因此
所以这个式子
总成立。
所以
与
等价。
我们再令λ=1/2C。
则又转化为:
就此完成证明。
而我们再来看这个损失函数:
这个损失函数被称为合页损失函数(Hinge Loss),这个函数也可以写成以下的形式
即每一个样本的预测结果与实际结果对比产生的误差认为,如果该点的预测结果位于支持向量边界外,则认为误差为0,;如果该点的预测结果位于支持向量边界内,则认为误差是该点到最近的支持向量边界的距离。
因此,线性不可分支持向量机的实质,可以认为是线性回归模型使得L2正则化的合页损失函数最小化的分类学习方法。
![](http://upload-images.jianshu.io/upload_images/4279093-791987bb8d26aac7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/210/format/webp)
2.3对数损失函数与Logistics回归模型
对单个变量的对数损失函数定义为
![](http://upload-images.jianshu.io/upload_images/4279093-ba2d0ed70e15f7ab.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/349/format/webp)
如果y取值只有0和1,也可以写成如下形式:
![](http://upload-images.jianshu.io/upload_images/4279093-3fa40fd343925832.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/432/format/webp)
把这个损失函数作为训练模型想要最小化的损失函数,则在整个训练集中的损失函数和:
![](http://upload-images.jianshu.io/upload_images/4279093-26a6d042bfc9ca89.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/436/format/webp)
对这个损失函数进行L2正则化,防止其过拟合:
![](http://upload-images.jianshu.io/upload_images/4279093-6ac001c218cb84f5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/554/format/webp)
于是就得到了Logistics回归模型的代价函数。即一个经过L2正则化之后的对数损失函数。
当然,Logistics回归使用的回归模型是将一个线性回归式嵌套到一个Sigmoid函数,sigmoid函数可以讲输入的结果约束在0~1范围内,另外,通过sigmoid函数输出的结果只可能在0,1之间,但不可能取到0和1,因此也给进行对数损孙函数计算带来了方便:我们要把样本实际的类标(即0或1)放在log的外侧,即上式中的y(i),而将模型训练出来的结果放到log内,即hθ(x(i)),这样可以保证log内的取值肯定大于0.
除去以上几种监督学习方法之外,其它的监督学习方法也都包括各自特有的损失函数以及其常用的正则化项,共同组成各个模型算法的代价函数,以代价函数最小化为目的进行数学建模。
例如,Adaboost的损失函数为指数损失函数;运用了SoftMax多分类模型的人工神经网络使用的损失函数为交叉熵损失函数(若为二分类,再变为逻辑斯蒂回归所使用的对数损失函数)。