天天看点

优化算法 - Momentum 动量 - 梯度下降 - 缓解山谷与鞍点的影响

优化算法 - Momentum 动量 - 梯度下降 - 缓解山谷与鞍点的影响

        • Momentum
        • Nesterov
  • Momentum

    为了解决梯度下降在山谷震荡或者鞍点处停滞的问题,出现了 Momentum 方法。

    如果单纯的梯度下降遇到山谷地形,两边较为陡峭,而在最小值方向上梯度很小,那么根据梯度下降的原理,梯度只根据当前所在位置计算梯度,那么梯度的主要方向将会是左右,只会以很小的梯度更新最小值方向,导致了山谷震荡现象,增加了到最小值的迭代次数。

    如果在鞍点处,因为当前所在位置的周围非常平缓,Error 值非常接近,导致梯度近乎为 0,致使无法更新,训练停滞。

    那么如果加入Momentum 动量项,相当于在梯度下降中加入了惯性,这种情况下梯度的计算不单单依据当前所在位置,而是仍然具有之前的梯度量。那么一旦遇到了山谷地形,那么按照之前的梯度速度,在最小值方向上仍然具有一定的梯度,所以会更加快速的迭代到最小值。再看鞍点的情况,此时所在的是平坦地带,梯度为 0,但因为存在动量项,相当于在此时具有一定的初始速度,所以可以依靠“惯性”冲过平坦地带,进而向最小值更新。

    v t = γ v t − 1 + η ∇ θ L ( θ t − 1 ) v_t=γv_{t-1}+η\nabla_θL(θ_{t-1}) vt​=γvt−1​+η∇θ​L(θt−1​)

    θ t + 1 = θ t − v t θ_{t+1}=θ_t-v_t θt+1​=θt​−vt​

    其中 γ v t − 1 γv_{t-1} γvt−1​ 即为 Momentum 项, v v v 是速度,而 γ γ γ 则是衰减系数,如果没有这个那么最终速度会累加的越来越大,加入后作为“阻力”出现,使得速度最终可以收敛。

    动量项除了可以提供一个“此时初速度”以外,还有其他功用:

    1. 当某维的梯度方向不变时,可以加大更新幅度,使得学习的更快;
    2. 当某维的梯度方向发生改变时,例如在山谷两侧来回震荡时,它可以抵消改变量,从而减小震荡加快收敛。
    ( γ γ γ 值一般设定为 0.9)
  • Nesterov

    Nesterov 在 Momentum 基础上进行了修改:

    v t = γ v t − 1 + η ∇ θ L ( θ t − 1 − γ v t − 1 ) v_t=γv_{t-1}+η\nabla_θL(θ_{t-1}-γv_{t-1}) vt​=γvt−1​+η∇θ​L(θt−1​−γvt−1​)

    θ t + 1 = θ t − v t θ_{t+1}=θ_t-v_t θt+1​=θt​−vt​

    区别便是在求梯度时是对 L ( θ t − 1 − γ v t − 1 ) L(θ_{t-1}-γv_{t-1}) L(θt−1​−γvt−1​) 求导得到的,而不是 L ( θ t − 1 ) L(θ_{t-1}) L(θt−1​).

    θ t − 1 − γ v t − 1 θ_{t-1}-γv_{t-1} θt−1​−γvt−1​ 相当于是在 θ t − 1 θ_{t-1} θt−1​ 的基础上又进行了一步近似迭代,是利用“未来”已经更新后的参数来计算现在的梯度(参数决定了所处的位置,也相当于利用未来要到达的位置计算当前的梯度)。

    Nesterov 方法中梯度的计算,即利用了过去的信息(惯性速度),又利用了未来的信息(近似未来的位置),非常有趣!

利用 Momentum 以及 Nesterov 方法,我们基本可以很好地解决山谷、鞍点和局部最小点等情况下的梯度问题,那么接下来要解决的便是如何自适应学习速率的问题。

继续阅读