六、正则化(Regularization)
6.1 过拟合问题
到现在为止,我们已经学习了几种不同的学习算法,包括线性回归和逻辑回归,它们能够有效地解决许多问题,但是当将它们应用到某些特定的机器学习应用时,会遇到过拟合(over-fitting
)的问题,可能会导致它们效果很差.
在本节,我们将讲述什么是过拟合.在后面几节,我们将介绍一种正则化(regularization
)的方法,它可以一定程度上改善过拟合的问题.
我们仍然用房价预测的例子来解释这个问题.
在第一幅图里,我们用一次函数拟合训练集,但是随着房子面积增大,价格逐渐平缓.该函数并没有很好地拟合训练集.我们把这种现象称为欠拟合,也可以说这种算法具有高偏差.
第二幅图用二次函数来拟合数据,这个拟合效果很好.
第三幅图,我们用四次函数来拟合数据,那么我们有五个参数.这样我们可以用一条曲线通过所有的训练样本.它似乎可以拟合所有的训练数据,但它不停地上下波动.这是过于强调拟合原始数据的原因,实际上我们不认为它是一个好的模型.这种现象我们称为过拟合.另一种说法是这种算法具有高方差.
总而言之,过拟合问题可能会在我们的假设函数有过多变量时出现,这时假设函数似乎很好地拟合了训练的数据集,代价函数会非常接近0.但它无法泛化到新的样本里.
逻辑回归也有同样的问题.
上面是一个以\(x_1、x_2\)为变量的例子.第一幅图同样用一次函数拟合数据,但似乎拟合效果不佳,这种现象也是欠拟合.最后一幅图,我们用高阶多项式拟合数据,对训练集拟合效果很好,但无法泛化到新样本里.就以多项式理解,x
的次数越高,拟合的越好,但相应的预测的能力就可能变差
在课程的后半段,我们会讲述如何使用专门工具来识别过拟合和欠拟合的情况.
问题是,如果我们发现了过拟合问题,应该如何处理?
我们可以用绘制假设函数曲线作为决定多项式阶次的一种方法,但它不总是奏效的.如果我们面临的问题有很多特征变量(x
)时,绘图就会变得困难,决定保留哪些变量也是很难的.以预测房价为例,如果我们有很多因素与房价有关,但此时拥有的训练集又很少,此时就很容易出现过拟合问题.这儿主要有两种方法来解决过拟合问题:
(1) 丢弃一些不能帮助我们正确预测的特征.可以是手工选择保留哪些特征,或者使用一些模型选择的算法来帮忙选择特征(PCA
).
(2) 正则化,保留所有的特征,但是减少参数的大小(\(magnitude\))
6.2 代价函数
在本节,我们将学习正则化是怎么运行的.当我们要运行正则化时,我们还会写出相应的代价函数.
上面的回归问题中如果我们的模型是:
我们可以从之前的事例中看出,正是那些高次项导致了过拟合的产生,所以如果我们能让这些高次项的系数接近于0
的话,我们就能很好的拟合了.所以我们要做的就是在一定程度上减小这些参数\(\theta\)的值,这就是正则化的基本方法.以上面的函数为例,我们要减少\(\theta_3\)和\(\theta_4\)的值,我们要做的便是修改代价函数,给\(\theta_3\)和\(\theta_4\)设置一点惩罚.这样做的话,我们在尝试最小化代价时也需要将这个惩罚纳入考虑中,并最终导致选择较小一些的\(\theta_3\)和\(\theta_4\).修改后的代价函数如下(1000是任意的,这里只是设置了比较大的数):
通过这样的代价函数选择出的\(\theta_3\)和\(\theta_4\),就接近于0
,对预测结果的影响就比之前要小许多.假如我们有非常多的特征,我们并不知道其中哪些特征我们要惩罚,我们将对所有的特征进行惩罚(这样相当于简化尽量简化这个假设模型),并且让代价函数最优化的软件来选择这些惩罚的程度.这样的结果是得到了一个较为简单的能防止过拟合问题的假设:
让我们再看房价预测的例子,这里的例子有100个特征值,与之前的例子不同,我们不知道哪个参数是高阶项,我们也比较难知道哪个特征是相关度比较低的.这里我们要做的就是修改代价函数,以减小所有参数的值.:
请注意求和是从
1
开始的,我们不会给\(\theta_0\)设置惩罚项.但实践中,设不设置没有什么区别.
我们来看下面的图以获得更好的解释.新的代价函数有两个目标,一个是前面的误差项,我们的目标是最小化它以更好地拟合数据.第二个目标是后面的正则化项,我们要使参数尽可能小.这个正规化参数\(\lambda\)(Regularization Parameter
)的作用就是控制两个目标之间的平衡关系,从而使假设函数尽可能简单,避免出现过拟合现象.
如果选择的正则化参数\(\lambda\)过大,则会把所有的参数都最小化了,导致模型变成 \(h_{\theta}(x) = \theta_0\).也就是下图中红色直线所示的情况,造成欠拟合.那么到底是如何做到让高阶的比例更小呢?我个人理解是如果要完全符合样本数据,这时误差项接近于0,但就会在假设函数里出现高阶项,与此同时后面的正则化项就会有较大惩罚.但如果最小化正则化项也不行,这样会使得误差项更大.因此,我们这里最小化\(J\)函数就只能是在两个之间做取舍.
所以对于正则化,我们要取一个合理的\(\lambda\)值.这样才能更好的应用正则化.回顾一下代价函数,为了使用正则化,让我们把这些概念应用到到线性回归和逻辑回归中去,那么我们就可以让他们避免过度拟合了.