模型的改善与泛化(偏差方差与交叉验证)

1 偏差与方差

1.1 定义

在机器学习的建模中,模型普遍的误差都是来自于偏差(bias)和方差(variance)。那什么又是偏差与方差呢

如上图所示[1],假设你拿着一把冲锋枪打击红色的靶心,在你连打数十枪后出现了以下四种情况:

  • 所有子弹都密集打在靶心旁边的位置,这就是典型的方差小(子弹很集中),偏差大(距离靶心甚远);
  • 子弹都散落在靶心周围的位置,这就是典型的方差大(子弹很散乱),偏差小(都在靶心附近);
  • 子弹都散落在靶心旁边的位置,这就是典型的方差大(子弹散乱),偏差大(距离靶心甚远);
  • 所有子弹都密集打在了红色靶心的位置,这就是典型的方差小(子弹集中),偏差小(都在靶心位置);

由此可知,偏差描述的是预测值的期望与真实值之间的差距,即偏差越大,越偏离真实数据,如上图第二行所示。方差描述的是预测值的变化范围(离散程度),也就是离其期望值的距离。即方差越大,数据的分布越分散,如上图右列所示[2]。

1.2 模型的偏差与方差

上面我们介绍了什么是偏差与方差,那么这四种情况又对应机器学习中的哪些场景呢?通常来说,一个简单的模型会带来比较小的方差(Low Variance),而复杂的模型会带来比较大的方差(High Variance)。这是由于简单的模型不容易受到噪音的影响,而复杂的模型(例如过拟合)容易受到噪音的影响而产生较大的误差。一个极端的例子,\hat{y}=C这个模型不管输入是什么,输出都是常数C,那么其对应的方差就会是0。对于偏差来说,一个简单的模型容易产生较高偏差(High Bias),而复杂的模型容易产生较低的偏差(Low Bias),这是由于复杂的越模型越容易拟合更多的样本。


如图所示为模型的偏差、方差与模型复杂度的变化情况。从图中可以看错,方差随着模型的复杂度增大而上升,偏差与之恰好相反。同时,如果一个模型的主要误差来自于较大的方差,那么这个模型呈现出的就是过拟合的现象;而一个模型的主要误差来自于较大的偏差时,那么此时模型呈现出的就是欠拟合现象。

总结一下,模型的高方差与低偏差对应的分别就是过拟合与欠拟合。如果一个模型不能很好的拟合训练样本,那么此时模型呈现的就是高偏差(欠拟合)的状态;如果是能够很好的拟合训练样本,但是在测试集上有较大的误差,这就意味着此时模型出现了高方差(过拟合)的状态。因此,当模型出现这类情况时,我们完全可以按照前面处理过拟合与欠拟合的方法对模型进行改善,然后在这两者之间进行平衡。
 

2 超参数

2.1 什么是超参数

在之前的介绍中,我们知道了模型中的权重参数可以通过训练集利用梯度下降算法求解得到,但超参数又是什么呢?所谓**超参数(Hyper parameter)**是指那些不能通过数据集训练得到的参数,但它的取值同样会影响到最终模型的效果,因此同样重要。到目前为止,我们一共已经学过了三个超参数,只是第一次出现的时候笔者并没有可以提起其名字,在这里再做一个细致的总结。这三个超参数分别是:惩罚系数\lambda,学习率α、以及特征映射时多项式的次数,其中最为重要的就是前面两个。

  • 惩罚系数\lambda

       从上一篇文章对正则化的介绍中可知,\lambda越大也就意味着对模型的惩罚力度越大,最终训练得到的模型也就相对越简单。因此,在模型的训练过程中,我们需要选择一个合适的\lambda来使得模型的泛化能力尽可能好。

  • 学习率α

       在介绍线性回归的求解中,笔者首次介绍了梯度下降算法:

       W = W - \alpha \frac{\partial L}{\partial W}

       并且说到,α的作用是用来控制每次向前跳跃的距离,较大的α可以使得我们更快的跳到谷底找到最优解,但是过大的α同样能使得我们在峡谷的两边来回震荡,以至于需要多次迭代才能得到最优解(甚至可能得不到最优解)。

        

       如图所示还算是较为乐观的情况,因为其目标函数为凸函数(例如线性回归和线性回归),但在后面的学习过程中,我们会遇到很多的非凸型的目标函数。因此,不同的学习率可能导致大相径庭的结果。        

