为读者更好地掌握本文框架且方便查询,下面提供本文目录:
课程回顾
上节课我们通过预测宝可梦CP值的案例了解了Regression,发现在改变Model和Regularization时erro都会变化。今天我们将了解到error从何而来,对overfitting和Regularization提供更多理论解释,并引入一个新的概念——validation。
为读者更好地掌握本文框架且方便查询,下面提供本文目录:
Bias and Variance of Estimator
随着model复杂度的增加,我们能发现它在Training data上有了更好的表现,但在Testing data上却表现不佳,而Testing data上的error过大,是我们不想看到的。
究其原因,是因为「bias」和「variance」影响了error。
Estimator(估计量)
事实上存在一个真实的 f ^ \hat{f} f^,当我们input一个object,比如一只杰尼龟,就能得到一个真实的 y ^ \hat{y} y^,比如这只杰尼龟的CP值。然而除了开发人员,我们并不知晓这个真实的 f ^ \hat{f} f^是什么,我们唯一能做的就是通过Training data去尽可能地找到一个最优的f*,用它去估计 f ^ \hat{f} f^,因此f*被称为 f ^ \hat{f} f^的估计值。
如下图,靶心是 f ^ \hat{f} f^,蓝色的圆点是f*,两点之间的距离就是error,error = Bias + Variance。
Bias + Variance
由于我们无法知晓真实的 f ^ \hat{f} f^,也无法穷尽数据去training,我们只能得到一个estimator,我们无法避免error的存在。而这里的error由Bias和Variance构成。
下图中的蓝色圆点 f ‾ \overline{f} f可以看作是f*的平均值,f*与 f ‾ \overline{f} f的偏离程度就是Variance。 f ‾ \overline{f} f与靶心 f ^ \hat{f} f^的偏离程度就是Bias。
我们这样理解:假设我们是一个枪手,面对着一个靶子。虽然我们瞄准的是蓝色圆点 f ‾ \overline{f} f,但是由于学艺不精,实际上打到的是一个个的小圆点f*,它与我们期望打到的点的偏离程度就是Variance。而我们瞄准的点与靶心的偏离程度被称为Bias。
那么你可能会问:为什么我们瞄准的点不是靶心 f ^ \hat{f} f^呢?
答:因为我们不知道靶心在哪呀,233。
模型复杂度与Bias、Variance的关系
Variance
- function set越是简单越不sensitive
- function set越简单Variance越小,越复杂Variance越大
function set越简单越不容易受sampled data的影响,可以考虑f的极端情况,f(x)=c,那么无论你的sampled data是什么,最后的output都不会受到影响,都是一个常数,放在二维坐标平面内就是一条水平直线。
如下图,Variance越小f*越是密集,Variance越大f*越是分散。
Bias
参数说明:
黑色曲线:真实的函数 f ^ \hat{f} f^
红色曲线:5000个估测值f*
蓝色曲线:5000个估测值f*的平均值 f ‾ \overline{f} f
在下图中我们可以看到,随着model复杂度的升高,f*分布越来越乱,Variance越来越大,但是 f ‾ \overline{f} f对应的曲线(蓝色)却和真实函数 f ^ \hat{f} f^更加接近了。
这是因为随着model复杂度的增长,bias变小了。
我们可以这样理解:
model越是复杂,代表着它的model space(对应下图蓝色圆圈)越大,囊括靶心 f ^ \hat{f} f^的可能性就越大,bias越小。
model越是简单,代表着它的model space(对应下图蓝色圆圈)越小,囊括靶心 f ^ \hat{f} f^的可能性就越小,bias越大。
复杂的model包括了简单的model。
举个例子:令下图右边model的w2、w3、w4、w5全部等于0,就相当于左边model。
Overfitting:主要由Variance过大导致的error过大
Underfitting:主要由Bias过大导致的error过大。
界定问题
Underfitting:如果你的model连在training data上都不能fit training examples,那么你有较大的bias。
Overfitting:如果你的model能fit training examples,但是在testing data上仍有较大的error,那么你很可能有较大的Variance。
What to do with large Variance
- More data:很有效,但并不总是适用。
- 如下面的图,sample100笔data的效果明显比sample10笔data的好。
- Regularization:对降低Variance有效,但是可能损害到bias,需要权衡。
What to do with large Bias
Resign the model:
- input时增加更多的feature
- 采用更加复杂的model
注:更多的data对bias的影响可能没那么大。
上图是model不能fit the training data的一个例子。
Model Selection
- There is usually a trade-off between bias and variance
- Select a model that balances two kinds of error to minimize total error
- What you should NOT do:
我们真正关心的是在real data上测试的结果。
你的model在public testing set上有很高的准确率,并不代表在private testing set上也能取得不错的结果。
也许我们可以用到第一节课提到的Transfer Learning。
Validation
Cross Validation
将training data分成training set和validation set
- 一组是真正拿来training model的,叫做training set(训练集)
- 另外一组不拿它来training model,而是拿它来选model,叫做validation set(验证集)
先在training set上找出每个model最好的f*,然后用validation set来选择你的model。
也就是说,你手头上有3个model,你先把这3个model用training set训练出三个f*,接下来看一下它们在validation set上的performance。
假设现在model3的performance最好,那你可以直接把model3的结果拿来应用在 testing data上。
如果你担心现在把training data分成training和validation两部分,使得training data变少了的话,可以这样做:既然已经从validation决定了model3是最好的model,那就保持model3不变(function的表达式不变),然后用全部的training data在model3上面再训练一次(使用全部的training data去更新model3的参数)。
这个时候,如果你把这个训练好的model的f*应用到public testing set上面,你可能会得到一个大于0.5的error,虽然这么做,你得到的error在表面上看起来是比较大的,但是这个时候你在public set上的error才能够真正反映你在private set上的error。
你需要忍住不去做的:看到public testing的results不好,就在那一个劲的调整model。
当你得到public set上的error的时候(尽管它可能会很大),不建议回过头去重新调整model的参数,因为当你再回去重新调整什么东西的时候,你就又会把public testing set的bias给考虑进去了,即围绕着有bias的testing data做model的优化。
这样的话,此时你在public set上看到的performance就没有办法反映实际在private set上的performance了,因为你的model是针对public set做过优化的,虽然public set上的error数据看起来可能会更好看,但是针对实际未知的private set,这个“优化”带来的可能是反作用,反而会使实际的error变大。
虽然要你忍住不去这样做很难,因为你可能无法放着一个不怎么好的results不管,但请忍住,嘿嘿。
N-fold Cross Validation
如何划分training set和validation set?
那如果training set和validation set分坏了怎么办?如果validation也有奇怪的bias,岂不是对结果很不利?
这就是N-fold Cross Validation要解决的问题。
如果你不相信某一次分的training和validation得到的results的话,那你就分很多种不同的情境。
比如说,如果你做3-flod的validation,意思就是你把training data分成三份,你每一次拿其中一份当做validation set,另外两份当training set;分别在每个情境下都计算一下3个model的error,随后计算一下它的average error;然后你会发现在这三个情境下的average error,是model1最好。
接下来,你就用完整的training data重新训练一遍model1的参数,最后去testing data上test。
原则上是,如果你少去根据public testing set上的error调整model的话,那你在private testing set上面得到的error往往是比较接近public testing set上的error的。
本文小结
- error = bias + Variance
- model复杂度与bias、Variance的关系
- model比较复杂时,bias较小,Variance较大。
- model比较简单时,bias较大,Variance较小。
- 如何界定该调整bias还是Variance?
- Underfitting:说明bias太大
- Overfitting:说明Variance太大
- 如何应对Underfitting或者Overfitting?
- 面对Underfitting:
- input时增加更多的feature
- 增加model复杂度
- 面对Overfitting:
- 增加training data
- Regularization
- 面对Underfitting:
- Model Selection
- what you should do
- 关注在private set上的error
- validation:加了validation后,你在public set上的error才能够真正反映你在private set上的error。
- what you should NOT do
- public testing set上的error较大,就回头调整model
- what you should do