深度学习第一讲:梯度下降算法

主要引自:An overview of gradient descent optimization algorithms

梯度下降主要的三种形式:

1. 批梯度下降

是在整个数据集上计算损失函数关于参数θ = θ − η · ∇θJ(θ),然后想着梯度相反的方向更新参数,学习率来决定每次更新的量。

\theta = \theta -\eta \cdot \bigtriangledown _{\theta }J(\theta )

 优点:对于凸函数可以收敛到全局最小值,非凸函数可以收敛到局部最小值。

 缺点:速度慢,占内存,无法在线更新模型。

2. 随机梯度下降

每次只更新一个样本xi,以及其对应标注yi。

\theta = \theta -\eta \cdot \bigtriangledown _{\theta }J(\theta ;x^{i};y^{i})

优点:减少了批下降算法的冗余计算,速度快,支持在线更新,由于其震荡性,有可能跳出局部最小值,找到更高的局部最小值

缺点:高震荡性,收敛变得困难。但如果在迭代中逐渐缩小学习率,也可达到批梯度下降收敛效果。

3. 小批量梯度下降

结合了批梯度下降和随机梯度下降。通过计算一个小批量的样本的损失函数(大概50-256),来更新参数。

\theta =\theta -\eta \cdot \bigtriangledown _{\theta }J(\theta ;x^{(i:i+n)};y^{(i:i+n)})

优点:降低了随机梯度下降算法参数更新的剧烈震荡,收敛效果更好,且有效利用了高度优化的矩阵运算工具。

问题与挑战:

  • 很难选择合适的学习率,小学习率收敛缓慢,大学习率会震荡甚至发散
  • 预定学习率衰减方法需要提前定义好,无法针对训练样本量身定做
  • 所有参数更新使用同样的学习率,更好的方式是针对数据稀疏性有对应不同的学习率
  • 训练时容易困在“鞍点”附近

随机梯度下降优化算法:

1. Momentum

动量法主要针对图a这种情况,图a中参数更新一直在竖直方向来回震荡,在水平上更新缓慢。而我们更期望的是,在水平方向上能够快速下降。所以这里引用了Momentum这一思想,就是在水平方向上,由于梯度一直是一个方向,就可以累积速度,使得水平方向上梯度下降速度增加;但在竖直方向上由于每次更新梯度方向相反,相互抵消掉了。就像从山上推下去一个球,球会越滚越快。所以就会达到b中类似的效果。

 

深度学习第一讲:梯度下降算法_第1张图片

动量法的基本原理就是在当前参数更新向量上增加前一次参数更新向量的一部分。

v_{t} = v_{t-1} + \eta \bigtriangledown _{\theta }J(\theta )

\theta =\theta -v_{t}

优点:动量项会在梯度符号一致的方向上不断积累,而梯度符号改变的方向上相互抵消,这帮助我们降低震荡从而加快迭代收敛速度。一般动量取值0.9。

缺点:由于动量过大,更新幅度过大,从而导致在进阶最优解的时候停不下来,在最优解附近会来回震荡几次,需要很长时间才能得到最优解。

2. Nesterov accelerated gradient

 为了改进动量法的缺点,让算法有个先验证。就是先看看下一步梯度的方向是哪里,那这一步更新就朝着那个方向更新。

深度学习第一讲:梯度下降算法_第2张图片

 

蓝线是动量法的更新路线,动量法先计算当前梯度(短蓝线),然后沿着累积梯度方向做一个大幅度参数更新(长蓝线)。但是Nesterov方法则在前一次累积梯度作大幅度更新(棕色向量),然后计算梯度(红色向量),并进行修正(绿色向量)。真实更新就是绿色向量部分。

v_{t} = \gamma v^{_{t-1}} + \eta \bigtriangledown _{\theta }J(\theta -\gamma v_{t-1})

\theta =\theta -v_{t}

3. Adagrad

Adagrad可以根据参数重要性来调整学习率的方法。对于常常更新的参数具有更小的学习率,而对于很少得到更新的参数使用较大的学习率。所以这种方法很适合稀疏性很强的数据集。 

我们用​g_{i,t}b表示目标函数在第t次迭代时,关于参数\theta _{i}的梯度