如图所示为一个非凸型的目标函数,两者从同一个初始点开始优化,一个采用了较小的学习率0.02,一个采用了较大的学习率0.4,可以看出两者得到的结果截然不同。对于左图取得的最小值我们称为局部最优解(local optimum),对于右图取得的最小值我们称为全局最优解(global optimum)。同样,过大的学习率也可能使得目标函数发散。最后值得注意的是,所谓学习率的过大或者过小,在不同模型间没有可对比性。例如在上面凸函数的图示中学习率为0.4时可能还算小,但是在这个例子中0.4已经算是相对较大了。

2.2 如何选择超参数

经过上面的介绍,我们明白了超参数对于模型最终的性能有着极其重大的影响。那到底应该如何选择这些超参数呢?对于超参数的选择,首先可以先列出各个参数的备选取值,例如:α=[0.001,0.03,0.1,0.3,1],λ=[0.1,0.3,1,3,10];然后再根据不同的超参数组合训练得到不同的模型(比如这里就有25个备选模型),通过下面介绍的交叉验证来确立模型。不过这一整套的步骤sklearn也都有现成的类方法可以使用,使用起来也较为方便,后续再通过一个详细的示例进行说明。不过随着后续介绍的模型会更为复杂,所以会出现更多的超参数组合,训练一个模型也会花费一定的时间。因此,对于模型调参的一个基础就是要理解各个参数的含义,这样才可能很快的排除不可能的参数取值。以便于更快的训练出可用的模型。
 

3 模型的选择

当我们在对模型进行改善的过程中,自然而然的就会出现很多备选的模型供我们选择。而我们的目的便是尽可能的选择一个较好的模型,以达到高偏差与高方差之间的平衡。那我们该如何选择一个好的模型呢?通常来说有两种方式:第一种就是之前介绍过的将整个数据集划分成三部分的方式;第二种则是K折交叉验证(K-fold cross validation)[3]。对于第一种方法,其步骤为先在训练集上训练不同的模型,然后在验证集上选择其中表现最好的模型,最后在测试集上测试模型的泛化能力。但是这种做法的缺点在于对于数据集的划分,可能恰好某一次划分出来的测试集含有比较怪异的数据导致最好模型表现出来的泛化误差也很糟糕。那么此时就可以通过K折交叉验证来解决。

如图所示以3折交叉验证为例,我们首先需要将整个完整的数据集分为训练集与测试集两个部分。并且同时,我们再将训练集划分成三份,每次选择其中两份作为训练数据,一份作为验证数据进行模型的训练与验证。

假设现在有四个备选的不同的模型,其各自在不同验证集上的误差如下表所示:

根据得到的结果,我们可以选择平均误差最小的Model2作为最终选择的模型,然后再将其用整个大的训练集训练一次,最后用测试集测试其泛化误差。当然,还有一种省略的交叉验证方式,即一开始并不再划分出测试集,而是直接将整个数据划分成为K份进行交叉验证,然后选择平均误差最小的模型即可。

4 总结

总结一下,在这篇文章中笔者首先通过一个实例介绍了什么是偏差与方差;然后再介绍了在机器学习中模型出现高偏差与高方差时所对应的现象以及我们下一步该如何的进行处理;最后介绍了在改善模型的过程中如何通过K折交叉验证来进行模型的选择。在接下来一讲的内容中,笔者将通过一到两个真实的例子,再来对上述的整个过程进行示范。本次内容就到此结束,感谢阅读!

引用


[1]图片来源:http://scott.fortmann-roe.com/docs/BiasVariance.html

[2]偏差和方差有什么区别?答主:Jason Gu https://www.zhihu.com/question/20448464/answer/24397161

[3]Lecture 2: Where does the error come from? 李宏毅 http://speech.ee.ntu.edu.tw/~tlkagk/courses/ML_2016/Lecture/Bias%20and%20Variance%20(v2).pdf
 

猜你喜欢

转载自blog.csdn.net/devil_son1234/article/details/107156683