Loss Error和Model Selection 误差的来源和模型的选择
回顾:
之前有提到说,不同的function set,也就是不同的model,它对应的error是不同的;越复杂的model,
也许performance会越差,所以今天要讨论的问题是,这个error来自什么地方。
来源:
1.bias(偏差)
2.variance(方差)
目的:
了解error的来源其实是很重要的,因为我们可以针对它挑选适当的方法来improve自己的model,提高model的准确率,而不会毫无头绪。
回到regression的问题上来:
bias:可以形象地理解为瞄准的位置和靶心的距离的偏差。
variance:可以形象地理解为多次打在靶上的点的集中程度。
f*的variance取决于model的复杂程度和data的数量
f*的variance是由model决定的,一个简单的model在不同的training data下可以获得比较稳定分布的,而复杂的model在不同的training data下的
分布比较杂乱(如果data足够多,那复杂的model也可以得到比较稳定的分布)
如果采用比较简单的model,那么每次在不同data下的实验所得到的不同的f*之间的variance是比较小的,就好像说,你在射击的时候,
每次击中的位置是差不多的,就如同上图中的linear model,100次实验找出来的都是差不多的。
但是如果model比较复杂,那么每次在不同data下的实验所得到的不同的f*之间的variance是比较大的,它的散布就会比较开,
就如同下图中含有高次项的model,每一条f*都长得不太像,并且散布得很开。
那为什么比较复杂的model,它的散布就比较开呢?比较简单的model,它的散布就比较密集呢?
原因其实很简单,其实前面在讲regularization正规化的时候也提到了部分原因。简单的model实际上就是没有高次项的model,
或者高次项的系数非常小的model,这样的model表现得相当平滑,受到不同的data的影响是比较小的。
举一个很极端的例子,我们的整个model(function set)里面,就一个function:f=c,这个function只有一个常数项,因此无论training data怎么变化,
从这个最简单的model里找出来的f*都是一样的,它的variance就是等于0。
f*的bias只取决于model的复杂程度
上图分别是含有一次项、三次项和五次项的model做了5000次实验后的结果,你会发现model越复杂,比如含有5次项的model那一幅图,
每一次实验得到的几乎是杂乱无章,遍布整幅图的;但是他们的平均值却和真实值吻合的很好。也就是说,复杂的model,单次实验的结果是没有太大参考价值的,
但是如果把考虑多次实验的结果的平均值,也许会对最终的结果有帮助。
因此:
1.如果是一个比较简单的model,那它有比较小的variance和比较大的bias。就像下图中左下角的打靶模型,每次实验的f*都比较集中,
但是他们平均起来距离靶心会有一段距离(比较适合实验次数少甚至只有单次实验的情况)。
2.如果是一个比较复杂的model,每次实验找出来的f*都不一样,它有比较大的variance但是却有比较小的bias。就像下图中右下角的打靶模型,
每次实验的f*都比较分散,但是他们平均起来的位置与靶心比较接近(比较适合多次实验的情况)。
为什么会这样?
1.实际上我们的model就是一个function set,当你定好一个model的时候,实际上就已经定好这个function set的范围了,
那个最好的function只能从这个function set里面挑出来如果是一个简单的model,它的function set的space是比较小的,
这个范围可能根本就没有包含你的target;如果这个function set没有包含target,那么不管怎么sample,平均起来永远不可能是target。
2.如果这个model比较复杂,那么这个model所代表的function set的space是比较大的(简单的model实际上就是复杂model的子集),那它就很有可能包含target,
只是它没有办法找到那个target在哪,因为你给的training data不够,你给的training data每一次都不一样,所以他每一次找出来的都不一样,但是如果他们是散布在这个target附近的,
那平均起来,实际上就可以得到和target比较接近的位置。
Bias vs Variance
由前面的讨论可知,比较简单的model,variance比较小,bias比较大;而比较复杂的model,bias比较小,variance比较大。
所以今天如果是一个variance大的情形,即如果你的error来自于variance很大,这个状况呢,就是Overfitting。
如果今天你的error来自于bias很大,这个状况呢,就叫做Underfitting。
什么时候bias大?
如果今天你的model没有办法fit你的training的examples代表说呢,你的bias是大的。代表Underfitting。
如果是Bias大你要做的事情是什么呢?
你应该去redesign你的model,bias大代表说,你现在这个model里面可能根本没有包含你的target,即你的f head ,它根本就不再你的model set里面。
需要redesign你的model,比如重写你的model的式子,把更多的feature加进去。或者是让你的model更复杂,本来只考虑一次不够,你可能要考虑2次、3次等等。
在这个状况下,因为是你的model不好,没有包含f head。所以如果今天你error差是来自bias,那你不要说我去collecti更多data,collect更多data是没有用的。因为你的model
你的function set 本来就不好。
即解决办法:
1)增加更多的features作为model的input输入变量
2)让model变得更复杂,增加高次项
什么时候variance大?
如果今天是你再training data上,你可以fit你的Training data,你在training data上得到小的error,但是在testing data上,你却得到一个大的error。
这意味着你的model可能是variance比较大。这个时候代表的是Overfitting。
如果是variance大你要做的事情是什么呢?
即解决办法:
1)选取更多的数据
2)2)Regularzation(正则化)
在loss function里面加一个与model高次项系数相关的term,它会希望你的model里高次项的参数越小越好,也就是说希望你今天找出来的曲线越平滑越好;
这个新加的term前面可以有一个weight,代表你希望你的曲线有多平滑(weight代表平滑程度)加了Regularzation之后,会让曲线变得更平滑。
但是值得注意的是:
加了regularization以后,因为你强迫所有的曲线都要比较平滑,所以这个时候也会让你的variance变小;但regularization是可能会伤害bias的,
因为它实际上调整了function set的space范围,变成它只包含那些比较平滑的曲线,这个缩小的space可能没有包含原先在更大space内的,因此伤害了bias,
所以当你做regularization的时候,需要调整regularization的weight,在variance和bias之间取得平衡。
总结:
我们希望找一个model,它variance够小,bias也够小,这两个合起来给我们最小的testing data的error
bias是靶心,variance是数据有效性。
Model Selection
我们现在会遇到的问题往往是这样的。我们有很多个模型选择,现在这还有很多参数可以调,比如说,Regularization的weight,那通常我们是在bias和variance
之间呢做一些trade-off,做一些平衡,我们希望找一个model,variance够小,bias也够小,这两个合起来,给我们最小的testing data 的error。
我们通常需要选择一个最好的model,但是以下这些事情,是你不该做的或最好不要做的:
你手上有training set,有testing set,接下来你想知道model1、model2、model3里面,应该选哪一个model,然后你就分别用这三个model去训练出f1*,f2*,f3*,
然后把它apply到testing set上面,分别得到三个error为0.9,0.7,0.5,这里很直觉地会认为是model3最好。
但是现在可能的问题是,这个testing set是你自己手上的testing set,是你自己拿来衡量model好坏的testing set,真正的testing set是你没有的;
注意到你自己手上的这笔testing set,它有自己的一个bias(这里的bias跟之前提到的略有不同,可以理解为自己的testing data跟实际的testing data会有一定的偏差存在)
所以你今天那这个testing set来选择最好的model的时候,它在真正的testing set上不见得是最好的model,通常是比较差的,
所以你实际得到的error是会大于你在自己的testing set上估测到的0.5。
如何解决?
将training data分成training set和validation set
你要做的事情是,把你的training set分成两组:
1.一组是真正拿来training model的,叫做training set(训练集)
2.另外一组不拿它来training model,而是拿它来选model,叫做validation set(验证集)
先在training set上找出每个model最好的function f* ,然后用validation set来选择你的model。
也就是说,你手头上有3个model,你先把这3个model用training set训练出三个f*,接下来看一下它们在validation set上的performance。
假设现在model3的performance最好,那你可以直接把这个model3的结果拿来apply在testing data上如果你担心现在把training set分成training和validation两部分,
感觉training data变少的话,可以这样做:已经从validation决定model3是最好的model,那就定住model3不变(function的表达式不变),
然后用全部的data在model3上面再训练一次(使用全部的data去更新model3表达式的参数)这个时候,如果你把这个训练好的model的apply到public testing set上面,
你可能会得到一个大于0.5的error,虽然这么做,你得到的error表面上看起来是比较大的,但是这个时候你在public set上的error才能够真正反映你在private set上的error。
训练的流程:
training set(部分训练集) -> validation set(部分验证集) -> 自己的testing data(测试集) -> 实际的testing data
(该流程使用自己的testing data和validation来模拟testing data的bias误差,可以真实地反映出在实际的data上出现的error)
Conclusion总结:
1、一般来说,error是bias和variance共同作用的结果
2、model比较简单和比较复杂的情况:
2.1当model比较简单的时候,variance比较小,bias比较大,此时会比较集中,但是function set可能并没有包含真实值;此时model受bias影响较大
2.2当model比较复杂的时候,bias比较小,variance比较大,此时function set会包含真实值f head,但是f*会比较分散;此时model受variance影响较大
3、区分bias大 or variance大的情况:
3.1如果连采样的样本点都没有大部分在model训练出来的f*上,说明这个model太简单,bias比较大,是欠拟合
3.2如果样本点基本都在model训练出来的f*上,但是testing data上测试得到的error很大,说明这个model太复杂,variance比较大,是过拟合
4、bias大 or variance大的情况下该如何处理:
4.1当bias比较大时,需要做的是重新设计model,包括考虑添加新的input变量,考虑给model添加高次项;然后对每一个model对应f*的计算出error,
选择error值最小的model(随model变复杂,bias会减小,variance会增加,因此这里分别计算error,取两者平衡点)
4.2当variance比较大时,一个很好的办法是增加data(可以凭借经验自己generate data),当data数量足够时,得到的f*实际上是比较集中的;
如果现实中没有办法collect更多的data,那么就采用regularization正规化的方法,以曲线的平滑度为条件控制function set的范围,用weight控制平滑度阈值,
使得最终的model既包含f head,variance又不会太大。
5、如何选择model:
选择model的时候呢,我们手头上的testing data与真实的testing data之间是存在偏差的,因此我们要将training data分成training set和validation set两部分,
经过validation挑选出来的model再用全部的training data训练一遍参数,最后用testing data去测试error,这样得到的error是模拟过testing bias的error,与实际情况下的error会比较符合