深度学习优化算法总结与实验

  深度学习优化算法最耳熟能详的就是GD(Gradient Descend)梯度降低,而后又有一个所谓的SGD(Stochastic Gradient Descend)随机梯度降低,其实仍是梯度降低,只不过每次更新梯度不用整个训练集而是训练集中的随机样本。梯度降低的好处就是用到了当前迭代的一些性质,以致于总能较快找到驻点。而像遗传算法等智能优化算法,则是基于巨大的计算资源上的。它们并不使用函数特性,一般须要“种群”几乎遍及整个参数空间才能进行有效的优化,更像是一种暴力搜索。而由于神经网络参数量太大,几百万维的参数量不可能让种群达到“密布”(即便每一个维度两个“个体”,种群规模也是2的百万次幂),因此神经网络优化一般都用基于梯度降低的算法。算法

  如今,神经网络优化经常使用的都是梯度降低算法的变体,下面介绍Momentum, RMSProp, Adam这三种最经常使用的。它们都对梯度降低的某些不足作出了改进。网络

Momentum 

  Momentum是动量的意思。它对每次迭代进行平滑处理,以致于不会像GD同样,当梯度很大时一会儿跳地太远,在梯度较小时又跳得太少。定义很简单,就比GD多了一步:函数

$V_t = \beta V_{t-1} + (1-\beta) \nabla \theta_t$学习

$\theta_{t+1} = \theta_t - \eta V_t$优化

  其中$\theta_t$表示第$t$次迭代的参数张量,$\nabla \theta_t$表示关于它的梯度。$\eta$是模型学习率。$\beta$是平滑因子,也就是积累梯度的权重,越大则以前的梯度对当前影响越大,越小则这次迭代的梯度对当前影响越大,而等于0时Momentum就退化成GD了。$V_{t-1}$表示第$t$步迭代之前累积的梯度动量。blog

  相较GD,加上平滑的概念之后,Momentum会更加注重优化的全局性,这是由于它每次迭代都取决于以前全部梯度的加权和。拿跑步来举例,GD的每一步都是当前地面坡度最陡的方向,而Momentum则是添加了惯性,每一步都将跑步速度向坡度最陡的方向调整。资源

RMSProp

  RMSProp改进了GD的摆动幅度过大的问题,从而加快收敛速度。迭代式以下:深度学习

$\begin{gather}S_t = \beta S_{t-1} + (1-\beta)( \nabla \theta_t)^2 \label{}\end{gather}$ast

$\begin{gather}\displaystyle \theta_{t+1} = \theta_t - \eta \frac{\nabla \theta_t}{\sqrt{S_t}+\varepsilon}||\sqrt{S_t}||\label{}\end{gather}$效率

  $(1)$式中的$( \nabla \theta_t)^2$和$(2)$式中的分式分别表示按元素进行的平方操做和除法操做。$(2)$式中的$\varepsilon$是为了防止除数为0而设置的较小数,它和张量$S_t$执行的加法就是把它加到$S_t$的每一个元素。$||\sqrt{S_t}||$是二范数(我本身加的,为了不梯度值改变太大,能够无视)。

  按迭代式能够看出,RMSProp对梯度的方向进行了较弱的规范化,让梯度的每个元素向单位值1或-1靠近,这样一来,优化时的摆动幅度就会减少一些。而又为了避免至于靠得太近而直接变成全1和-1,用于规范化的是以前梯度平方的累积量而不是直接用当前梯度的平方。固然,若是$\beta=0$,那就是当前梯度的平方来规范化了,这样一来,每次更新方向的每一个元素值就都是1和-1了。下面来分析各类状况。

  如下是分别用GD、Momentum、RMSProp对二元函数$z = x^2+10y^2$进行优化的例子。初始点位于$(250,-150)$,学习率为0.02,Momentum和RMSProp的$\beta$都为0.9。它们分别迭代了11三、7八、65次:

  能够看出RMSProp少走了不少弯路,路线更平缓。Momentum虽然比GD多走不少弯路,可是迭代的次数仍是有所下降的。可是,当把初始点改为$(350,1)$时,EMSProp的表现就不太好了,三者的迭代次数分别为12二、7八、293:

  这回Momentum迭代效率最高(次数最少),反而是RMSProp走了不少弯路迭代次数也多效率最低,这是由于梯度张量的各个元素都向1和-1靠近的缘故。

Adam

  以上介绍的两个优化算法在不一样的起始位置彷佛各有优缺点,而Adam就是将Momentum和RMSProp的优点结合起来的算法。下面是迭代式: 

$\begin{gather}V_t =\beta_1 V_{t-1} + (1-\beta_1) \nabla \theta_t\label{}\end{gather}$

$\begin{gather}S_t =\beta_2 S_{t-1} + (1-\beta_2)( \nabla \theta_t)^2 \label{}\end{gather}$

$\begin{gather}\hat{V_t} =\frac{V_t}{1-\beta_1^t}\label{}\end{gather}$

$\begin{gather}\hat{S_t} =\frac{S_t}{1-\beta_2^t} \label{}\end{gather}$

$\begin{gather}\theta_{t+1} = \theta_t - \eta \frac{\hat{V_t}}{\sqrt{\hat{S_t}}+\varepsilon}\left\|\sqrt{\hat{S_t}}\right\|\label{}\end{gather}$

  Adam实际上就是前面两个算法的简单结合,但能够发现它多除了一个$1-\beta^t$($\beta^t$表示$\beta$的$t$次方),这是为了让开始的几回更新不至于过小(由于乘了$1-\beta$)。随着迭代日后,$1-\beta^t$接近于1。

  下面对以上算法作个比较。依旧是对二元函数$z = x^2+10y^2$进行优化,初始点位于$(250,-150)$,学习率为0.02。Momentum和RMSProp的$\beta=0.9$,Adam的$\beta_1=0.9$,$\beta_2=0.999$。Adam的迭代次数为207,另外三个算法迭代次数没变:

  Adam绕得厉害,迭代次数也比另外三个算法多。把$\beta1$改为0.5后,Adam的迭代次数变为了40:

  $\beta1$越小,Adam是越退化为RMSProp的。若是设置$\beta1=0$退化为RMSProp,迭代次数又上升到了61(比上面的RMSProp效率高是由于$\beta2=0.999$而不是$0.9$)。说明不一样状况下Adam的参数设置会直接影响迭代效率。

  总的来讲,Adam就是加上动量的同时,又使用了规范化,让每次迭代能用上以前的梯度,而且更新步伐的每一个元素稍微靠近1和-1一些。而这样有什么好处,只能实践出真知。

总结

  这些基于梯度降低的优化算法都大同小异,它们在不一样状况下发挥时好时坏,有的改良算法在某些状况下效果可能比原始的GD还差。因此选择优化算法仍是要视状况而定,咱们应该选择对高几率状况优化效果好的算法。另外,我上面用迭代次数来比较算法的优劣性不够严谨,由于不一样算法每次迭代的计算量都不一样。像Adam的计算量差很少是Momentum和RMSProp的两倍,若是要严谨,仍是得用计算时间做比较。

相关文章
相关标签/搜索