深度学习优化方法

一   三种梯度下降法

训练神经网络模型时,最常用的就是梯度下降,这里总结三种梯度下降法的概念及优缺点。有不当之处望指正。

参考博客:几种梯度下降方法对比(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. 指数加权平均

指数加权平均是处理时间序列的常用工具,基本思想是认为当前数据与前面的数据有关

公式:V_{t}=\beta V_{t-1}+(1-\beta )\theta _{t}=\beta^tV_{0}+(1-\beta)(\theta_{t}+\beta\theta_{t-1}+...+\beta^{t-2}\theta_{2}+\beta^{t-1}\theta_{1})

\theta_{t},t=1,2,...,n是已给数据,可以看出拟合的数据V_{t}\theta _{t},\theta _{t-1},...,\theta _{1}的关于\beta的指数级加权平均(且是指数衰减函数,即越前面的数,指数权重越小,影响越小)

                         

V_{t}近似是前\frac{1}{1-\beta }个数的平均数: 当\beta较大时,\frac{1}{1-\beta }较大,即前面更多的数据对当前数据有影响(或者说,当前数据是前面更多数据的平均数,做了平均处理),因此拟合曲线更平滑

但是指数加权平均不能很好地拟合前部分的数据,因为之前说过,V_{t}近似是前\frac{1}{1-\beta }个数的平均数,但前\frac{1}{1-\beta }个数据只能算前面所有数据(少于\frac{1}{1-\beta }个)的和除以\frac{1}{1-\beta }作为平均数,这显然不合理,除数偏大(说的比较啰嗦,具体可以看上述网址)

因此,修正为带偏差修正的指数加权平均(bias correction in exponentially weighted average):

                                                     V_{t}=\beta V_{t-1}+(1-\beta )\theta _{t} 

                                                            V_{t}=\frac{V_{t}}{1-\beta _{t}}

1. 动量(momentum)

使用SGD训练参数时,有时候会下降的非常慢,并且可能会陷入到局部最小值中,如下图所示(图片来自李宏毅《一天搞懂深度学习》)。

                                       

动量的引入就是为了加快学习过程,特别是对于高曲率、小但一致的梯度,或者噪声比较大的梯度能够很好的加快学习过程。动量的主要思想是积累了之前梯度指数级衰减的移动平均(前面的指数加权平均),下面用一个图来对比下,SGD和动量的区别:

                                    

根据向量加减特点,最直观的理解就是,若当前的梯度方向与累积的历史梯度方向一致,则当前的梯度会被加强,从而这一步下降的幅度更大。若当前的梯度方向与累积的梯度方向不一致,则会减弱当前下降的梯度幅度。

用一个图来形象的说明下上面这段话(图片来自李宏毅《一天搞懂深度学习》):

                                      

动量(momentum)的公式:

                                                                

β的值越大,则之前的梯度对现在的方向影响越大。ββ \betaβ一般取值为0.5, 0.9, 0.99。ng推荐取值0.9。
这个公式是ng的在Coursera课上给出的。

2.  Nesterov Momentum

Nesterov Momentum是对Momentum的改进,可以理解为nesterov动量在标准动量方法中添加了一个校正因子

缺点:速度很慢,\nabla_\theta\sum_iL(f(x^{(i)};\theta + \alpha v),y^{(i)})计算这个相当于又要把fp、bp走一遍(不太懂)

3.  AdaGrad(Adaptive Gradient)

算法的思想是:每一次更新参数时(一次迭代),不同的参数使用不同的学习率

                                                      

显然,Gt是前t个梯度的平方和

从公式中我们能够发现:
优点:对于梯度较大的参数,Gt​相对较大,则\frac{\alpha }{\sqrt{G_t }+ \varepsilon }​较小,意味着学习率会变得较小。而对于梯度较小的参数,则效果相反。这样就可以使得参数在平缓的地方下降的稍微快些,不至于徘徊不前。
缺点:由于是累积梯度的平方,到后面 Gt累积的比较大,会导致梯度\frac{\alpha }{\sqrt{G_t }+ \varepsilon }\rightarrow 0,导致梯度消失。

关于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多用了\Delta \theta的平方的指数加权平均】

6. Adam(Adaptive Moment Estimation)

Adam实际上是把momentum和RMSprop结合起来的一种算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值