深度学习优化器的原理总结(SGD/SGD with momentum/Adagrad/AdaDelta/RMSProp/Adam/Nadam)

优化器的框架:

  1. 目标函数关于当前参数的梯度

     g_{t} = \triangledown f(w_{t});

  2. 根据历史梯度计算一阶动量与二阶动量:           

    m_{t} = \Phi (g_{1},g_{2},... ,g_{t});

    v_{t} = \Psi (g_{1},g_{2},... ,g_{t});

  3. 计算当前时刻的下降梯度:

    \eta_{t} = \frac{\alpha *m_{t}}{\sqrt{v_{t}}};

  4. 根据 \eta_{t} 更新参数:

    ​​​​​​​w_{t+1} = w_{t} - \eta _{t};

 

现在我们来一个个分析现有的优化器,如何套入以上的框架。

简单来说,它们的区别就在于m_{t}\eta _{t}的定义。

SGD

特点:没有使用动量,收敛慢,容易陷入局部极值。

因为SGD没有利用动量,那它的梯度更新m_{t} 直接等于g_{t}

m_{t} = g_{t};  没有利用动量

\eta _{t} = \alpha \cdot m_{t};

SGD with Momentum带动量的SGD

特点:利用了梯度的动量,收敛比SGD快

m_{t} = \beta \cdot m_{t-1} + (1-\beta )\cdot g_{t};利用了上一次到这一次的梯度的变化动量

\eta _{t} = \alpha \cdot m_{t};

SGD+Nesterov

g_{t} = \bigtriangledown f(w_{t} - \alpha \cdot m_{t-1}/\sqrt{v_{t-1}})

后面的跟SGD一样了。这里的g_{t}的更新原理利用了Nesterov,可以达到什么效果呢?

AdaGrad

特点:使用了二阶动量,可以自适应地调整步长,但是它的二阶动量是累计全部历史,可能会提前停止学习。

在第3步中,公式\eta_{t} = \frac{\alpha *m_{t}}{\sqrt{v_{t}}}中的v_{t}在这里的定义是:

v_{t}=\sum_{i=1}^{t}{g_i^2}.(从这个公式可以看出这里是累计的二阶动量的全部历史)

通常在\eta_{t} = \frac{\alpha *m_{t}}{\sqrt{v_{t}}}中添加平滑项\varepsilon\eta_{t} = \frac{\alpha *m_{t}}{\sqrt{v_{t}}+\varepsilon },当\sqrt{v_{t}}越大,则\eta _{t}越小,则容易引起提前停止学习。

AdaDelta/RMSProp

特点:使用了二阶动量,但是其更新方式跟AdaGrad有所不同,AdaGrad是累计了全部历史二阶动量,AdaDelta是累计了一部分。可以避免提前结束学习。

v_{t} = \beta \cdot v_{t-1} + (1-\beta )\cdot g_t^{2}  (这个公式是不是和SGD with momentum的更新公式类似呢)

Adam/Nadam

Adam结合了一阶动量与二阶动量,大大加速了收敛速度。

它的一阶动量更新方法跟SGD with momentum相同,即:

m_{t} = \beta_{1} \cdot m_{t-1} + (1-\beta_{1} )\cdot g_{t};利用了上一次到这一次的梯度的变化动量

它的二阶动量更新方式跟AdaGrad的相同,即:

v_{t} = \beta_{2} \cdot v_{t-1} + (1-\beta_{2} )\cdot g_t^{2}  (这个公式是不是和SGD with momentum的更新公式类似呢)

Nesterov+Adam = Nadam

它的更新方式就是在Adam的基础上,使用Nesterov来更新g_{t}​​​​​​​

g_{t} = \bigtriangledown f(w_{t} - \alpha \cdot m_{t-1}/\sqrt{v_{t-1}})

 

深度学习优化器的原理总结(SGD/SGD with momentum/Adagrad/AdaDelta/RMSProp/Adam/Nadam)_第1张图片

你可能感兴趣的:(deep-learning,算法,机器学习)