g_{i,t} = \bigtriangledown _{\theta }J(\theta _{i})

SGD中对于\theta _{i}在第t次的更新如下:

\theta _{t+1, i} = \theta _{t,i} - \eta \cdot g_{i,t}

而在Adagrad在每一次更新时,都是针对每一个参数,利用这个参数以往的方向导数值来动态调整它的学习率。

\theta _{t+1,i} = \theta _{t,i} - \eta / (\sqrt{G_{t,ii}+\varepsilon }) \cdot g_{t,i}

其中G_{t}是一个对角矩阵,存放着第t次迭代为止,目标函数在\theta _{i} 方向上的导数的平方和。

G_{t,ii} = \sum g_{i,t}^{2}

优点:不需要手动调整学习率,大部分算法直接使用默认值0.01就好

缺点:作为分母的平方和G累积逐渐增大,会导致学习率单调衰减,知道接近无限小,无法继续更新。

4. RMSprop

RMSprop将Adagrad中的平方和用移动平均来替代。

E[g^{2}]_{t} =\gamma E[g^{2}]_{t-1} + (1-\gamma )g_{t}^{2 } 

其中E[g^{2}]_{t}表示第t次迭代时g^{2}的移动平均。如上的更新方法只取决于前一项的平均和当前的梯度。

\gamma类似于动量项,类似动量法的做法,我们把\gamma定义为0.9左右。

那么参数更新就按照如下方式进行:

\theta _{t+1} = \theta _{t} - \eta /(\sqrt{E[g}^{2}]_{t} + \varepsilon })\cdot g_{t}

优点:用平均移动取代了Adagrad的平方和,利于计算,并解决Adagrad学习率逐渐衰减无法更新的问题。

缺点:参数更新值\Delta \theta的单位与\theta本身不匹配(之前的几种方法同样存在这个问题)。

\Delta \theta =\theta _{t+1} - \theta _{t} = -\eta /(\sqrt{E[g^{2}]_{t}+\varepsilon }) \cdot g_{t}

5. Adadelta

 为了解决参数更新值\Delta \theta的单位与\theta本身不匹配问题,定义了一个新的指数衰减均值,这一次使用的参数更新值的平方,而不是梯度的平方。

E[\Delta \theta ^{2}]_{t} = \gamma E[\Delta \theta ^{2}]_{t-1} + (1-\gamma )\Delta \theta _{t}^{2}

参数更新方法如下:

\theta _{t+1} = \theta _{t} - (\sqrt{E[\Delta \theta ^{2}]_{t-1}+\varepsilon }/\sqrt{E[g ^{2}]_{t}+\varepsilon } ) \cdot g_{t}

也就是替换RMSprop方法中:

\eta =\sqrt{E[\Delta \theta ^{2}]_{t-1}+\varepsilon }

优点:学习率会自动更新,不需要默认的学习率。

6. Adam

Adaptive Moment Estimation这种方式结合了Momentum记录梯度本身指数衰减均值m_{t}和Adadelta记录的梯度平方的指数衰减均值v_{t}:

m_{t} = \beta _{1}m_{t-1} + (1-\beta _{1})g_{t}

v_{t}=\beta _{2}v_{t-1}+(1-\beta _{2})g_{t}^{2}

m_{t}v_{t}分别是梯度的一阶(均值)和二阶(方差)矩估计,所以称为Adaptive Moment Estimation。因为m_{t}v_{t}初始化为0向量,这两者在训练中都存在向零方向的偏差的问题,在训练初期尤为严重。

所以作者就用无偏化估计来取代上述的矩估计:

\widehat{m_{t}} = m_{t} / (1-\beta _{1}^{t})

\widehat{v_{t}} = v_{t}/(1-\beta _{2}^{t})

参数更新方法如下:

\theta _{t+1} = \theta _{t}-\eta /(\sqrt{\widehat{v_{t}}}+\varepsilon )\cdot \widehat{m_{t}}

其中\beta _{1}\beta _{2}\varepsilon分别为0.9,0.999,1e-8. 这也是现今训练最常见的优化算法。

你可能感兴趣的:(深度学习)