1、误差的来源
了解error的来源其实是很重要的,因为我们可以针对它挑选适当的方法来improve自己的model,提高model的准确率,而不会毫无头绪。
y ^ \widehat{y} y 表示那个真正的function,而 f ∗ f^* f∗表示这个 f ^ \widehat{f} f 的估测值 estimator。
就好像在打靶, f ^ \widehat{f} f 是靶的中心点,收集到一些data做training以后,你会得到一个你觉得最好的function即 f ∗ f^* f∗,这个 f ∗ f^* f∗落在靶上的某个位置,它跟靶中心有一段距离,这段距离就是由Bias和variance决定的。
bias(偏差)和variance(方差 )实际上对应着物理实验中系统误差和随机误差的概念,假设有n组数据,每一组数据都会产生一个相应的
f
∗
f^*
f∗,此时bias表示所有
f
∗
f^*
f∗的平均落靶位置和真值靶心的距离,variance表示这些
f
∗
f^*
f∗的集中程度。
这里我们利用了抽样分布的理论,利用估测值的均值和方差来反映真实值。
下图是对我们引入概念的视觉解释:
上图结合了我们讲解宝可梦的案例分析时,不同模型的韦恩图表示。
- 在模型较为简单的情况下,我们在打靶的时候视野是非常小的,视野范围可能根本就没有包含我们的targe,这就很容易导致打靶打偏(bias偏大),但是每次打的都会相对集中(variance偏小)。
- 在模型相对复杂的情况下,视野就会变得非常大,那么我们在打击靶心的时候就会相对容易中标(bias偏小),但是每次打的都会相对变得松散(variance偏大)。
由此,比较简单的model,variance比较小,bias比较大;而比较复杂的model,bias比较小,variance比较大。
如果实际error主要来自于variance很大,这个状况就是overfitting过拟合;如果实际error主要来自于bias很大,这个状况就是underfitting欠拟合(可以理解为,overfitting就是过分地包围了靶心所在的space,而underfitting则是还未曾包围到靶心所在的space)
2、如何针对性地处理bias大 or variance大的情况呢?
1、如果bias比较大
bias大代表,你现在这个model里面可能根本没有包含你的target, f ^ \widehat{f} f 可能根本就不在你的function
set里对于error主要来自于bias的情况,是由于该model(function
set)本来就不好,collect更多的data是没有用的,必须要从model本身出发
重新设计你的model
增加更多的features作为model的input输入变量
比如pokemon的例子里,只考虑进化前cp值可能不够,还要考虑hp值、species种类…作为model新的input变量
让model变得更复杂,增加高次项
比如原本只是linear model,现在考虑增加二次项、三次项…
2、如果variance比较大
- 增加data * 如果是5次式,找100个 f ∗ f^* f∗,每次实验我们只用10只宝可梦的数据训练model,那我们找出来的100个 f ∗ f^* f∗的散布就会像下图一样杂乱无章;但如果每次实验我们用100只宝可梦的数据训练model,那我们找出来的100个 f ∗ f^* f∗的分布就会像下图所示一样,非常地集中
- 增加data是一个很有效控制variance的方法,假设你variance太大的话,collect data几乎是一个万能丹一样的东西,并且它不会伤害你的bias *
但是它存在一个很大的问题是,实际上并没有办法去collect更多的data *
如果没有办法collect更多的data,其实有一招,根据你对这个问题的理解,自己去generate更多“假的”data
- 比如手写数字识别,因为每个人手写数字的角度都不一样,那就把所有training data里面的数字都左转15°,右转15°
- 比如做火车的影像辨识,只有从左边开过来的火车影像资料,没有从右边开过来的火车影像资料,该怎么办?实际上可以把每张图片都左右颠倒,就generate出右边的火车数据了,这样就多了一倍data出来
- 比如做语音辨识的时候,只有男生说的“你好”,没有女生说的“你好”,那就用男生的声音用一个变声器把它转化一下,这样男女生的声音就可以互相转化,这样data就可以多出来
- 比如现在你只有录音室里录下的声音,但是detection实际要在真实场景下使用的,那你就去真实场景下录一些噪音加到原本的声音里,就可以generate出符合条件的data了
- Regularization(正规化)
- 就是在loss function里面再加一个与model高次项系数相关的term,它会希望你 的model里高次项的参数越小越好,也就是说希望你今天找出来的曲线越平滑越好;这个新加的term前面可以有一个weight,代表你希望你的曲线有多平滑
- 下图中Regularization部分,左边第一幅图是没有加regularization的test;第二幅图是加了regularization后的情况,一些怪怪的、很不平滑的曲线就不会再出现,所有曲线都集中在比较平滑的区域;第三幅图是增加weight的情况,让曲线变得更平滑
- 加了regularization以后,因为你强迫所有的曲线都要比较平滑,所以这个时候也会让你的variance变小;但regularization是可能会伤害bias的,因为它实际上调整了function set的space范围,变成它只包含那些比较平滑的曲线,这个缩小的space可能没有包含原先在更大space内的 f ^ \widehat{f} f ,因此伤害了bias,所以当你做regularization的时候,需要调整regularization的weight,在variance和bias之间取得平衡
实际上,通过regularization优化model的过程就是上述的1、2、3步骤,不断地调整regularization的weight,使model的bias和variance达到一个最佳平衡的状态(可以通过error来评价状态的好坏,weight需要慢慢调参),
正则化会使得bias变大
3、选择模型
我们现在会遇到的问题往往是这样:我们有很多个model可以选择,还有很多参数可以调,比如regularization的weight,那通常我们是在bias和variance之间做一些trade-off权衡
我们希望找一个model,它variance够小,bias也够小,这两个合起来给我们最小的testing data的error
在选择模型时,通常情况下,我们会在training set上训练得到Model1,2,3,之后再testing set上进行测试得到 performance 最好的模型来作为我们最后的选择。但这是最不可取得。
因为,此时你的testing set 并不是真正的testing set,它们之间存在一定的偏差,那么在testing set上得到的结果会稍逊色一些。
那我们应该怎样选择我们的模型?
1. Cross Validation
基本思路是将自己原本的training data
分成training set(训练集)
和validation set(验证集)
,在training data
上做训练,在validation set
做选择。也就是说,先拿training set
来训练我们决定的3个model
,找到他们 f*
,再拿validation set
来选择误差值最小,performance最好的那个model,最后将这个 model 使用在public testing set
上。
在训练过程中,你可能担心,原本的training set
被分成了training set
和validation set
两个部分,会比之前的训练数据要少,训练效果会不会不好,我们也可以这样做,把已经从validation set
决定model3
是最好的model,那就定住model3不变(function的表达式不变),然后把我们之前全部的 training set
再训练一次,得到model4。
通过Cross Validation
,我们得到的model apply在public testing set
的error是能真正反映private testing set
上的error。
从上图我们可以得到,在public testing set
的结果并不好,不建议回过头去重新调整model的参数,因为当你再回去重新调整什么东西的时候,你就又会把public testing set
的bias给考虑进去了,这就又回到了第一种情况,即围绕着有偏差的testing data
做model
的优化。这样操作使得我们的public testing set
不能真正的去反映 真实的 private testing set
,糟糕的是error 会变得更大。因为你本身离我们的真实还挺近的,但是你稍微一调整就使得我们离真实更远了一点,所以最后的结果就会导致error 变大。
在 Cross Validation
中,我们如何分配全部的training set
?担心分不好怎么办?
2.N-flod Cross Validation
如果你不相信某一次分train和validation的结果的话,那你就分很多种不同的样子
比如说,如果你做3-flod的validation,意思就是你把training set分成三份,每一次拿其中一份当做validation set,另外两份当training;分别在每个情境下都计算一下3个model的error,然后计算一下它的average error;然后你会发现在这三个情境下的average error,是model1最好。
然后接下来,你就把用整个完整的training data重新训练一遍model1的参数;然后再去public testing set
上test
原则上是,如果你根据public testing set
上的error调整model的次数尽量少时,那你在private testing set
上面得到的error往往是比较接近public testing set
上的error的。
4、总结:
- error 是有bias 和 variance 共同影响的
- bias 和 variance出现问题时分别的处理办法
- 如何选择模型