深度学习最优化(四)—— 动量法/Nesterov/Adagrad/Adadelta/RMSprop/Adam/Nadam

1. SGD

现在的SGD一般都指小批量梯度下降,即每一次迭代计算mini-batch的梯度,然后对参数进行更新。

               g_{t}= \triangledown _{\theta_{t-1}}J(\theta_{t-1})

              \triangle \theta _t = -\eta \ast g_t

              \theta _t = \theta _{t-1}+\triangle \theta _t

其中\theta _t是模型参数,J(\theta _{t-1})是模型目标函数,g_t是目标函数的梯度,\eta是学习率。

难点(缺点):

          (1)学习率的选择。过低收敛缓慢,过高无法收敛。

          (2)“之字形”的出现,即在陡谷(一种在一个方向的弯曲程度远大于其他方向的表面弯曲情况)处震荡。如下图所示

深度学习最优化(四)—— 动量法/Nesterov/Adagrad/Adadelta/RMSprop/Adam/Nadam_第1张图片

2. 动量法(Momentum)

               m_t=\mu \ast m_{t-1}-\eta g_t

               \theta _t = \theta _{t-1}+m _t

其中m_t是一阶动量,\mu是动量因子。

优点:改善“之字形”震荡,动量项在梯度指向方向相同的方向逐渐增大,对梯度指向改变的方向逐渐减小(不断中和)。

3. Nesterov

我们使用\mu \ast m_{t-1}来移动\theta,通过计算\theta_{t-1}+\mu \ast m_{t-1},我们能够得到一个下次参数位置的近似值——也就是能告诉我们参数大致会变为多少。那么,通过基于未来参数的近似值而非当前的参数值计算相得应罚函数J(\theta_{t-1}+\mu \ast m_{t-1})并求偏导数,我们能让优化器高效地「前进」并收敛:

               m_t=\mu \ast m_{t-1}-\eta \triangledown J(\theta _{t-1}+\mu \ast m_{t-1})

               \theta _t = \theta _{t-1}+m_t

4. Adagrad

解决学习率的选择问题,对学习率进行自适应约束。

               n_t = n_{t-1}+g_t^2

              \triangle \theta _t = -\frac{\eta }{ \sqrt{n_t+\varepsilon }}\ast g_t

              \theta _t = \theta _{t-1}+\triangle \theta _t

其中\varepsilon是个很小的数,为了确保分母不为0,n_t是梯度平方的累积,为二阶动量。

优点:不需要手工调节学习率。

缺点:随着时间的增长,n_t单调增长,\triangle \theta _t单调减少,有可能过早的变为0,训练过早的结束。而且依然依赖与人工设定的学习率。

5. RMSprop

由于AdaGrad单调递减的学习率变化过于激进,RMSprop只关注过去一段时间的梯度平均值,离的时间越远越不重要。

               n_t = \beta_2 n_{t-1}+(1-\beta_2 )g_t^2

              \triangle \theta _t = -\frac{\eta }{ \sqrt{n_t+\varepsilon }}\ast g_t

              \theta _t = \theta _{t-1}+\triangle \theta _t

6. Adadelta

RMSprop依然需要自己设定全局学习率,因此Adadelta在RMSprop的基础上,用参数更新的平方来替代全局学习率的位置,这样就可以省略全局学习率了。

               n_t = \beta_2 n_{t-1}+(1-\beta_2 )g_t^2

               V_t = \gamma V_{t-1}+(1-\gamma )\triangle\theta _t^2

              \triangle \theta _t = -\frac{ \sqrt{V_t+\varepsilon}}{ \sqrt{n_t+\varepsilon }}\ast g_t

              \theta _t = \theta _{t-1}+\triangle \theta _t

7. Adam

融合一阶动量和二阶动量。

               m_t=\beta_1 m_{t-1}+(1-\beta_1) g_t

               n_t = \beta_2 n_{t-1}+(1-\beta_2 )g_t^2

因为当m_tn_t一开始被初始化为 0 时,最初的几步通常会偏向0,表示参数更新太慢。

他们使用偏差纠正系数,来修正一阶矩和二阶矩的偏差:

               \hat{m_t}=\frac{m_t}{1-\beta_1^t}

               \hat{n_t}=\frac{n_t}{1-\beta_2^t}

              \triangle \theta _t = -\eta \ast \frac{\hat{m_t} }{ \sqrt{\hat{n_t}+\varepsilon }}

              \theta _t = \theta _{t-1}+\triangle \theta _t

8. Nadam

Nesterov + Adam = Nadam

公式还没完全理解先不放了。

不知道算是原创还是转载,放上几篇参考网址吧:

              https://zhuanlan.zhihu.com/p/22252270

              https://www.cnblogs.com/shixiangwan/p/7532858.html

              https://zhuanlan.zhihu.com/p/32230623

你可能感兴趣的:(优化问题,深度学习)