动量法(momentum)
-
动量法是
对梯度进行
优化,类比物理中动量的概念,在梯度更新时,不仅考虑当前位置的梯度,还需要一定程度参考过去的趋势
总梯度 = “惯性” + 当前梯度 总梯度 = “惯性”+当前梯度 总梯度=“惯性”+当前梯度 -
动量法使用平滑过的梯度对权重更新
x t + 1 = x t − η m t \begin{aligned} \mathbf{x}_{t+1} &=\mathbf{x}_{t}-\eta m_t \end{aligned} xt+1=xt−ηmt
其中 m t m_t mt 为动量法平滑过的梯度-
pytorch标准动量法
m t = β m t − 1 + ∇ f ( x t ) x t + 1 = x t − η ( β m t − 1 + ∇ f ( x t ) ) m_t = \beta m_{t-1} + \nabla f\left(\mathbf{x}_{t}\right) \\ \mathbf{x}_{t+1} =\mathbf{x}_{t}-\eta (\beta m_{t-1} + \nabla f\left(\mathbf{x}_{t}\right)) mt=βmt−1+∇f(xt)xt+1=xt−η(βmt−1+∇f(xt)) -
指数加权平均动量法
m t = β m t − 1 + ( 1 − β ) ∇ f ( x t ) x t + 1 = x t − η ( ( 1 − β ) ∇ f ( x t ) ) m_t = \beta m_{t-1} + (1-\beta)\nabla f\left(\mathbf{x}_{t}\right)\\ \mathbf{x}_{t+1} =\mathbf{x}_{t}-\eta ((1-\beta)\nabla f\left(\mathbf{x}_{t}\right)) mt=βmt−1+(1−β)∇f(xt)xt+1=xt−η((1−β)∇f(xt))
β \beta β 常见取值[0.5,0.9,0.95,0.99]
其中指数加权平均动量法的目的是对梯度方向、大小进行平均,平滑梯度,避免震荡
-
拐点
拐点
:当目标点从起点下降到拐点时,如果是原始梯度下降,梯度为0,则梯度不更新了,但是使用动量法,由于在先前下降的过程中累计了部分正向的梯度,因此虽然当前位置的梯度为0,但是经过修正后的梯度并不为0,可以帮助目标点轻松通过拐点
缓坡
-
缓坡
: 进入缓坡区域的时候,在原始梯度下降,假设“缓坡”斜率为0.001,且我们给一个较大的学习率0.1,那么每一步走0.0001,假设缓坡长度为10个单位,则走完该“缓坡”需要10万步;
x t + 1 = x t − 0.1 ∗ 0.001 \mathbf{x}_{t+1}=\mathbf{x}_{t}-0.1*0.001 xt+1=xt−0.1∗0.001
使用动量法,让我们在初始位置将积累 的梯度清零,设置 β = 0.9 \beta=0.9 β=0.9,学习率还是为0.1,缓坡斜率依然为0.001,长度为10个单位标准动量法
, m t = 0.9 m t − 1 + 0.0001 m_t = 0.9m_{t-1} + 0.0001 mt=0.9mt−1+0.0001
x t + 1 = x t − 0.1 ∗ m t \mathbf{x}_{t+1} =\mathbf{x}_{t}-0.1*m_t xt+1=xt−0.1∗mt
给定递推关系:
m t = 0.9 m t − 1 + 0.001 m_t = 0.9 m_{t-1} + 0.001 mt=0.9mt−1+0.001-
齐次解:
特征方程 ( r = 0.9 ),齐次解为 ( m_t^{(h)} = C \cdot 0.9^t )。 -
特解:
设常数特解 ( m_t^{§} = A ),代入得:
A = 0.9 A + 0.001 ⟹ A = 0.01 A = 0.9 A + 0.001 \implies A = 0.01 A=0.9A+0.001⟹A=0.01 -
通解:
( m_t = C \cdot 0.9^t + 0.01 )。
由初始条件 ( m_0 = 0 ) 得 ( C = -0.01 ),故:
m t = 0.01 ( 1 − 0. 9 t ) m_t = 0.01 (1 - 0.9^t) mt=0.01(1−0.9t) -
化简为目标形式:
( 0.01 = 10^{-2} = 10^{-3} \cdot 10 ),因此:
m t = 1 0 − 3 ⋅ 10 ( 1 − 0. 9 t ) m_t = 10^{-3} \cdot 10 (1 - 0.9^t) mt=10−3⋅10(1−0.9t)
最终结果:
m t = 1 0 − 3 ⋅ 10 ( 1 − 0. 9 t ) m_t = 10^{-3} \cdot 10 (1 - 0.9^t) mt=10−3⋅10(1−0.9t)
随着速度的增加,目标点最多会被加速到原始速度的10倍,在第t步时走过路程的表达式如下
S t = 1 0 − 3 ∗ ( t + 1 ) − 0.01 ( 1 − 0. 9 t + 1 ) S_t = 10^{-3} * (t+1)-0.01(1-0.9^{t+1}) St=10−3∗(t+1)−0.01(1−0.9t+1)
即
m t = 1 0 − 3 ⋅ 10 ( 1 − 0. 9 t ) S t = 1 0 − 3 ∗ ( t + 1 ) − 0.01 ( 1 − 0. 9 t + 1 ) m_t = 10^{-3} \cdot 10 (1 - 0.9^t)\\ S_t = 10^{-3} * (t+1)-0.01(1-0.9^{t+1}) mt=10−3⋅10(1−0.9t)St=10−3∗(t+1)−0.01(1−0.9t+1)最终相较于原始梯度下降需要的10w步,大约t = 1w时, S t = 9.991 S_t = 9.991 St=9.991,就走完了缓坡
指数加权平均动量法
m t = 0.9 m t − 1 + 0.1 ∗ 0.001 m t = 1 0 − 4 ∗ 10 ∗ ( 1 − 0. 9 t ) S t = 1 0 − 4 ( t + 1 ) − 1 0 − 3 ( 1 − 0. 9 t + 1 ) m_t = 0.9m_{t-1}+0.1*0.001\\ m_t = 10^{-4}*10*(1-0.9^t)\\ S_t = 10^{-4}(t+1)-10^{-3}(1-0.9^{t+1}) mt=0.9mt−1+0.1∗0.001mt=10−4∗10∗(1−0.9t)St=10−4(t+1)−10−3(1−0.9t+1)
随着步数的增加,梯度值会趋近于斜率值,不会进一步变大,走完10个单位扔需要10w步指数加权平均动量法的目的是对梯度方向、大小进行平均,平滑梯度,避免震荡,因此对单方向的长缓坡场景并没有明显的加速效果
-
局部极小值
-
局部极小值
在经过下坡时,因为经过之前的缓坡已经积累了部分梯度值,并且在下坡区间仍然会积累正方向的梯度,所以当到达局部极小值的时候,虽然梯度为0但仍然会向前继续运动,之后虽然会有负方向的梯度抵消之前的功力
但只要先前积累的正向梯度没有消耗殆尽,就可以冲出上坡区域,从而逃离局部极小值位置
悬崖
-
复杂地形:悬崖
标准动量法
:由于每一步都完整贴加了当前梯度,因此较难缓解跳崖问题,甚至由于叠加了过去累计的正向梯度,导致出现更严重的跳崖现象指数加权平均的动量法
,由于当前梯度只有一部分被考虑进来,因此在悬崖边整体梯度并不会迅速变大,但如果后续几部的梯度也较大,整体的梯度也会快速变大,导致任然会发生跳崖现象,只不过产生了一定的滞后
最值点
-
最小值点附近
当目标点从左侧调到右侧时,由于保留了正向的梯度,叠加上目标点此时的负梯度,整体会削弱向左跳跃的动力,避免了在终点两边反复横跳的现象