深度学习之优化算法
深层神经⽹络的参数学习主要通过梯度下降法来寻⼀组可以最⼩化结构风险的参数。在具体实现中,梯度下降法可以分为:批量梯度下降、随机梯度下降和⼩批量梯度下降三种形式。
⽽对于这三种梯度下降的⽅法,⼜可以从调整学习率、调整负梯度两个⽅向来进⾏改进,⽐如RMSprop,Momentum和Adam。
这⾥介绍⽐较常⽤的⼩批量梯度下降,以及⾃适应调整学习率和梯度⽅向优化的两种算法。
⼀、⼩批量梯度下降(MBGD)
批量梯度下降(Batch Gradient Descent,BGD)是每次都⽤训练数据集中所有的样本去计算梯度,⽽随机梯度下降(Stochastic Gradient Descent,SGD)则每次都⽤⼀个样本去计算梯度,⽽⼩批量梯度下降(Mini Batch Gradient Descent,MBGD)则介于⼆者之间,是深度学习中通常采⽤的做法。
批量梯度下降的缺点是,在训练深层神经⽹络时,训练数据集的规模⼀般⽐较⼤,如果每次迭代都计算整个训练集上的梯度,这需要消耗⾮常⼤的计算资源。此外,⼤规模训练集中的数据通常⽐较冗余,也没有必要使⽤整个训练集计算梯度。
随机梯度下降的缺点是,噪⾳⽐较多,更新过于频繁,会造成损失函数的严重震荡;⽽且并不是每次迭代都向着整体最优⽅向迈进,虽然训练速度快,但是准确性下降,并不是全局最优。
那么⼩批量梯度下降的做法是,令f(x, θ)表⽰⼀个深层神经⽹络,θ为⽹络参数,在使⽤⼩批量梯度下降进⾏优化时,每次选取K个训练样本{(x1, y1), (x2, y2), ..., (x K, y K)}。则第t次迭代时损失函数关于参数θ的偏导数为:
其中L(•)是可微分的损失函数,K称为批量⼤⼩(batch size)。则按照如下公式来更新梯度:
为了更有效地训练深层神经⽹络,在标准的⼩批量梯度下降⽅法的基础上,可以从以下两个⽅⾯进⾏改进:学习率衰减和梯度⽅向优化。这两种改进优化⽅法也同样可以⽤于批量梯度下降算法和随机梯度下降算法上。
但是⼩批量梯度下降也有两个⽐较突出的问题:
1、对所有的参数更新使⽤同样的学习率
对于稀疏数据或者特征,有时我们可能想对出现频率低的特征更新快⼀些,对于常出现的特征更新慢⼀些。
2、不能保证很好的收敛性
学习率如果选择太⼤,收敛速度会很慢,⽽如果太⼤,损失函数会在极⼩值处震荡或偏离。对于⾮凸函数,还可能陷⼊局部极⼩值或者鞍点处。
⼆、学习率衰减
从梯度下降算法的经验上看,学习率在⼀开始要保持⽐较⼤些来保证收敛速度,在收敛到最⼩点附近要⼩点以避免来回震荡。因此,⽐较直接的学习率调整可以通过学习率衰减的⽅式来实现。
⽽学习率衰减⼜分为:
(1)固定衰减率的调整学习率⽅法:逆时衰减、指数衰减、⾃然指数衰减。
(2)⾃适应地调整学习率的⽅法:AdaGrad、RMSprop,AdaDelta。
正则化是结构风险最小化策略的实现1、固定衰减率的学习率调整⽅法
假设初始化学习率为α0,在第t次迭代时的学习率为αt,固定衰减率的⽅法设置为按迭代次数衰减。
⽐如逆时衰减:
指数衰减:
⾃然指数衰减:
其中β为衰减率,⼀般取值为0.96。
2、⾃适应调整学习率的⽅法
在标准的梯度下降⽅法中,每个参数在每次迭代时都使⽤相同的学习率。⽽⾃适应调整学习率的⽅法是根据不同参数的收敛情况分别设置学习率,因为每个参数的的维度上收敛速度都不相同。
(1)AdaGrad算法
AdaGrad(Adaptive Gradient)算法是借鉴L2正则化的思想,每次迭代时⾃适应地调整每个参数的学习率。在第t次迭代时,先计算每个参数梯度平⽅的累计值:
gΤ表⽰第Τ次迭代时的梯度,梯度平⽅是按元素进⾏乘积。AdaGrad算法的参数更新值为:
其中α为初始的学习率,ε是为保持数值稳定⽽设置的⾮常⼩的常数。在AdaGrad算法中,如果某个参数的偏导数累计⾮常⼤,其学习率相对⽐较⼩;相反则⽐较⼤;但整体上随着迭代次数增加,学习率逐渐缩⼩。
(2)RMSprop算法
RMSprop(Root Mean Square prop )算法可以在某些情况下避免AdaGrad算法中学习率不断单调下降以⾄于过早衰减的缺点。RMSprop算法⾸先计算每次迭代梯度g t平⽅的指数衰减移动平均:
其中β为衰减率,⼀般取值为0.9。RMSprop算法的参数更新差值为:
RMSprop算法和AdaGrad算法的区别在于G t的计算由累积的⽅式变成了指数衰减移动平均。在迭代中,每个参数的学习率不是呈衰减趋势,⽽是可以变⼩也可以变⼤。
(3)AdaDelta算法
AdaDelta算法也是AdaGrad算法的⼀个改进。和RMSprop算法类似,AdaDelta算法通过梯度平⽅的指数衰减移动平均来调整学习率,⽽它的创新在于引⼊了每次参数更新之差Δθ的平⽅的指数衰减权移动平均。
在第t次迭代时,⾸先计算⼀个参数更新差Δθt的指数衰减权移动平均:
则AdaDelta算法的参数更新差为:
其中G t的计算⽅法和RMSprop算法⼀样,ΔX2t-1是参数更新差Δθt的指数衰减权移动平均。
AdaDelta算法将RMSprop算法中的初始学习率α改为了动态计算的,在⼀定程度上平抑了学习率的波动。
三、梯度⽅向优化
除了调整学习率之外,还可以通过使⽤最近⼏轮迭代的平均梯度来替代当前时刻的梯度,来作为当前参数更新的⽅向。在⼩批量梯度下降中,如果每次选取样本的数量⽐较⼩,那么损失会呈现震荡下降的形态。有效缓解梯度下降中震荡的⽅式是通过⽤梯度的移动平均来代替每次的实际梯度,并提⾼优化速度,这就是动量法。
1、动量法
在物理中,⼀个物体的动量是指这个物体在它运动⽅向上保持运动的趋势,是物体的质量和速度的乘积。动量法(Momentum Method)是⽤之前积累动量来代替真正的梯度,每次迭代的梯度可以看做是加速度。
动量法在第 t次迭代时,计算负梯度的加权移动平均作为参数的更新⽅向:
其中ρ为动量因⼦,通常设为0.9,α是学习率。
这样,每个参数的实际更新差值取决于最近⼀段时间内梯度的加权平均值。当某个参数在最近⼀段时间内的梯度⽅向不⼀致时,其真实的参数更新幅度变⼩;相反,当在最近⼀段时间内的梯度⽅向都⼀致时,其真实的参数更新幅度变⼤,起到加速作⽤。⼀般⽽⾔,在迭代初期,梯度⽅法都⽐较⼀致,动量法会起到加速作⽤,可以更快地到达最优点。在迭代后期,梯度⽅法会不⼀致,在收敛值附近震荡,动量法会起到减速作⽤,增加稳定性。
2、Nesterov加速梯度
Nesterov加速梯度(Nesterov Accelerated Gradient,NAG),是⼀种对动量法的改进。在动量法中,
实际的参数更新⽅向Δθt为上⼀步的参数更新⽅向Δθt-1和当前的梯度-g t的叠加。⽽NAG的改进在于,把当前的梯度-g t(θt-1),修正为损失函数在(θt-1+ρΔθt-1)上的负梯度:-g t(θt-1+ρΔθt-1)。
则参数更新的⽅向为:
3、Adam算法
Adam算法(Adaptive Moment Estimation,⾃适应动量估计)可以看作是动量法和 RMSprop 的结合,不但使⽤动量作为参数更新⽅向,⽽且可以⾃适应地调整学习率。
Adam 算法⼀⽅⾯计算梯度平⽅ g t2的指数加权平均(和 RMSprop 类似),⽤于⾃适应地调整学习率,另⼀⽅⾯计算梯度g t的指数加权平均(与动量法类似),作为参数调整⽅向。
其中β1 和β2 分别为两个移动平均的衰减率,通常取值为β1 = 0.9,β2 = 0.99 。
M t可以看作是梯度的均值(⼀阶矩), G t可以看作是梯度的未减去均值的⽅差,假设M0= 0, G0= 0,那么在迭代初期M t和G t的值会⽐真实的均值和⽅差要⼩。特别是当β1 和β2 都接近于1时,偏差会很⼤。因此,需要对偏差进⾏修正。
Adam算法的参数更新值为:
其中学习率α通常设为0.001,并且也可以按照迭代次数t进⾏衰减,⽐如:
4、梯度截断法
在深层神经⽹络中,除了梯度消失外,梯度爆炸是影响学习效率的主要因素。在基于梯度下降的优化过程中,如果梯度突然增⼤,⽤⾮常⼤的梯度进⾏参数更新,反⽽会导致其远离最优点。
为了避免这种情况,当梯度⼤于⼀定阈值时,就对梯度进⾏截断,称为梯度截断(gradient clipping)。
梯度截断具体的做法就是,把梯度的模限定在⼀个区间内,当梯度的模⼩于或者⼤于这个区间时就进⾏截断。⼀般截断的⽅式有两种:
(1)按值截断
在第t次迭代时,梯度为g t,给定⼀个区间[a,b],如果⼀个参数的梯度⼩于a时,就将其设为a;如果⼤于b时,就将其设为b。
(2)按模截断
按模截断是将梯度的模截断到⼀个给定的截断阈值b。
截断阈值 b 是⼀个超参数,也可以根据⼀段时间内的平均梯度来⾃动调整。
四、如何选择合适的优化算法
如果数据是稀疏的,在意更快的收敛,并且需要训练较深较复杂的⽹络时,推荐使⽤学习率⾃适应的优化⽅法,即 AdaDrad, AdaDelta, RMSprop, Adam。
RMSprop, AdaDelta, Adam 在很多情况下的效果是相似的,Adam 就是在 RMSprop 的基础上加了动量法,随着梯度变得稀疏,Adam ⽐RMSprop 效果会好。
整体来讲,Adam 是最好的选择。
五、总结
优化⽅法⼤体上可以分为两类:⼀是调整学习率,使得优化更稳定;⼆是调整梯度⽅向,优化训练速度。常见的优化算法整理如下:
参考资料:
1、邱锡鹏:《神经⽹络与深度学习》

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。