Error的主要来源
Average\ Error随着模型复杂增加呈指数上升趋势。更复杂的模型并不能给测试集带来更好的效果,而这些 Error的主要有两个来源,分别是 bias(偏差)和 variance(方差)。
bias(偏差)
计算平均值 m,如果计算很多组的 m ,然后求 m 的期望。这个估计是无偏估计(unbiased),
然后 m 分布对于 μ 的离散程度(方差),这个取决于 N,N 越小越离散
估测变量 x 的方差(variance)
不同模型的方差
一次模型的方差就比较小的,比较集中,离散程度较小。
而5次模型的方差就比较大,散布比较广,离散程度较大。
因为简单的模型受到不同训练集的影响是比较小的。
不同模型的偏差
一次模型的偏差比较大,而复杂的5次模型,偏差就比较小。
直观的解释:简单的模型函数集的space比较小,所以可能space里面就没有包含靶心,肯定射不中。而复杂的模型函数集的space比较大,可能就包含的靶心,只是没有办法找到确切的靶心在哪,但足够多的,就可能得到真正的 f¯。
简单模型(左边)是偏差比较大造成的误差,这种情况叫做欠拟合,
复杂模型(右边)是方差过大造成的误差,这种情况叫做过拟合。
复杂程度提升,偏差会下降,复杂度上升试错范围变大,方差会上升。
总的误差会有一个较小的点,就是最佳模型。
减小的方法
- 判断来源
- 没有很好的训练数据集:偏差过大,欠拟合;
- 有很好的训练数据集,即在训练集上得到很小的错误,但在测试集上得到大的错误,这意味着模型可能是方差比较大,就是过拟合。
针对欠拟合的情形:将更多的函数加进去
针对过拟合的情形:应想办法加入或者采集更多的数据,或者通过数据增广的方式,来增加数据。
模型的选择(不要只在单一数据集上来评价模型的误差,因为误差存在一定的随机性)
交叉验证。就是将训练集再分为两部分,一部分作为训练集,一部分作为验证集。用训练集训练模型,然后再验证集上比较,确实出最好的模型之后,再用全部的训练集训练模型3,然后再用public的测试集进行测试,此时一般得到的错误都是大一些的。不过此时会比较想再回去调一下参数,调整模型,让在public的测试集上更好,但不太推荐这样。上述方法可能会担心将训练集拆分的时候分的效果比较差怎么办,可以用下面的方法。
N-折交叉验证。将训练集分成N份,比如分成3份。在三份中训练结果Average错误是模型1最好,再用全部训练集训练模型1。
自适应 learning rate
举一个简单的思想:随着次数的增加,通过一些因子来减少学习率
通常刚开始,初始点会距离最低点比较远,所以使用大一点的学习率
update好几次参数之后呢,比较靠近最低点了,此时减少学习率
比如
,t是次数。随着次数的增加,
减小
学习率不能是一个值通用所有特征,不同的参数需要不同的学习率。
Adagrad:每个参数的学习率都除上之前微分的均方根。
一般梯度下降:
,
Adagrad算法:
,
,
:之前参数的所有微分的均方根,对于每个参数都是不一样的。
Adagrad参数的更新过程:
在 Adagrad 中,当梯度越大的时候,步伐应该越大,但下面分母又导致当梯度越大的时候,步伐会越小。
直观的解释:
正式的解释:
还有个分母 2a 。对function进行二次微分刚好可以得到2a。即不止和一次微分成正比,还和二次微分成反比。最好的step应该考虑到二次微分。
对于
就是希望再尽可能不增加过多运算的情况下模拟二次微分。(如果计算二次微分,在实际情况中可能会增加很多的时间消耗)
Stochastic Gradient Descent(随机梯度下降法)
之前的梯度下降:
而随机梯度下降法更快:损失函数不需要处理训练集所有的数据,选取一个例子,此时不需要像之前那样对所有的数据进行处理,只需要计算某一个例子的损失函数Ln,就可以update梯度。
对比:
常规梯度下降法走一步要处理到所有二十个例子,但随机算法此时已经走了二十步(每处理一个例子就更新)
Feature Scaling(特征缩放)
比如有个函数:
两个输入的分布的范围很不一样,建议把他们的范围缩放,使得不同输入的范围是一样的。
why?
上图右边是两个参数scaling比较接近,右边的绿色图就比较接近圆形。
对于左边的情况,上面讲过这种狭长的情形不过不用Adagrad的话是比较难处理的,两个方向上需要不同的学习率,同一组学习率会搞不定它。而右边情形更新参数就会变得比较容易。左边的梯度下降并不是向着最低点方向走的,而是顺着等高线切线法线方向走的。但绿色就可以向着圆心(最低点)走,这样做参数更新也是比较有效率。
如何缩放:
泰勒展开式:
如何快速在圆圈内找到最小值。基于泰勒展开式,在 (a,b)(a,b) 点的红色圆圈范围内,可以将损失函数用泰勒展开式进行简化:
不考虑s的话,那怎样让它最小,就是和向量 (u,v) 方向相反的向量
然后将u和v带入
最后的式子就是梯度下降的式子。但这里用这种方法找到这个式子有个前提,泰勒展开式给的损失函数的估算值是要足够精确的,而这需要红色的圈圈足够小(也就是学习率足够小)来保证。所以理论上每次更新参数都想要损失函数减小的话,就需要学习率足够足够小才可以。
所以实际中,当更新参数的时候,如果学习率没有设好,是有可能式子是不成立的,所以导致做梯度下降的时候,损失函数没有越来越小。
式子只考虑了泰勒展开式的一次项,如果考虑到二次项(比如牛顿法),在实际中不是特别好,会涉及到二次微分等,多很多的运算,性价比不好。
梯度下降的限制
容易陷入局部极值。还有可能卡在不是极值,但微分值是0的地方。还有可能实际中只是当微分值小于某一个数值就停下来了,但这里只是比较平缓,并不是极值点。