李宏毅学习笔记——3.Loss Error和模型选择

一: Error来源:

目的:
找到Error来进化model,让f-*不断接近f^

两个重要因素:
bias(偏差)和variance(方差)

完美函数:
f^
训练得到函数:
f-*

1.variance分析:

分布情况由model的复杂程度决定。
model越简单,分布越稳定,趋于一个点,model越复杂,分布越分散。
李宏毅学习笔记——3.Loss Error和模型选择

2.bias

首先假定了一个f^,
f^ 平均起来得到E[f*]=f-,这个f-与真值f^ 有多接近
小的model ,大的bias,稳定分布
大的model,小的bias,分散分布。

结论:

1)如果是一个比较简单的model,那它有比较小的variance和比较大的bias。就像打靶模型,每次实验的f都比较集中,但是他们平均起来距离靶心会有一段距离(比较适合实验次数少甚至只有单次实验的情况)
2)如果是一个比较复杂的model,每次实验找出来的f-都不一样,它有比较大的variance但是却有比较小的bias。就像打靶模型,每次实验的f都比较分散,但是他们平均起来的位置与靶心比较接近(比较适合多次实验的情况)
即:比较简单的model,variance比较小,bias比较大;
而比较复杂的model,bias比较小,variance比较大

3. variance VS bias

随着model的逐渐复杂:
1)bias逐渐减小,bias所造成的error也逐渐下降,也就是打靶的时候瞄得越来越准,体现为图中的红线
2)variance逐渐变大,variance所造成的error也逐渐增大,也就是虽然瞄得越来越准,但是每次射出去以后,你的误差是越来越大的,体现为图中的绿线
3)当bias和variance这两项同时被考虑的时候,得到的就是图中的蓝线,也就是实际体现出来的error的变化;实际观测到的error先是减小然后又增大,因此实际error为最小值的那个点,即为bias和variance的error之和最小的点,就是表现最好的model
4)如果实际error主要来自于variance很大,这个状况就是overfitting过拟合;
如果实际error主要来自于bias很大,这个状况就是underfitting欠拟合:
overfitting就是过分地包围了靶心所在的space,而underfitting则是还未曾包围到靶心所在的space
李宏毅学习笔记——3.Loss Error和模型选择
怎么判断是bias偏大还是variance偏大?
如果model(蓝线)都不能满足training data 就是bias偏大,underfitting 。如果model 可以满足training data但是测试数据有很大的ERROR,就是大的variance,overfitting

4.Bias较大时

Underfitting(欠拟合)

表现:个model里面可能根本没有包含的target,是由于该model(function set)本来就不好,collect更多的data是没有用的,必须要从model本身出发

解决办法:
1)增加更多的features作为model的input输入变量
2)让model变得更复杂,增加高次项

5.Variance较大时

Overfitting:(过拟合)

表现:数据少就会分布太分散,杂乱无章,多加数据才会稳定下来。
本质就是欠数据。

解决办法:
1)选取更多的数据:
如果实际上并没有办法去collect更多的data,自己去generate更多“假的”data。它不会伤害你的bias
例如:a.比如手写数字识别,因为每个人手写数字的角度都不一样,那就把所有training data里面的数字都左转15°,右转15°
b.比如做火车的影像辨识,只有从左边开过来的火车影像资料,没有从右边开过来的火车影像资料,该怎么办?实际上可以把每张图片都左右颠倒,就generate出右边的火车数据了,这样就多了一倍data出来
c.比如做语音辨识的时候,只有男生说的“你好”,没有女生说的“你好”,那就用男生的声音用一个变声器把它转化一下,这样男女生的声音就可以互相转化,这样data就可以多出来
d.比如现在你只有录音室里录下的声音,但是detection实际要在真实场景下使用的,那你就去真实场景下录一些噪音加到原本的声音里,就可以generate出符合条件的data了。

2)Regularzation(正则化):
方法本质:在loss function里面加一个与model高次项系数相关的term,它会希望你的model里高次项的参数越小越好,也就是说希望你今天找出来的曲线越平滑越好;这个新加的term前面可以有一个weight,代表你希望你的曲线有多平滑(weight代表平滑程度)
加了Regularzation之后,很不平滑的曲线就不会再出现,再增加weight,会让曲线变得更平滑
李宏毅学习笔记——3.Loss Error和模型选择
Warning:
regularization是可能会伤害bias的,因为它实际上调整了function set的space范围,变成它只包含那些比较平滑的曲线,这个缩小的space可能没有包含原先在更大space内的f,因此伤害了bias,所以当你做regularization的时候,需要调整regularization的weight,在variance和bias之间取得平衡

总结:
我们希望找一个model,它variance够小,bias也够小,这两个合起来给我们最小的testing data的error
bias是靶心,variance是数据有效性。

二:模型选择:

李宏毅学习笔记——3.Loss Error和模型选择
1.很直觉地会认为是model3最好(错)
真正的testing set是你没有的,自己的testing data跟实际的testing data会有一定的偏差存在。所以你实际得到的error是会大于你在自己的testing set上估测到的0.5

2.如何解决:
training data分成training set和validation (验证)set
李宏毅学习笔记——3.Loss Error和模型选择
等于是,training data是:
两组training set和一组validation set
假设:你手头上有3个model,假设现在model3的performance最好,那你可以直接把这个model3的结果拿来apply在testing data上,感觉training data变少的话,定住model3不变,用全部的data在model3上面再训练一次,这个时候,如果你把这个训练好的model的f^到public testing set上面,你可能会得到一个大于0.5的error,虽然这么做,你得到的error表面上看起来是比较大的,但是这个时候你在public set上的error才能够真正反映你在private set上的error

结论
流程:
training set(部分训练集) -> validation set(部分验证集) -> 自己的testing data(测试集) -> 实际的testing data
1.比如说,如果你做3-flod的validation,意思就是你把training set分成三份,你每一次拿其中一份当做validation set,另外两份当training;分别在每个情境下都计算一下3个model的error,然后计算一下它的average error;然后你会发现在这三个情境下的average error,是model1最好

2.然后接下来,你就把用整个完整的training data重新训练一遍model1的参数;然后再去testing data上test

3.原则上是,如果你少去根据public testing set上的error调整model的话,那你在private testing set上面得到的error往往是比较接近public testing set上的error的