机器学习系列 三 误差从何而来

使用普通的gradient descent 来进行更新参数,经过1万次后的成果:距离最佳解依然非常遥远
看样子可能是learning rate 不够大,把learning rate 调大10倍后:虽然距离最佳解近了一点,但是有一个剧烈的震荡
会不会是learning rate还不够大呢,再次调大10倍:参数飞出范围了....
不好!!
gradient descent 无法解决这个问题,竟然只有两个参数都解决不了。
放个大招!

做法:
将b和w两个learning rate分开进行定制化,让他们都分别除以一个特定的值,这个方法叫做Adagram。果然牛逼!下节课会讲。


回到上节课,
那么那些误差都从哪里来?
bias - 偏执量
variance - 变异


就上一节课的预测宝可梦的cp值,那么举个例子来说明, f尖号就是真正的最佳模型,
然而f星号是根据我们训练集得到的结果,f星号和f尖号之间有一定的距离,这个距离就是由bias偏差和variance变异共同的作用下所造成的。

那么在预测器中,bias和variance到底是什么呢?
例如,在概率与统计中。
假设有一个变量x,
    -     变量x的mean(数学期望,均值,也称期望)是μ
    -     变量x的variance是西格玛的平方(方差

那么估算期望的话怎么做呢?

    首先,先假设给出sample N个点:
    
    然后再讲这N个点算平均值得到m,
    

那么这N个点的平均值m应该不会直接正好等于μ的。
那么每次随机取样的10个点算出来的平均值,都不一定会正好等于μ,
这个原理就好像是在打靶的时候,我们瞄准的是中心店μ,但是由于各种外界因素风速、机械故障灯,散落在瞄准的靶心周围
这个散布在周围的程度,取决于m的variance,然而variance的值又取决于你取的sample的数量
如果样本比较少,那么就会很分散;如果样本更多,他的集中程度就会更高。

那么如何估测Variance呢?
1.先计算m,样本平均值
2.对计算x减去m的平方,再取平均值,得到一个s平方,就是样本方差,这个s平方可以拿来估测整体方差西格玛的平方

错误的来源bias和variance这里可以看出,就类似于打靶,秒的中心如果不对,那就是bias,再加上后来打出去风速的影响这个就是variance才得到了f星号。


所以错误来自的两个地方:
1.瞄准的位置距离真正的靶心差距。bias
2.射击出去之后风速等外力的变异影响。variance


影响的实质:
先来看variance 的影响
所以如果做100次抓取,考虑model的次幂的话

次方越高越复杂,他的散布就会很开
为什么呢?
因为简单的model比较不会受到data的影响。


再来看bias的影响
    如下图,虽然大的bias比较集中,然而他距离靶心的差距还是很大,而较小bias虽然比较分散,但他的平均距离靶心还是比较小的。
现在用一次和3次方程再次进行计算,黑色线代表真正结果,蓝色线代表执行5000次后平均结果,红色代表执行5000次每一次的分布
我们得到的一次方程的model平均值和真是值差距还是很大。
使用三次方程的model平均值的头和尾差距会比较大,但是平均的蓝色线,会跟黑色真实值比较接近。
如果用五次曲线,看到平均值非常接近真实值,然而每一次都不一样。


所以,结论就是,更大的bias(也就意味着model次方更小)会得到每一次差距不大,但是平均下来会跟target差很多。
而更小的bias(也就是说model的次方更大),会带来每次的差距很大,但平均下来却距离target很接近。

换句话说,较为简单(低次幂)的model所能代表的function set范围比较小,所以他有可能压根就不包含靶心位置;
而较为复杂(高次幂)的model能代表的function set的范围会很大,低次幂可能被包含在其中,所以他的范围包含了靶心,尽管分布比较分散,但平均下来会比低次幂得到的结果好很多。

所以选取模型的时候,需要同时考虑bias和variance
所以
如果由于variance很大带来的误差,这种情形就叫做overfitting过拟合
如果由于bias很大带来的误差,这种情形叫做underfitting欠拟合


怎么知道到底是bias大还是variance大呢?

  • 如果你的model没有办法fit你的training data的时候,代表bias 大。
也就是说,给出的training data你的model都没有办法正确fitting,也就说你的model跟正确的model是有一段差距的。  这个时候是underfitting的

  • 但是如果是你在training data得到比较小的error,可以fit你的training data,但是在你的testing data 上却得到一个比较大的error,意味着你得model的variance比较大,这时是overfitting的。


处理办法:
这个时候,你需要用不同的方式去处理它。

  • 对于bias,这时,你的model可能压根没有包含正确的值,所以需要redesign model
加入更多的feature, 或者更为复杂的模型考虑二次三次方

  • 对于variance
增加训练数据 more data        我们有的时候没办法获取数据,一种办法是生成一些假的数据
        
  1. 正则化Regularization
  • 在loss function的后面再加一个term,希望你找的参数越小越好,让曲线越平滑越好。term前面有个weight,用来决定你的曲线有多么平滑
  • 强迫曲线,变得更为平滑。当这种情况,可能会伤害bias,让曲线的集合可能会错过目标曲线。
所以在做Regularization的时候,调整weight,要注意保证在bias和variance之间取的平衡


model 选择:
通常我们会在bias和variance之间做一些权衡
选择在两种误差之间最少的模型
不应当做的是:
根据这个我们不应该武断的去选择model3,因为我们可能受伤的testing set存在一些不够全面的bias,造成其他真实的testing set中得到的误差肯定会超过0.5


也就是说public set可能是不可靠的。那该怎么做呢?

要把training set 分成两组!一组是真正的train model,另一组是用于选择model

Cross valiation -- 交叉验证
那么,我们可以按照下面的步骤来进行,
1.首先,将training set 分成两部分,training和validation部分。
2.然后用training部分练出来三个模型,选出最好的放到validation部分中去验证,确认最好的model 3。
3.然后还是不放心validation部分的验证结果,再把model 3 放入到全部最初的training set去训练,如果还得到model 3就ok了。
4.这个时候,就基本可以使用model去处理testing set了。但是不推荐再把tesing set的训练结果拿回到training set去做训练了。
因为,testing set 会带有自己的bias的偏执量,导致对于training set有不准确的影响。每个数据集都会有或多或少的bias的差异。


如果你要是觉得这样划分taining set还是不够满意,可以使用如下的方式:
N-fold Cross Validation -- N倍交叉验证
不相信某一次的train和test的结果
按照如下进行:
1.将Traing set 分成三块,
2.将这三块分别设定三种测试场景,如下图所示。前两个作为train最后一个val,第一和第三个train中间的val,最后两个train第一个val,
3.然后分别将所有的model在这三种场景下进行训练,然后将这三个场景的误差进行平均,看看那个最小,
4.如果还不放心,将最初全部的training set放到三个备选模型上再次验证最好的model。

阅读更多

没有更多推荐了,返回首页