Mini-batch梯度下降法
什么是Mini-batch梯度下降法
在对整个训练集执行梯度下降法时,我们必须处理整个训练集,然后才能进行一步梯度下降法。然后需要再重新处理整个训练集才能进行下一步梯度下降法。如果在处理完整个训练集前先让梯度下降法处理一部分,算法的速度会更快。
我们可以把训练集分割为小一点的子训练集,这些子集被取名叫Mini-batch。对x的训练集和y的训练集都需作相应的拆分,分别使用符号x{t}和y{t}表示其中第t个子集。
我们来解释一下Mini-batch算法的名称。batch梯度下降法指的是前文讲过的梯度下降法算法,就是同时处理整个训练集,这个名字就来源于能够同时看到整个batch训练集的样本被处理。相比之下,Mini-batch梯度下降法每次处理的是单个的mini-batch,即x{t}和y{t},而不是同时处理全部的X和Y训练集。
Mini-batch下降法的原理
for t in range(1,5000)
#对x{t}和y{t}进行一步梯度下降算法。用向量化同时处理子集中的全部样本
#对x{t}执行前向传播
Z[1] = W[1]X{t}+b[1]
A[1] = g[1](Z[1])
…
A[L] = g[L](Z[L])
#计算成本函数J{t}
…
#执行反向传播来计算J{t}的梯度
…
W[L] = W[L] – αdW[L]
b[L]= b[L] -ad[L]
#以上是使用mini-batch梯度下降法训练样本的一步。使用batch一次遍历训练集只能做一个梯度下降,使用mini-batch一次遍历训练集就能做5000个梯度下降。
深入理解Mini-batch梯度下降法
使用batch梯度下降法时,每次迭代都需要遍历整个训练集,因此每次迭代的成本函数都会下降。使用Mini-batch梯度下降法,并不是每次迭代都是下降的,因为每次迭代都在训练不同的样本集或者说训练不同的mini-batch,成本函数走向朝下,但有很多噪声。
![](https://i-blog.csdnimg.cn/blog_migrate/13dc67ea5d92bbaeef6592b7223f8bc3.png)
Mini-batch中我们需要决定的变量之一是mini-batch,即训练子集的大小。我们选择的mini-batch的大小通常在1到m(训练集的大小)之间,1太小了,而m太大了。
mini-batch为m太大的原因是:mini-batch为m,则退化为batch梯度下降法。如果使用batch梯度下降法,mini-batch的大小为m,每个迭代需要处理大量的训练样本。它的主要弊端在于训练样本数量巨大的时候,单次迭代耗时太长。
mini-batch为1太小的原因是:mini-batch为1,则退化为随机梯度下降法。如果使用随机梯度下降法,会失去所有向量化带来的加速。因为一次性只处理了一个训练样本,这样效率过于低下。
在实际中,我们应该选择不大不小的mini-batch,这样做有两个好处。一方面,得到了大量向量化。如果mini-batch大小为1000个样本,就可以对1000个样本向量化。另一方面,我们不需要等待整个训练集被处理完就可以开始进行后续的工作。
选择mini-batch大小的指导原则
- 如果训练集较小(小于2000个样本),直接使用batch梯度下降法。
- 一般情况下,mini-batch大小为64到512。考虑到电脑内存设置和使用的方式,如果mini-batch大小是2的次方,代码运行地快一些。
- X{t}和Y{t}要符合CPU/GPU内存。
指数加权平均
![](https://i-blog.csdnimg.cn/blog_migrate/579a301862b8e62ce622041bce130b4c.png)
若要计算上述看起来有些杂乱无章的数据的趋势,也就是温度的局部平均值或者说移动平均值,我们需要做如下操作:
v0 = 0
v1 = 0.9v0 + 0.1θ1
…
vt = 0.9vt-1 + 0.1θt
![](https://i-blog.csdnimg.cn/blog_migrate/bfe97faabf70eebfed5bf570b96d2925.png)
完成上述操作后,我们得到了移动平均值,即每日温度的指数加权平均值。
我们可以把上述公式概括为:vt = βvt-1 + (1-β)θt。由于某些原因,在计算是可以把vt看作约等于1/(1-β)天的每日平均温度。如果β=0.9,那么就是十天的平均值;如果β=0.98,那么就是粗略平均了过去50天的温度。
![](https://i-blog.csdnimg.cn/blog_migrate/a4f7f23def80354a451b4790ca60ff11.png)
图中绿色曲线在温度变化时适应的更慢,会出现一定延迟,因为β=0.98相当于给前一天增加了过多权重,而只有0.02的权重给了当日。图中黄色曲线由于只平均了两天的温度,平均的数据太少,所以得到的曲线有更多的噪声,更有可能出现异常值,但这个曲线能够更快适应温度变化。
深入理解指数加权平均
V100 = 0.9v99 + 0.1θ100
= 0.1θ100 + 0.9 *(0.1θ99 + 0.9 v98)
= 0.1θ100 + 0.1 * 0.9θ99 + 0.1 *(0.9)2θ98 +…
上述函数是指数衰减函数。我们认为当β=0.9时,只关注了过去10天的温度。因为10天后,权重下降到不到当日权重的三分之一。
指数加权平均的偏差修正
偏差修正可以让平均数运算更加准确。
![](https://i-blog.csdnimg.cn/blog_migrate/8ace74d272f5399fbd7373ef9973e151.png)
当β=0.98的时候,我们得到的并不是绿色的曲线,而是紫色曲线。我们可以注意到紫色曲线的起点较低。因为算法中我们初始化使得v0=0,计算中实际v1=v0+0.02θ1=0.02θ1,所以估算值偏小、不准确。
有个办法可以修正这一估计,让估计变得更准确,特别是在估测初期。其做法是将vt替换成vt/(1-βt),其中t是当前的天数。随着t的增长,βt将接近0,因此当t较大的时候偏差修正就没有用了,紫线基本和绿线重合了。不过在开始学习阶段,修改偏差很有效果,可以使得紫线与绿线基本重合。
动量梯度下降法
有一种算法叫做Momentum,或者叫做Momentum梯度下降法。它的运行速度几乎总是快于标准的梯度下降算法。简而言之,基本的思想是计算梯度的指数加权平均数,并利用该梯度更新你的权重。
![](https://i-blog.csdnimg.cn/blog_migrate/0106ee4f02fd7b10385dee3f4a64f7c3.png)
如果要优化成本函数,函数形状如图6所示,红点代表最小值的位置。无论我们使用batch或mini-batch下降法,图中蓝线所示的这种上下波动减慢了梯度下降法的速度。我们既不希望摆动幅度过大从而超出函数范围,也不希望学习速度过慢。
batch或mini-batch下降法在每次迭代中,我们都需要计算dw和db。现在使用Momentum梯度下降法时,我们还需计算Vdw = βVdw + (1-β)dw。接着同样计算Vdb = βVdb + (1-β)db。然后重新赋值权重,w = w – αVdw,b = b – αVdb,这样就可以减缓梯度下降的幅度,在抵达最小值的路上减少了摆动。
#动量梯度下降法的步骤如下
On iteration t:
Compute dW,db on the current mini-batch
Vdw = βVdw + (1-β)dw
Vdb = βVdb + (1-β)db
W = W – αVdw
b = b – αVdb
#Hyperparameters: α, β β=0.9
RMSprop(root mean square prop)
On iteration t:
Compute dW,db on current mini-batch
SdW = βSdW + (1-β)dW2 #平方项是整体平方
Sdb = βSdb + (1-β)db2 #平方项是整体平方
#ϵ的作用是防止分母为0
RMSprop的影响是,纵轴方向上摆动较小,而横轴方向继续推进。并且我们可以使用一个更大的学习率α以加快学习,而无须担心在纵轴上垂直方向偏离。
RMSprop跟Momentum有很相似的一点就是可以消除梯度下降中的摆动并允许你使用一个更大的学习率α,从而加快你的算法学习速度。
Adam优化算法
RMSprop以及Adam优化算法是少有的经受住人们考验的两种算法,它们适用于不同的深度学习结构。Adam基本上是将Momentum和RMSprop结合在一起。
为什么算法叫做Adam?Adam代表的是Adaptive Moment Estimation。β1用来计算dw,它被叫做第一矩;β2用来计算dw2的指数加权平均数,它被叫做第二矩。
#Adam优化算法的过程如下
Vdw = 0,Sdw = 0,Vdb = 0,Sdb = 0 #初始化
On iteration t :
Compute dw,db on current mini-batch
Vdw = β1Vdw + (1-β1)dw,Vdb = β1Vdb + (1-β1)db
SdW = β2SdW + (1-β2)dW2 ,Sdb = β2Sdb + (1-β2)db2
#Adam算法中,超参数有:α,β1,β2 ,ϵ。
#其中学习率α需要不断调试,β1可以设置为0.9,β2可以设置为0.999,ϵ可以设置为10−8。
学习率衰减
加快学习算法的一个办法是随时间慢慢减少学习率,我们称之为学习率衰减。
为什么需要学习率衰减
假设使用mini-batch梯度下降法,在迭代过程中会有噪音,朝最小值下降但不会精确地收敛。由于使用的α是固定值,所以算法最后会在最小值附近摆动,并不会真正的收敛,因为不同的mini-batch中有噪音。但如果慢慢减少学习率α,在初期的时候,由于学习率α比较大,学习相对较快。随着α变小,步伐也会变慢变小,所以最后曲线会在最小值附近的一小块区域里摆动。
![](https://i-blog.csdnimg.cn/blog_migrate/60170e337cbd2ee225aae393d4b38bb9.png)
慢慢减少α的本质在于,在学习初期你能承受较大的步伐,但当开始收敛的时候,小一些的学习率能让步伐小一些。
其中decayRate是衰减率,epochNumber是代数,α0是初代学习率,k为随机常数,t为mini-batch的划分数。
局部最优问题
![](https://i-blog.csdnimg.cn/blog_migrate/647d8e273b982c3988847bf3daac3e1f.png)
图8是曾经人们在想到局部最优时脑海里会出现的图。图中似乎各处都分布着局部最优,梯度下降法或者某个算法可能困在一个局部最优中而不会抵达全局最优。
![](https://i-blog.csdnimg.cn/blog_migrate/2da4b861a81a1b74834c6e5f03002f84.png)
事实上,神经网络中通常梯度为零的点并不是图8中的局部最优点。实际上成本函数的零梯度点通常是鞍点。
![](https://i-blog.csdnimg.cn/blog_migrate/f90cf8d6c484080f68ce5066d40b43e0.png)
在马鞍面中,我们会出现平稳段减缓学习的问题。平稳段是一块区域,其中导数长时间接近于0,梯度下降将会很慢。这也是Momentum或是RMSprop、Adam这样的算法能够加速学习算法的地方,它们能帮助我们尽早往下走出平稳段。