李宏毅机器学习2020笔记(三)Bias Variance

一、Bias、Variance

在这里插入图片描述
一个越复杂的model并不意味着在测试数据上可以得到越好的结果。
那么导致这种error的原因是:bias(偏差)和variance(方差)
我们将正确完美的函数定义成f^
训练得到的不同的函数为f*
E[f]=f-*
那么bias和wariance可以表示为:
在这里插入图片描述

1. variance:

由model决定的,一个简单的model在不同的training data下可以获得比较稳定分布的f^,而复杂的model在不同的training data下的分布比较杂乱(如果data足够多,那复杂的model也可以得到比较稳定的分布)
如果采用比较简单的model,那么每次在不同data下的实验所得到的不同的f^之间的variance是比较小的,就好像说,你在射击的时候,每次击中的位置是差不多的,就如同
但是如果model比较复杂,那么每次在不同data下的实验所得到的不同的f^之间的variance是比较大的,它的散布就会比较开
在这里插入图片描述
2. bias:
我们把所有的f^ 平均起来得到E[f*]=f-,这个f-与真值f^ 有多接近
当然这里会有一个问题是说,总体的真值f^ 我们根本就没有办法知道,因此这里只是假定了一个f^
在这里插入图片描述
在这里插入图片描述
结论:
1)如果是一个比较简单的model,那它有比较小的variance和比较大的bias。就像打靶模型,每次实验的f都比较集中,但是他们平均起来距离靶心会有一段距离(比较适合实验次数少甚至只有单次实验的情况)
2)如果是一个比较复杂的model,每次实验找出来的f-都不一样,它有比较大的variance但是却有比较小的bias。就像打靶模型,每次实验的f
都比较分散,但是他们平均起来的位置与靶心比较接近(比较适合多次实验的情况)
即:比较简单的model,variance比较小,bias比较大;
而比较复杂的model,bias比较小,variance比较大

3. Bias和Variance比较:
在这里插入图片描述
可以发现,随着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

4. Bias较大时:
表现为欠拟合(Underfitting)现在这个model里面可能根本没有包含的target,是由于该model(function set)本来就不好,collect更多的data是没有用的,必须要从model本身出发
解决:重新设计model
1)增加更多的features作为model的input输入变量
2)让model变得更复杂,增加高次项

在这里插入图片描述
5.Variance较大时:表现为过拟合(Overfitting)
解决方案:
1.选取更多的数据:
1)如果是5次式,每次实验我们只用10只宝可梦的数据训练model,那我们找出来的100个f^ 的散布就会杂乱无章;但如果每次实验我们用100只宝可梦的数据训练model,那我们找出来的100个 f^ 的分布就会非常地集中
2)增加data是一个很有效控制variance的方法,假设你variance太大的话,collect data几乎是一个万能丹一样的东西,并且它不会伤害你的bias
3)但是它存在一个很大的问题是,实际上并没有办法去collect更多的data
如果没有办法collect更多的data,其实有一招,根据你对这个问题的理解,自己去generate更多“假的”data
a.比如手写数字识别,因为每个人手写数字的角度都不一样,那就把所有training data里面的数字都左转15°,右转15°
b.比如做火车的影像辨识,只有从左边开过来的火车影像资料,没有从右边开过来的火车影像资料,该怎么办?实际上可以把每张图片都左右颠倒,就generate出右边的火车数据了,这样就多了一倍data出来
c.比如做语音辨识的时候,只有男生说的“你好”,没有女生说的“你好”,那就用男生的声音用一个变声器把它转化一下,这样男女生的声音就可以互相转化,这样data就可以多出来
d.比如现在你只有录音室里录下的声音,但是detection实际要在真实场景下使用的,那你就去真实场景下录一些噪音加到原本的声音里,就可以generate出符合条件的data了
2.正则化(Regularzation)
1)就是在loss function里面再加一个与model高次项系数相关的term,它会希望你的model里高次项的参数越小越好,也就是说希望你今天找出来的曲线越平滑越好;这个新加的term前面可以有一个weight,代表你希望你的曲线有多平滑
2) 下图中Regularization部分,左边第一幅图是没有加regularization的test;第二幅图是加了regularization后的情况,一些怪怪的、很不平滑的曲线就不会再出现,所有曲线都集中在比较平滑的区域;第三幅图是增加weight的情况,让曲线变得更平滑
3)加了regularization以后,因为你强迫所有的曲线都要比较平滑,所以这个时候也会让你的variance变小;但regularization是可能会伤害bias的,因为它实际上调整了function set的space范围,变成它只包含那些比较平滑的曲线,这个缩小的space可能没有包含原先在更大space内的f,因此伤害了bias,所以当你做regularization的时候,需要调整regularization的weight,在variance和bias之间取得平衡
在这里插入图片描述
在这里插入图片描述
我们希望找一个model,它variance够小,bias也够小,这两个合起来给我们最小的testing data的error

