版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cdknight_happy/article/details/85239050
本文作为对https://blog.csdn.net/cdknight_happy/article/details/84835809的补充。
1 mini-batch梯度下降算法
批梯度下降法持续收敛,但每一轮迭代的计算太耗时;随机梯度下降使用单个样本计算损失,波动较大;mini-batch进行以小batch为单位的梯度下降,既可以利用向量化带来的计算优势,又可以避免随机梯度下降过程中太大的波动。
选择合适的mini-batch大小,mini-batch梯度下降的速度会优于批梯度下降和随机梯度下降。
如何选择合适的mini-batch大小?
- 如果处理的是小规模的训练集(m < 2000),则直接使用批梯度下降;
- 如果处理的是大规模的训练集,则可以设置mini-batch的大小为64,128,256,512,一般设置为
2n。
划分mini-batch之前一般先对训练集进行shuffle操作。
2 指数加权平均
vt=βvt−1+(1−β)θt,则相当于是取前
1−β1个值的指数加权平均。
指数加权平均展开可得:
vt=∑i=0t−1(1−β)βiθt−i,由于
(1−ϵ)ϵ1≈e1,而下降到
e1之下的项一般也就不予考虑,因此,用
1−ϵ代替
β,那么就有当
i>1−β1之后就不予考虑。因此,指数加权平均就相当于是取当前值的前
1−β1个值的指数加权平均。
实现:
vt=0
Repeatly{
get next θt
vt:=βvt+(1−β)θt
}
指数加权平均的实现只占用单行的内存,相比于存储前面
1−β1个值再进行取平均操作,大大降低了内存占用。
偏差修正:
偏差修正解决的是指数加权初期计算值小于应取值的问题。如下图中的绿色曲线和紫色曲线所示。
假设
β=0.9,由于
v0=0,则有:
v1=0.98v0+0.02θ1=0.02θ1
v2=0.9v1+0.02θ2=0.98∗0.02θ1+0.02θ2
假设
θ1、θ2都为正值,则
v1,v2是远小于
θ1、θ2的。也就出现了指数加权的起始位置的值远小于当前采集值。
解决办法是使用偏差修正,即使用
1−βtvt代替
vt。 这样做,在 t 较小时,
βt接近于
β,则起到了对
vt进行放大的作用,随着 t 的增大,
βt逐渐接近于0,偏差修正的影响越来越小。也就是从上图的紫线变成了绿线。
3 动量梯度下降
动量梯度下降,也就是带momentum的梯度下降算法,收敛速度几乎总是快于mini-batch梯度下降算法。其实现的核心思想就是计算梯度的指数加权平均,并用其进行参数更新。
梯度下降中的波动如下图所示:
沿着y轴的波动减慢了算法的收敛过程,因此,我们期望的是减缓在y轴方向上的移动,而增加在x轴方向上的移动。
指数加权平均是求当前值的前
1−β1个值的平均值,由于相邻次迭代在y轴方向的震荡幅度非常接近且符号相反,因此,使用指数加权平均则减弱了y轴方向上的震荡,同时增加了x轴方向上的前进速度。
momentum的实现是:
在第 t 次迭代中:
计算基于当前mini-batch的梯度
dW,db
vdw=βvdw+(1−β)dW
vdb=βvdb+(1−β)db
参数更新:
dw=dw−αvdw
db=db−αvdb
一般在使用momentum的时候,不会使用偏差修正。
多了一个超参数
β,一般设置
β=0.9。
4 RMSprop
RMSprop的核心思想是:
计算基于当前mini-batch的梯度
dW,db
Sdw=β2Sdw+(1−β2)dW2
Sdb=β2Sdb+(1−β2)db2
参数更新:
dw=dw−αSdw
+ϵdW
db=db−αSdb
+ϵdb
核心思想是,对于波动较大的参数,除以其平方根,减弱其波动;对于波动较大的参数,除以其平方根,放大其移动速度。从而减弱波动,起到加速训练过程的目的,同时也允许了使用较大的学习率进行模型的训练过程。
5 Adam
Adam = Momentum + RMSprop
既考虑了一阶矩,又考虑了二阶矩。
Adam的核心思想:
初始化
vdw=0,vdb=0,Sdw=0,Sdb=0 。
在第 t 轮迭代中:
计算基于当前mini-batch的梯度
dW,db
vdw=β1vdw+(1−β1)dW
vdb=β2vdb+(1−β1)db
Sdw=β2Sdw+(1−β2)dW2
Sdb=β2Sdb+(1−β2)db2
修正:
vdwcorrected=1−β1tvdw,vdb=1−β1tvdb
Sdwcorrected=1−β2tSdw,Sdb=1−β2tSdb
参数更新:
W:=W−αSdwcorrected
+ϵvdwcorrected
b:=b−αSdbcorrected
+ϵvdbcorrected
Adam广泛适用于各类神经网络。
推荐参数:
β1=0.9,β2=0.999,ϵ=10−8。
6 学习率衰减
为什么要进行学习率衰减?
随着学习过程的进行,如果保持恒定大小的学习率,模型训练后期在接近最优解的地方损失函数会存在反复震荡,无法收敛到真正的最优解;若适当减小学习率,则可以逐步接近最优解而不会造成震荡。因此,学习率衰减有助于模型收敛到最优解。
一个epoch(e pa k)表示训练样本集中所有的训练样本都参与了一次模型训练过程。
常用的学习率衰减策略:
α=1+decay_rate∗epoch_num1∗α0,训练的epoch越多,学习率越小;
指数衰减:
α=(0.95)epoch_num∗α0;
离散下降:经过一定的训练epoch数目后,学习率减半。
学习率衰减对加速模型训练具有较大的作用。
7 神经网络的局部最优问题
局部最优点
鞍点:saddle point,一个方向上的局部最小点,另一个方向上的局部最大点。
在高维空间中,局部极小点事实上远少于鞍点的数量。
另一个问题是高原(plateaus)会大大减缓模型的训练速度。plateaus是一个平坦区域,其中大量的区域梯度接近于0,因此使用梯度下降法进行训练时收敛速度相当慢。
总结下,在深度神经网络中:
- 训练过程中不大可能卡在局部最优解;
- 平稳区域会使得模型的训练过程比较缓慢,因为波动比较大,而使用动量、RMSprop、Adam可以使得参数尽快移动出平坦区域,从而加速训练过程。
8 作业
在大数据集上,momentum一般会由于mini-batch梯度下降法;但是,在小数据集上,可能momentum和mini-batch梯度下降法效果相当,特别是部分mini-batch的确难以拟合时。
Adam无论在大小数据集上,总是收敛的较快,并且算法需要的内存较小、除学习率外使用默认超参数就可以取得很好的模型训练加速的效果。
Adam可以作为深度神经网络训练中首选的最优化算法。