一 三种梯度下降法
训练神经网络模型时,最常用的就是梯度下降,这里总结三种梯度下降法的概念及优缺点。有不当之处望指正。
参考博客:几种梯度下降方法对比(Batch gradient descent、Mini-batch gradient descent 和 stochastic gradient descent)
概念 | 优 | 缺 | |
batch gradient descent | 一次迭代训练所有样本,计算全部样本的梯度 | 理想状态下(凸)经过足够多的迭代后可以达到全局最优 | 1. 数据量大时,无法将全部数据塞入内存使用 2. 每次迭代计算全部样本,计算量大,速度慢 |
mini-batch gradient descent | BGD和SGD的折中方案 每次用一部分样本(batchsize)来更新参数 batchsize=1->SGD batchsize=N->BGD 通常取2的幂,有利于GPU加速 | 折中BGD和SGD的优缺点,但最大的缺点是引入了一个超参:batchsize,需要调参 | |
stochastic gradient descent | 每次只训练一个样本去更新参数 | 1. 解决BGD大数据量无法一次性塞入内存(显存)的问题 2. 通常先shuffle数据,避免陷入局部最优 | 每次只用一个样本来更新参数,会导致不稳定性较高,可能在最优点震荡 |
注:目前深度学习模型中使用的SGD就是mini-batch gradient descent
二 优化方法
参考网址:深度学习中优化方法——momentum、Nesterov Momentum、AdaGrad、Adadelta、RMSprop、Adam
(这篇博客写的很详细,这里基于此加上个人理解做个总结)
目前常见的优化方法有momentum、Nesterov Momentum、AdaGrad、Adadelta、RMSprop、Adam,它们的基础是指数加权平均(Exponentially weighted average)
0. 指数加权平均
指数加权平均是处理时间序列的常用工具,基本思想是认为当前数据与前面的数据有关
公式:
是已给数据,可以看出拟合的数据是的关于的指数级加权平均(且是指数衰减函数,即越前面的数,指数权重越小,影响越小)
近似是前个数的平均数: 当较大时,较大,即前面更多的数据对当前数据有影响(或者说,当前数据是前面更多数据的平均数,做了平均处理),因此拟合曲线更平滑
但是指数加权平均不能很好地拟合前部分的数据,因为之前说过,近似是前个数的平均数,但前个数据只能算前面所有数据(少于个)的和除以作为平均数,这显然不合理,除数偏大(说的比较啰嗦,具体可以看上述网址)
因此,修正为带偏差修正的指数加权平均(bias correction in exponentially weighted average):
1. 动量(momentum)
使用SGD训练参数时,有时候会下降的非常慢,并且可能会陷入到局部最小值中,如下图所示(图片来自李宏毅《一天搞懂深度学习》)。
动量的引入就是为了加快学习过程,特别是对于高曲率、小但一致的梯度,或者噪声比较大的梯度能够很好的加快学习过程。动量的主要思想是积累了之前梯度指数级衰减的移动平均(前面的指数加权平均),下面用一个图来对比下,SGD和动量的区别:
根据向量加减特点,最直观的理解就是,若当前的梯度方向与累积的历史梯度方向一致,则当前的梯度会被加强,从而这一步下降的幅度更大。若当前的梯度方向与累积的梯度方向不一致,则会减弱当前下降的梯度幅度。
用一个图来形象的说明下上面这段话(图片来自李宏毅《一天搞懂深度学习》):
动量(momentum)的公式:
β的值越大,则之前的梯度对现在的方向影响越大。ββ \betaβ一般取值为0.5, 0.9, 0.99。ng推荐取值0.9。
这个公式是ng的在Coursera课上给出的。
2. Nesterov Momentum
Nesterov Momentum是对Momentum的改进,可以理解为nesterov动量在标准动量方法中添加了一个校正因子。
缺点:速度很慢,计算这个相当于又要把fp、bp走一遍(不太懂)
3. AdaGrad(Adaptive Gradient)
算法的思想是:每一次更新参数时(一次迭代),不同的参数使用不同的学习率
显然,Gt是前t个梯度的平方和
从公式中我们能够发现:
优点:对于梯度较大的参数,Gt相对较大,则较小,意味着学习率会变得较小。而对于梯度较小的参数,则效果相反。这样就可以使得参数在平缓的地方下降的稍微快些,不至于徘徊不前。
缺点:由于是累积梯度的平方,到后面 Gt累积的比较大,会导致梯度,导致梯度消失。关于AdaGrad,goodfellow和bengio的《deep learning》书中对此的描述是:在凸优化中,AdaGrad算法具有一些令人满意的理论性质。但是,在实际使用中已经发现,对于训练深度神经网络模型而言,从训练开始时累积梯度平方会导致学习率过早过量的减少。AdaGrad算法在某些深度学习模型上效果不错,但不是全部。
4. Adadelta
Adadelta是对Adagrad的改进,主要是为了克服Adagrad的两个缺点(摘自Adadelta论文《AdaDelta: An Adaptive Learning Rate Method》):
the continual decay of learning rates throughout training
the need for a manually selected global learning rate
为了解决第一个问题,Adadelta只累积过去w窗口大小的梯度,其实就是利用前面讲过的指数加权平均,公式如下:
根据前面讲到的指数加权平均,比如当 ρ=0.9 时,则相当于累积前10个梯度。
为了解决第二个问题,Adadelta最终的公式不需要学习率 α。
5. RMSprop(root mean square prop)
[root mean square: 平方-> 均值 -> 开根]
RMSprop也是对Adagrad的扩展,以在非凸的情况下效果更好。和Adadelta一样,RMSprop使用指数加权平均(指数衰减平均)只保留过去给定窗口大小的梯度,使其能够在找到凸碗状结构后快速收敛。
【由算法可以看到,Adadelta比RMSprop多用了的平方的指数加权平均】
6. Adam(Adaptive Moment Estimation)
Adam实际上是把momentum和RMSprop结合起来的一种算法