梯度优化讲解

预防过拟合常用的方法有L1、L2正则化,Dropout 正则化、Data Augmentation、Early Stopping 等。

本文将重点介绍如何使用梯度优化来使神经网络训练更快更有效率。

mini-Batch 梯度下降

神经网络反向传播的过程需要使用梯度下降算法来优化网络参数,迭代更新。梯度下降算法做法是每次训练都使用全部 m 个训练样本(称为 Batch)。该做法的缺点是当m很大的时候,例如百万数量级训练时会影响运算速度,增加模型的训练时间。

为了解决这一问题,我们可将m个样本均匀分割成若干个子集,每个子集包含较少的样本数量。一般子集包含的样本数量为 64、128、256 等,较常使用 2 的幂数。这是因为计算机存储数据一般是 2 的幂,这样设置可以提高运算速度。然后,对每个子集依次进行训练。所有的子集都训练完成之后,可以说一次训练就完成了,我们称之为一次 epoch。这就是Mini-Batch 梯度下降算法。

例如总的训练样本数量m=320000,拆分成T=5000个子集,每个Mini-Batch包含样本的个数是64。

常说的迭代训练N次,是指包含N次epoch。每次epoch又进行T次Mini-Batch梯度下降。也就是说每次epoch都会把所有m个训练样本训练完毕,之后再进入第二次epoch。对于Mini-Batch梯度下降来说,每次epoch时最好随机打乱所有训练样本,再重新随机均匀分成T个Mini-Batch。这样更有利于神经网络进行准确的训练。

Batch梯度下降损失函数的下降过程是比较平滑的,但是Mini-Batch梯度下降损失函数略有震荡,但也是整体下降的。这是因为,Mini-Batch梯度下降每次更新都使用不同的Mini-Batch,模型有可能出现不同的表现。

说个极端的情况,当T=m,即每个Mini-Batch包含的样本数为1的时候,就成为了随机梯度下降算法(StachasticGradientDescent,SGD)。根据T的取值不同,就形成了Batch梯度下降、Mini-Batch梯度下降、随机梯度下降三种不同的算法。

Batch梯度下降的优化路径,Batch梯度下降会比较平稳地接近全局最小值,但因为使用了所有m个样本,每次前进的速度有些慢、时间也有些长。

Mini-Batch梯度下降的优化路径,Mini-Batch梯度下降每次前进速度较快,且振荡较小,基本能接近全局

最优值。

随机梯度下降的优化路径。随机梯度下降每次前进速度很快,但是路线曲折,有较大的振荡,最终会在最小值附近来回波动,难以真正达到全局最优值。

实际应用时,如果样本数量不是太大,例如m<2000,则三种梯度下降算法差别不大,可以直接使用Batch梯度下降。若样本数量很大时,则一般使用Mini-Batch梯度下降。每个Batch的Size可根据实际情况而定,一般不要太大也不要太小。

 

动量梯度下降(MomentumGD)

动量梯度下降算法是在每次训练时,对梯度进行指数加权平均处理,然后用得到的梯度值更新权重W和常数项b。它的速度要比传统的梯度下降算法快。

该算法的关键是对梯度进行了指数加权,权重W和常数项b的指数加权平均表达式如下:

 

 

滑动平均能让每次更新不会有太大的振荡。而且β越接近1,滑动平均的效果越明显,振荡越小。也就是说,当前的速度是渐变的,而不是瞬变的,这保证了梯度下降的平稳性和准确性,减少振荡,较快地达到最小值处。

下面来比较一下传统梯度下降与动量梯度下降算法的实际训练效果。

传统的梯度下降,传统的梯度下降优化路径是比较曲折的,振荡较大,尤其在W、b之间数值范围差别较大的情况下。每一点处的梯度只与当前方向有关,产生类似折线的效果,前进缓慢,达到全局最优解的耗时更多。

动量梯度下降算法,动量梯度下降算法对梯度进行指数加权平均,这样使当前梯度不仅与当前方向有关,还与之前的方向有关,这样的处理使梯度前进方向更加平滑,减少振荡,能够更快地到达最小值处。而

用Python实现动量梯度下降算法,代码示例如下:

dW=compute_gradient(W)

Vdw=beta*Vdw+dW

Vdb=beta*Vdb+db

W-=alpha*Vdw

b-=alpha*Vdb

NesterovMomentum

NesterovMomentum是MomentumGD的变种,与MomentumGD唯一区别就是,计算梯度的不同。NesterovMomentum先用当前的更新一遍参数,再用更新的临时参数计算新的梯度,相当于添加了矫正因子的MomentumGD。NesterovMomentum可以防止优化算法走得太快错过极小值,使其对变动的反应更灵敏。

NesterovMomentum除了速度较快之外,振荡也更小一些。

NesterovMomentum相应的Python示例代码如下:

dW=compute_gradient(W)

