美文网首页
机器学习 | 优化——动量优化法(更新方向优化)

机器学习 | 优化——动量优化法(更新方向优化)

作者: 0与1的邂逅 | 来源:发表于2019-11-22 18:03 被阅读0次

    写在前面:

    小批量梯度下降 中,如果每次选取样本数量比较小,损失会呈现震荡的方式下降。

    (本文的)动量是模拟物理中的概念。一般而言,一个物体的动量指的是这个物体在它运动方向上保持运动的趋势,是物体的质量和速度的乘积。

    当我们将一个小球从山上滚下来,没有阻力时,它的动量会越来越大(速度越来越快),但是如果遇到了阻力,速度就会变小。动量优化法 就是借鉴此思想,使得梯度方向在不变的维度上,参数更新变快,梯度有所改变时,更新参数变慢,这样就能够 加快收敛并且减少动荡

    动量优化法是用之前 积累动量 来替代真正的梯度,每次迭代的梯度可以看作是 加速度,包括 MomentumNesterov 两种算法。

    1. Momentum算法:

    momentum算法思想:参数更新时在一定程度上保留之前更新的方向,同时又利用当前batch的梯度微调最终的更新方向,简言之就是通过积累之前的动量来加速当前的梯度。

    下面一张图可以很直观地表达Momentum算法的思想。举个简单例子,假设上次更新时梯度是往前走的,这次更新的梯度算出来是往左走,这变化太剧烈了,所以我们来做个折中,往左前方走。感觉上,像是上次更新还带有一定的惯性。

    ——图片来源:https://blog.csdn.net/tsyccnh/article/details/76270707

    先给出一些符号规定,​J(θ)为代价函数,θ为参数,η为学习率,v_t表示走了前t步所积累的动量和,γ是动量因子(上图中的0.9倍就是动量因子)。

    初始时v_0=0,动量因子γ通常设置为0.9。

    ① A->B:
    A点为起始点,首先计算A点的梯度∇_{θ_A}​J(θ),然后下降到B点。

    • v_1​=γv_0+η∇_{θ_A}​J(θ)=η∇_{θ_A}​J(θ)
    • θ_{new}​=θ−η∇_{θ_A}​J(θ)=θ−v_1

    ② B->C:
    B点作为新的起始点,计算出B点的梯度∇_{θ_B}​J(θ),然后下降到C点。

    • v_2=γv_1+η∇_{θ_B}​J(θ)
    • θ_{new}=θ−v_2

    这样一步一步(迭代)下去,带着初速度的小球就会极速的奔向谷底。

    • v_t=γv_{t-1}+η∇_{θ}​J(θ)
    • θ_{new}=θ−v_t

    Momentum算法的优点:

    当某个参数在最近一段时间内的梯度方向不一致时,其真实的参数更新幅度变小;相反,当在最近一段时间内的梯度方向都一致时,其真实的参数更新幅度变大,起到加速作用。

    一般而言,在迭代初期,梯度方向都比较一致,动量法会起到加速作用,可以更快地到达最优点。在迭代后期,梯度方向会取决不一致,在收敛值附近震荡,动量法会起到减速作用,增加稳定性。从某种角度来说,当前梯度叠加上部分的上次梯度,一定程度上可以近似看作二阶梯度

    ——参考:邱锡鹏:《神经网络与深度学习》

    2. Nesterov 加速梯度:

    Nesterov 加速梯度(Nesterov Accelerated Gradient,NAG),也叫 Nesterov 动量法(Nesterov Momentum),是对Momentum算法的一种改进,可以看成是Momentum算法的一种 变体

    动量法每下降一步都是由前面下降方向的一个累积和当前点的梯度方向组合而成。于是一位大神(Nesterov)就开始思考,既然每一步都要将两个梯度方向(历史梯度、当前梯度)做一个合并再下降,那为什么不先按照历史梯度往前走那么一小步,按照前面一小步位置的“超前梯度”来做梯度合并呢?

    如此一来,小球就可以先不管三七二十一先往前走一步,在靠前一点的位置看到梯度,然后按照那个位置再来修正这一步的梯度方向。如此一来,有了超前的眼光,小球就会更加“聪明”。

    还是老样子,先给出一张图片,直观感受以下NAG算法的思想。举个简单例子,假设小球上次是往前走了10米,这次小球先往前走2米,然后再来观察下一步怎么走,可以认为是分两步更新了\theta

    ——图片来源:https://blog.csdn.net/tsyccnh/article/details/76673073

    先给出一些符号规定,​J(θ)为代价函数,θ为参数,η为学习率,v_t表示走了前t步所积累的动量和,γ是动量因子(上图中的0.9倍就是动量因子)。

    初始时v_0=0,动量因子γ通常设置为0.9。

    ① A->B:
    A点为起始点,首先根据此时的梯度方向(A点的梯度方向)往前走 “一小步”γv_0=0,接着计算走一小步后的 新梯度∇_{θ_A}​J(θ-γv_0)=∇_{θ_A}​J(θ),下降到B点。
    (因为初始时v_0=0,所以相当于在A点并没有往A点的梯度方向先走“一小步”)

    • v_1​=γv_0+η∇_{θ_A}​J(θ-v_0)=η∇_{θ_A}​J(θ)
    • θ_{new}​=θ−η∇_{θ_A}​J(θ)=θ−v_1

    ② B->D:
    B点作为新的起始点,首先计算出B点的梯度方向,接着沿着B点梯度方向往前走 “一小步”γv_1,到达超前点C,然后计算出走了“一小步”后的 新梯度η∇_{θ_B}​J(θ-γv_1),下降到D点。

    −γv_1就是图中点B到点C的那一段向量,θ-γv_1就是C点的参数(坐标)。

    • v_2=γv_1+η∇_{θ_B}​J(θ-yv_1)
    • θ_{new}=θ−v_2

    这样一步一步(迭代)下去,带着初速度的小球就会极速的奔向谷底。

    • v_t=γv_{t-1}+η∇_{θ}​J(θ-γv_{t-1})
    • θ_{new}=θ−v_t

    3. 梯度截断:

    ——图片来源:邱锡鹏:《神经网络与深度学习》

    4. 小总结:

    看到这里,细心的读者可能会发现,标题中提到了更新方向优化,可是文中却没提及到。但是,如果仔细阅读,会发现其实早已涉及到了梯度更新方向的优化(改变)。

    更新方向优化,其对象就是当前的梯度(方向)。

    对于Momentum算法和NAG算法而言,更新方向优化,就是根据当前的梯度,进行适当的调整。

    对于梯度阶段这种方法而言,更新方向优化,就是根据当前的梯度和一些判断,从而确定梯度的去与留。相比于Momentum算法和NAG算法,这种方法更加的刚(强有力)。

    最后,再次附上Momentum算法和NAG算法的图片,两张放在一起看,就能很容易的看到两种算法的区别。

    Momentum算法 NAG算法

    tensorflow实现:

    1. Momentum算法
    tf.train.MomentumOptimizer(learning_rate=learning_rate,momentum=0.9)
    
    • learning_rate:学习率
    • momentum:动量因子
    1. NAG算法
      在Momentum算法基础上,设置 use_nesterov = True 即可。

    写在最后:

    参考资料:

    学无止境!!!

    相关文章

      网友评论

          本文标题:机器学习 | 优化——动量优化法(更新方向优化)

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