Gradient Descent(机器学习之梯度下降法)
目录
Tip 1: Tuning your learning rates
Learning Rate
如果learning rate 比较大,即如绿色曲线,在左侧曲线就会直接跳过谷底,反映到Loss曲线上就会呈现,开始下降速度快,但很快就会卡住,不在下降。
如果learning rate 超级大,即如黄线,会直接飞出去了。
要调整到Just make 时才能刚刚好。
所以右侧的Loss图一定要画出 。
Adaptive Learning Rate (适应性学习率)
靠近目标是要减小 learning rate ,让它收敛在最低点
但仅仅有公式不可以,最好Giving different parameters (参数)different learning rates
AdaGrad算法
AdaGrad
对于每一个参数都用相同的学习率进行更新。
但是在实际应用中,各个参数的重要性肯定是不一样的,所以我们对于不同的参数要动态的采取不同的学习率,让目标函数更快的收敛。
: root mean square of the previous derivatives of parameter w,即参数w之前的导数的均方根。
即parameter dependent,每一个参数的learning rate都不一样
Contradiction
表明导数越大,参数越大
在分母上,表明导数越大参数越小
这是矛盾的。
How surprise it is?
直观解释
所以通过知道过去的gradient有多大,再相除,知道反差有多大。
更正式的解释
gradient值越大,离底部距离越大
但我们同时考虑多个参数时,以上论述就不一定成立了。
(注意:图中w1,w2没有标注错误)
二次微分2a在一次微分的分母上
分母上当然可以直接算二次微分,但是在很复杂的情况下,算二次微分花费的大量时间是不能承受的,所以Adagrad在没有增加任何额外运算的前提下,去估计二次微分的值。
Tip 2:Stochastic Gradient Descent(随机梯度下降法)
初始的式子其实是合理的,因为损失是整体训练的总和,但SGD想法不同,每次只拿一个出来,只算对一个example的loss即可。
(注意:只是将最外侧的求和去掉)
这样做的好处是:
原来的Gradient Descent,看完所有example才update一次参数,这是稳定的,如左侧小图,其实就是按照Gradient建议的方向来走。
但是如果用SGD,每看到一个example就update一次。如果只对于一次example,步伐可能是小的而且是散乱的,与大趋势不见得是一致的,但是因为可以看很多个example,所以Gradient Descent走一步,SGD可能已走了20步,所以SGD反而比较快。
Tip 3:Feature Scaling(特征缩放)
本来在左图的范围远比大,那我们就把其缩小,变成右图的样子,即使不同的特征具有相同的缩放比例。
那么为什么这么做呢?
对于Feature Scaling前的左侧小图,可以看到,变动对于y的影响很小,但变动对于y会造成较大影响。
所以坐标轴上,方向比较平缓,方向上比较陡峭。
对于Feature Scaling后的右侧小图,在坐标轴上和影响力差不多。
对于未Feature Scaling的两个方向差很多,同一组learning rate 很难搞定,但是有Scaling变成正圆形会很容易,可以直接指向圆心走。
how to do?
Theory(数学原理)
Question
Formal Derivation
我们很难在所有范围内找到最小点,但给定一个点,我们很容易找到附近值最小的点,然后依次更新。
Taylor Series
和一次的直线是很不吻合的,但在处趋势很像,而展开式高次影响很小,所以就只可以考虑展开式中一次的部分。
Back to Formal Derivation
在红圈范围内用泰勒级数对Loss函数做简化
泰勒展开在越小的范围内越精确,对应就是红色的圈圈要越小,而(Learning rate)与其半径成正比。故理论上,只有Learning rate无穷小,才能保证Loss越来越小,但实际上只要够小就可以了。
以上只考虑了泰勒展开的一次式,但考虑二次式,也是可以的,但这样的方法不见得更普及,因为要运算二次微分,会多很多运算,但这些运算在做Deep Learning时是无法承受的。
More Limitation of Gradient Descent
(1)会卡在Local minima,在Local minima参数的更新会停止。
(2)除此之外,在saddle point(鞍点)也会出现这样的问题.
但以上微分值为0的地方可能只是幻想,真正的问题在于,对于某一点,微分值很小,可能小于10-6,这已经很小了,你有可能就停下来了(因为很少真的算出微分为0),但是很小不见得接近Local minima,可能只是在一个plateau(高原)上,离Local minima其实很远。