db=compute_gradient(b)

Vdw=beta*Vdw-alpha*dW

Vdb=beta*Vdb-alpha*db

W+=Vdw

b+=Vdb

AdaGrad

对每一个参数W和b的训练都使用了相同的学习因子α,AdaGrad能够在训练中自动的对α进行调整,对于出现频率较低参数采用较大的更新;相反,对于出现频率较高的参数采用较小的更新。因此,AdaGrad非常适合处理稀疏数据。

AdaGrad的做法是对从开始到当前迭代训练的所有参数进行平方和累计,设当前迭代次数为t,则梯度的平方和为:

 

这样使用参数更新公式:

 

其中,ε是常数,一般取1e-7,主要作用是防止分母为零。

AdaGrad的Python示例代码为:

dW=compute_gradient(W)

db=compute_gradient(b)

dW_squared+=dW*dW

db_squared+=db*db

W-=alpha*dW/(np.sqrt(dW_squared)+1e-7)

b-=alpha*db/(np.sqrt(db_squared)+1e-7)

 

RMSprop

RMSprop是GeoffHinton提出的一种自适应学习率方法。AdaGrad会累加之前所有的梯度平方,而RMSprop仅仅是计算对应的平均值,因此可缓解AdaGrad算法学习率下降较快的问题。每次迭代训练过程中,其权重W和常数项b的更新表达式为:

 

下面简单解释一下RMSprop算法的原理,令水平方向为W的方向,垂直方向为b的方向。水平方向振荡较小,而垂直方向振荡较大,则意识db要比dW大。在W和b的更新公式里,由于分母的存在,会消除彼此的这种差异性,从而减小振荡,实现快速梯度下降算法。总得来说,就是如果哪个方向振荡大,就减小该方向的更新速度。

RMSprop相应的Python示例代码为:

dW=compute_gradient(W)

db=compute_gradient(b)

Sdw=beta*Sdw+(1-beta)*dW*dW

Sdb=beta*Sdb+(1-beta)*db*db

W-=alpha*dW/(np.sqrt(Sdw)+1e-7)

b-=alpha*db/(np.sqrt(Sdb)+1e-7)

 

Adam

Adam(AdaptiveMomentEstimation)是另一种自适应学习率的方法。它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。相应的公式如下:

 

 

其中,t是当前迭代次数。Adam算法包含了几个超参数,分别是:α、β1、β2,ε。通常α设置为0.9,β1通常设置为0.999,β2通常设置为1e-7。一般只需要对β1和β2进行调试

实际应用中,Adam算法结合了动量梯度下降和RMSprop各自的优点,使得神经网络训练速度大大提高。

Adam相应的Python示例代码为:

dW=compute_gradient(W)

db=compute_gradient(b)

Vdw=beta1*Vdw+(1-beat1)*dW

Vdb=beta1*Vdb+(1-beta1)*db

Sdw=beta2*Sdw+(1-beta2)*dW*dW

Sdb=beta2*Sdb+(1-beta2)*db*db

Vdw_corrected=Vdw/(1-beta1**t)

Vdb_corrected=Vdb/(1-1-beta1**t)

Sdw_corrected=Sdw/(1-1-beta2**t)

Sdb_corrected=Sdb/(1-1-beta2**t)

W-=alpha*Vdw_corrected/np.sqrt(Sdw_corrected+1e-7)

b-=alpha*Vdb_corrected/np.sqrt(Sdb_corrected+1e-7)

 

降低学习因子

学习因子α决定了梯度下降每次更新参数的尺度大小,俗称步进长度。学习因子过大或过小,都会严重影响神经网络的训练效果。

那么,如何选择合适的学习因子呢?在神经网络整个训练过程中,使用固定大小的学习因子往往效果不好,一般的原则是随着迭代次数增加,学习因子应该逐渐减小。这种方法被称为LearningRateDecay。

下面讨论一下使用LearningRateDecay的原因。如下图所示,使用恒定的学习因子由于每次训练相同,在接近最优值处的振荡也大,在最优值附近较大范围内振荡,与最优值距离比较远。使用不断减小的随着训练次数增加,逐渐减小,步进长度减小,使得能够在最优值处较小范围内微弱振荡,不断逼近最优值。

LearningRateDecay有两种常用形式,第一种是ExponentialDecay,相应的表达式如下所示:

 

其中,k为可调参数,t为当前迭代次数。学习因子α呈指数衰减。

第二种是1/t Decay,相应的表达式如下所示:

 

其中,k为可调参数,t为当前迭代次数。

总结

本文主要介绍了神经网络中几种常见的梯度下降优化算法,包括Mini-Batch、Momentum、NesterovMomentum、AdaGrad、RMSprop、Adam、LearningRateDecay,并对各自特点进行了说明和对比。实际应用中应该根据具体情况选择合适的优化算法。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值