status
type
date
slug
summary
tags
category
password
icon
Total Videos
Link
Video Duration
Adaptive Learning Rate(自适应学习率)
当我们的训练Loss随着参数的update,越来越低,直到几乎不变时,此时我们能说函数卡在了critical point吗?
如上图所示,loss函数随着参数的update逐渐下降直到不在变化,而我们看Gradient图却发现,Gradient向量反复波动,并没有变的很小。这是因为loss不断的在error surface之间震荡(左图),没办法真正进入critical point,这是训练过程中相当常见的情况,要比critical point常见的多。
上图是convex的error surface,convex的特征就是横向gradient坡度很小,纵向却很大,所以看起来不像是椭圆形而是长方形。
从左下图可以看出当学习率设置的较大时(前文我们提到参数的移动距离与Gradient的大小和学习率有关),gradient会反复波动无法掉入真正的critical point区域;即使将设置的更小(右图),虽然在纵向上能掉入最小的Loss区域(因为此时Gradient的坡度够大),但横向上因为Gradient的坡度不够大,所以无法进入真正的critical point区域。
这就带来了一个问题,能不能定制学习率使其在不同的方向(参数)上具有不同的大小呢?
如何定制学习率
Root Mean Square
现在我们为了让在不同方向上具有不同的数值,我们将学习率改写为:,使其与参数update的次数t和第i个参数挂钩。
从上图可以看出,这条公式是如何影响学习率的:
当Gradient比较小时,坡度比较缓,也比较小,因此学习率就比较大;而当Gradient比较大时,坡度比较陡,比较大,学习率就比较小,因此可以控制学习率的大小。
上述的这种通过调整的方法虽然好用,但也有缺陷,就是认为同一个参数的Gradient大小是差不多的。
如果遇到上图这种,同一个参数(水平箭头)需要调整时就没办法了,因为Gradient并不是平均的,而是有的占比高,有点占比低。这就引出了RMSProp。
RMSProp
RMSProp与RMS的区别在于根号内多了一个名叫的hyperparameter,用来指定那一部分的Gradient占比更大,因此可以动态调整学习率的大小。
如图所示,当我们处在第三个蓝球时,我们可以将调小,使增大,继而让减小,以此来踩一脚“刹车”,这要比RMS的反应快的多。
Adam
现在最常用的optimization策略是Adam,它是RMSProp+Momentum的组合。
现在有了RMS之后让我来看一下能不能训练起来。
上图是RMS找出critical point的过程,可以看到红圈圈出来的部分相当的杂乱,这是因为前一段横轴Gradient太小了,导致累积到一定地步,红框的那一项变的很大,移动的幅度变的更大;之后,因为移动到了Gradient大的地方,红框又变小,回归正常,如此反复。
那怎么解决这种情况呢?
Learning Rate Scheduling
我们现在将改写为与时间有关的常数,这称为Learning Rate Scheduling。最常见的做法是Learning Rate Decay。
它通过让随着时间的增加变的越来越小,以此让参数更新的慢下来。
另一个方法是Warm up:
随着时间的增加,先上升后下降。前面从0上升的这一段目的是收集更多的error surface数据。
总结
现在我们将原始的Gradient Descent改进为:
其中:
- 是Momentum,它考虑了所有Gradient,将它们全部相加,考虑了大小和方向。
- 是Learning Rate Scheduling,是一个hyperparameter,
- 是Root Mean Square,用于控制学习率,也考虑了所有的Gradient,但不考虑Gradient的方向,只考虑Gradient的大小。
至此,optimization已经全部讲完。
- 作者:铃溪
- 链接:https://lingxi.mozzai.top/article/deb8830f-81b2-4c63-b179-8023728b7412
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章