二、模型选择:

1.你手上有training set,有testing set,model1、model2、model3里面,分别得到三个error为0.9,0.7,0.5,这里很直觉地会认为是model3最好(错)
2.但是现在可能的问题是,这个testing set是你自己手上的testing set,是你
自己拿来衡量model好坏的testing set,真正的testing set是你没有的;注意到你自己手上的这笔testing set,它有自己的一个bias(这里的bias跟之前提到的略有不同,可以理解为自己的testing data跟实际的testing data会有一定的偏差存在)
3.所以你今天那这个testing set来选择最好的model的时候,它在真正的testing set上不见得是最好的model,通常是比较差的,所以你实际得到的error是会大于你在自己的testing set上估测到的0.5
在这里插入图片描述
1. 如何解决:
training data分成training set和validation set
你要做的事情是,把你的training set分成两组:
1)一组是真正拿来training model的,叫做training set(训练集)
2)另外一组不拿它来training model,而是拿它来选model,叫做validation set(验证集)

你手头上有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的f^到public testing set上面,你可能会得到一个大于0.5的error,虽然这么做,你得到的error表面上看起来是比较大的,但是这个时候你在public set上的error才能够真正反映你在private set上的error
在这里插入图片描述
结论:
在考虑真实的测试集的情况下:
实际上是这样一个关系:
1.training data(训练集) -> 自己的testing data(测试集) -> 实际的testing data (该流程没有考虑自己的testing data的bias)
2.training set(部分训练集) -> validation set(部分验证集) -> 自己的testing data(测试集) -> 实际的testing data (该流程使用自己的testing data和validation来模拟testing data的bias误差,可以真实地反映出在实际的data上出现的error)

2. 真正的error
1.当你得到public set上的error的时候(尽管它可能会很大),不建议回过头去重新调整model的参数,因为当你再回去重新调整什么东西的时候,你就又会把public testing set的bias给考虑进去了,这就又回到了第一种关系,即围绕着有偏差的testing data做model的优化

2.这样的话此时你在public set上看到的performance就没有办法反映实际在private set上的performance了,因为你的model是针对public set做过优化的,虽然public set上的error数据看起来可能会更好看,但是针对实际未知的private set,这个“优化”带来的可能是反作用,反而会使实际的error变大

3.当然,你也许几乎没有办法忍住不去做这件事情,在发paper的时候,有时候你会propose一个方法,那你要attach在benchmark的corpus,如果你在testing set上得到一个差的结果,你也几乎没有办法把持自己不回头去调一下你的model,你肯定不会只是写一个paper说这个方法不work这样子

4.因此这里只是说,你要keep in mind,如果在那个benchmark corpus上面所看到的testing的performance,它的error,肯定是大于它在real的application上应该有的值
那如果training set和validation set分坏了怎么办?如果validation也有怪怪的bias,岂不是对结果很不利?那你要做下面这件事情:

3. N-flod Cross Validation
如果你不相信某一次分train和validation的结果的话,那你就分很多种不同的样子

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的
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值