美文网首页
几种梯度下降方法

几种梯度下降方法

作者: 学术界末流打工人 | 来源:发表于2020-03-03 22:41 被阅读0次

    指数加权平均数 (Exponentially weighted average)

    v_t = \beta v_{t-1}+(1-\beta)\theta_t

    例如温度计算
    v_{t-1}是前一天的温度,\theta_t是今天的温度

    如果给定\beta为0.9,则图像为下图红线的结果

    𝛽 = 0.9 红线

    由于以后我们要考虑的原因,在计算时可视𝑣𝑡大概是 \frac 1 {(1−\beta)}的每日温度,如果𝛽是 0.9,为十天的平均值,则图像为下图的红线部分,如果增加给定\beta为0.98,也就是五十天的温度,则图像为下图的绿线。

    𝛽 = 0.98 绿线
    因为多平均了几天的温度,所以这个曲线的波动更小,曲线整体要平坦一些,缺点是曲线进一步右移
    当为0.98时,相当于给前一天的值加了太多的权重,只有0.02加给了当日的权重,所以温度变化时,温度上下起伏,当较大时,指数加权平均值适应地更缓慢一些。

    \beta为0.5时,仅做了两天的平均值,为途中黄线

    𝛽 = 0.5 黄线
    由于仅平均了两天的温度,平均的数据太少,所以得到的曲线有更多的噪声,有可能出
    现异常值,但是这个曲线能够更快适应温度变化。

    总结:往往中间有某个值效果最好,\beta为中间值时得到的红色曲线,比起绿线和黄线更好地平均了温度
    指数加权平均数公式的好处之一在于,它占用极少内存,电脑内存中只占用一行数字而已,然后把最新数据代入公式,不断覆盖就可以了,正因为这个原因,其效率,它基本上只占用一行代码,计算指数加权平均数也只占用单行数字的存储和内存,当然它并不是最好的,也不是最精准的计算平均数的方法。如果你要计算移动窗,你直接算出过去 10 天的总和,过去 50 天的总和,除以 10 和 50 就好,如此往往会得到更好的估测。但缺点是,如果保存所有最近的温度数据,和过去 10 天的总和,必须占用更多的内存,执行更加复杂,计算成本也更加高昂。

    指 数 加 权 平 均 的 偏 差 修 正 ( Bias correction in exponentially weighted averages)

    通过修正偏差可以让平均数运算更加准确。


    此图中等于0.9为红色的线,等于0.98为绿色的线,如果当0.98时不为绿色,反而为紫色的线该如何处理

    计算移动平均数的时候,初始化𝑣_0 = 0,𝑣1 = 0.98𝑣_0 + 0.02𝜃_1,但是𝑣_0 = 0,所以这部
    分没有了(0.98𝑣_0),所以𝑣_1 = 0.02𝜃_1,所以如果一天温度是 40 华氏度,那么𝑣_1 = 0.02𝜃_1 = 0.02 × 40 = 8,因此得到的值会小很多,所以第一天温度的估测不准。

    𝑣_2 = 0.98𝑣_1 + 0.02𝜃_2,如果代入𝑣1,然后相乘,所以𝑣_2 = 0.98 × 0.02𝜃_1 + 0.02𝜃_2 = 0.0196𝜃_1 + 0.02𝜃_2,假设𝜃_1𝜃_2都是正数,计算后𝑣_2要远小于𝜃_1𝜃_2,所以𝑣_2不能很好估测出这一年前两天的温度。

    有个办法可以修改这一估测,让估测变得更好,更准确,特别是在估测初期,也就是不𝑣_𝑡,而是用 \frac {𝑣_𝑡} {1−\beta^𝑡},t 就是现在的天数。举个具体例子,当𝑡 = 2时,1 − 𝛽^𝑡 = 1 − 0.98^2 = 0.0396,因此对第二天温度的估测变成了\frac {𝑣_2} {0.0396} = \frac {0.0196𝜃_1+0.02𝜃_2} {0.0396} ,也就是𝜃_1𝜃_2的加权平均数,并去除了偏差。你会发现随着𝑡增加,𝛽^𝑡接近于 0,所以当𝑡很大的时候,偏差修正几乎没有作用,因此当𝑡较大的时候,紫线基本和绿线重合了。不过在开始学习阶段,你才开始预测热身练习,偏差修正可以帮助你更好预测温度,偏差修正可以帮助你使结果从紫线变成绿线。

    在机器学习中,在计算指数加权平均数的大部分时候,大家不在乎执行偏差修正,因为大部分人宁愿熬过初始时期,拿到具有偏差的估测,然后继续计算下去。如果你关心初始时期的偏差,在刚开始计算指数加权移动平均数的时候,偏差修正能帮助你在早期获取更好的估测。

    动量梯度下降法(Gradient descent with Momentum)

    该算法的运行速度几乎总是快于标准的梯度下降算法,简而言之,基本的想法就是计算梯度的指数加权平均数,并利用该梯度更新你的权重,

    例如,如果你要优化成本函数,函数形状如图,红点代表最小值的位置


    其中梯度下降法要很多计算步骤,慢慢摆动到最小值,这种上下波动减慢了梯度下降法的速度,无法使用更大的学习率,如果要用较大的学习率(紫色箭头),结果可能会偏离函数的范围,为了避免摆动过大,要用一个较小的学习率。


    如果因为想消除纵轴上的这些摆动使得学习慢一点,但是在横轴上希望加快学习,加速从左向右移动,移到最小值。就要使用动量梯度下降法,需要在每次迭代中,换句话说在第t次迭代的过程中计算微分dW,db。也就是计算,也就是之前的,dW的移动平均数,接着同样的计算,,然后重新赋值权重,同样的,这样就可以减缓梯度下降的幅度。

    动量梯度下降法的一个本质,能够最小化碗状函数,这些微分项,提供了加速度。想象你有一个碗,你拿一个球,微分项给了这个球一个加速度,此时球正向山下滚,球因为加速度越滚越快,而因为𝛽 稍小于 1,表现出一些摩擦力,所以球不会无限加速下去,所以不像梯度下降法,每一步都独立于之前的步骤,你的球可以向下滚,获得动量,可以从碗向下加速获得动量。

    RMSprop(root mean square prop)

    该方法也可以加速梯度下降。

    上图回忆,梯度下降过程中横轴正在推荐,但是纵轴方向会有大幅度摆动,假设纵轴代表参数𝑏,横轴代表参数𝑊,可能有𝑊_1𝑊_2或者其它重要的参数,为了便于理解,被称为𝑏和W

    想减缓𝑏方向的学习,即纵轴方向,同时加快,至少不是减缓横轴方向的学习,RMSprop 算法可以实现这一点.


    在第𝑡次迭代中,该算法会照常计算当下 mini-batch 的微分𝑑𝑊,𝑑𝑏,所以我会保留这个指数加权平均数,我们用到新符号𝑆_{𝑑𝑊},而不是𝑣_{𝑑𝑊},因此𝑆_{𝑑𝑊} = \beta 𝑆_{𝑑𝑊} + (1 − \beta)𝑑𝑊^2,这个平方的操作是针对这一整个符号的,这样做能够保留微分平方的加权平均数,同样𝑆_{𝑑𝑏} = \beta 𝑆_{𝑑𝑏} + (1 − \beta)𝑑𝑏^2,再说一次,平方是针对整个符号的操作。

    接着 RMSprop 会这样更新参数值,W:=W-\alpha \frac {dW}{\sqrt{S_{dW}}}b:=b-\alpha \frac {db}{\sqrt{S_{db}}}. 因为我们希望学习速度快,在垂直方向也就是图中b方向,同时虚妄减缓纵轴的拍动,所以有了S_{dW}S_{db}我们希望S_{dW}会相对较小,所以我们要除以一个较小的数,而希望$S_{db}又较大,所以这里我们要除以较大的数字,这样就可以减缓纵轴上的变化。

    这些微分,垂直方向的要比水平方向的大得多,所以斜率在𝑏方向特别大,所以这些微分中,S_{db}较大,𝑑𝑊较小,因为函数的倾斜程度,在纵轴上,也就是 b 方向上要大于在横轴上,也就是𝑊方向上。𝑑𝑏的平方较大,所以S_{db}也会较大,而相比之下,𝑑𝑊会小一些,亦或𝑑𝑊平方会小一些,因此S_{dW}会小一些,结果就是纵轴上的更新要被一个较大的数相除,就能消除摆动,而水平方向的更新则被较小的数相除。

    RMSprop 的影响就是你的更新最后会变成这样(绿色线),纵轴方向上摆动较小,而横轴方向继续推进。还有个影响就是,你可以用一个更大学习率𝑎,然后加快学习,而无须在纵轴上垂直方向偏离。

    RMSpropMomentum 有很相似的一点,可以消除梯度下降中的摆动,包括mini-batch 梯度下降,并允许你使用一个更大的学习率𝑎,从而加快你的算法学习速度。


    References

    1. Deep Learning

    相关文章

      网友评论

          本文标题:几种梯度下降方法

          本文链接:https://www.haomeiwen.com/subject/aoxgchtx.html