李宏毅《机器学习》笔记 DAY3 误差和梯度下降

Error的主要来源

Average\ Error随着模型复杂增加呈指数上升趋势。更复杂的模型并不能给测试集带来更好的效果,而这些 Error的主要有两个来源,分别是 bias(偏差)和 variance(方差)

bias(偏差) 

计算平均值 m,如果计算很多组的 m ,然后求 m 的期望。这个估计是无偏估计(unbiased),

 然后 m 分布对于 μ 的离散程度(方差)Var[m]= \frac{\sigma ^{2}}{N},这个取决于 N,N 越小越离散

估测变量 x 的方差(variance)

不同模型的方差 

一次模型的方差就比较小的,比较集中,离散程度较小。

而5次模型的方差就比较大,散布比较广,离散程度较大。

因为简单的模型受到不同训练集的影响是比较小的。

不同模型的偏差 

一次模型的偏差比较大,而复杂的5次模型,偏差就比较小。

直观的解释:简单的模型函数集的space比较小,所以可能space里面就没有包含靶心,肯定射不中。而复杂的模型函数集的space比较大,可能就包含的靶心,只是没有办法找到确切的靶心在哪,但足够多的,就可能得到真正的 f¯。

简单模型(左边)是偏差比较大造成的误差,这种情况叫做欠拟合,

复杂模型(右边)是方差过大造成的误差,这种情况叫做过拟合。

复杂程度提升,偏差会下降,复杂度上升试错范围变大,方差会上升。

总的误差会有一个较小的点,就是最佳模型。

减小的方法

  1. 判断来源
    1. 没有很好的训练数据集:偏差过大,欠拟合;
    2. 有很好的训练数据集,即在训练集上得到很小的错误,但在测试集上得到大的错误,这意味着模型可能是方差比较大,就是过拟合。
  2. 针对欠拟合的情形:将更多的函数加进去

  3. 针对过拟合的情形:应想办法加入或者采集更多的数据,或者通过数据增广的方式,来增加数据。

  4. 模型的选择(不要只在单一数据集上来评价模型的误差,因为误差存在一定的随机性)

    1. 交叉验证。就是将训练集再分为两部分,一部分作为训练集,一部分作为验证集。用训练集训练模型,然后再验证集上比较,确实出最好的模型之后,再用全部的训练集训练模型3,然后再用public的测试集进行测试,此时一般得到的错误都是大一些的。不过此时会比较想再回去调一下参数,调整模型,让在public的测试集上更好,但不太推荐这样。上述方法可能会担心将训练集拆分的时候分的效果比较差怎么办,可以用下面的方法。

    2. N-折交叉验证。将训练集分成N份,比如分成3份。在三份中训练结果Average错误是模型1最好,再用全部训练集训练模型1。

自适应 learning rate

举一个简单的思想:随着次数的增加,通过一些因子来减少学习率

  1. 通常刚开始,初始点会距离最低点比较远,所以使用大一点的学习率

  2. update好几次参数之后呢,比较靠近最低点了,此时减少学习率

  3. 比如 \eta ^{t} = \frac{\eta ^{t}}{\sqrt{t+1}}​,t是次数。随着次数的增加,\eta^t 减小

学习率不能是一个值通用所有特征,不同的参数需要不同的学习率。

Adagrad:每个参数的学习率都除上之前微分的均方根。

一般梯度下降:\omega ^{t+1}\leftarrow \omega ^{t} - \eta ^{t}g^{t}\eta ^{t} = \frac{\eta ^{t}}{\sqrt{t+1}}

Adagrad算法\omega ^{t+1}\leftarrow \omega ^{t} - \frac{\eta ^{t}}{\sigma^{t} }g^{t}g^{t} = \frac{\partial L\left ( \theta ^{t} \right )}{\partial \omega }

\sigma^{t} :之前参数的所有微分的均方根,对于每个参数都是不一样的。

Adagrad参数的更新过程:

在 Adagrad 中,当梯度越大的时候,步伐应该越大,但下面分母又导致当梯度越大的时候,步伐会越小。 

 直观的解释:

 正式的解释:

还有个分母 2a 。对function进行二次微分刚好可以得到2a。即不止和一次微分成正比,还和二次微分成反比。最好的step应该考虑到二次微分。

对于\sqrt{\sum_{i=0}^{t}\left ( g^{i} \right )^{2}} 就是希望再尽可能不增加过多运算的情况下模拟二次微分。(如果计算二次微分,在实际情况中可能会增加很多的时间消耗)

Stochastic Gradient Descent(随机梯度下降法)

之前的梯度下降:

而随机梯度下降法更快:损失函数不需要处理训练集所有的数据,选取一个例子x^{n},此时不需要像之前那样对所有的数据进行处理,只需要计算某一个例子的损失函数Ln,就可以update梯度。

对比:

常规梯度下降法走一步要处理到所有二十个例子,但随机算法此时已经走了二十步(每处理一个例子就更新)

Feature Scaling(特征缩放)

比如有个函数:

两个输入的分布的范围很不一样,建议把他们的范围缩放,使得不同输入的范围是一样的。

why?

上图右边是两个参数scaling比较接近,右边的绿色图就比较接近圆形。

对于左边的情况,上面讲过这种狭长的情形不过不用Adagrad的话是比较难处理的,两个方向上需要不同的学习率,同一组学习率会搞不定它。而右边情形更新参数就会变得比较容易。左边的梯度下降并不是向着最低点方向走的,而是顺着等高线切线法线方向走的。但绿色就可以向着圆心(最低点)走,这样做参数更新也是比较有效率。

如何缩放:

 泰勒展开式:

 

如何快速在圆圈内找到最小值。基于泰勒展开式,在 (a,b)(a,b) 点的红色圆圈范围内,可以将损失函数用泰勒展开式进行简化:

 不考虑s的话,那怎样让它最小,就是和向量 (u,v) 方向相反的向量

 然后将u和v带入

最后的式子就是梯度下降的式子。但这里用这种方法找到这个式子有个前提,泰勒展开式给的损失函数的估算值是要足够精确的,而这需要红色的圈圈足够小(也就是学习率足够小)来保证。所以理论上每次更新参数都想要损失函数减小的话,就需要学习率足够足够小才可以。

所以实际中,当更新参数的时候,如果学习率没有设好,是有可能式子是不成立的,所以导致做梯度下降的时候,损失函数没有越来越小。

式子只考虑了泰勒展开式的一次项,如果考虑到二次项(比如牛顿法),在实际中不是特别好,会涉及到二次微分等,多很多的运算,性价比不好。

梯度下降的限制

容易陷入局部极值。还有可能卡在不是极值,但微分值是0的地方。还有可能实际中只是当微分值小于某一个数值就停下来了,但这里只是比较平缓,并不是极值点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值