使用优化算法可以加快神经网络的训练过程。
Mini-batch
使用所有训练集进行一次梯度下降的方法叫做Batch梯度下降法。当训练集数量非常巨大时,Batch梯度下降法就变慢了,这时可以使用Mini-batch梯度下降法,Mini-batch梯度下降法比Batch梯度下降法快。
Mini-batch梯度下降法把训练集平均分成T个子集 {(X{1},Y{1}),(X{2},Y{2}),⋯,(X{T},Y{T})} { ( X { 1 } , Y { 1 } ) , ( X { 2 } , Y { 2 } ) , ⋯ , ( X { T } , Y { T } ) } 。使用其中的一个子集 ((X{t},Y{t})) ( ( X { t } , Y { t } ) ) 进行一次梯度下降。所有子集都进行过一次梯度下降,我们定义这个过程为一次迭代(epoch)训练。Mini-batch梯度下降法进行多次迭代训练,代价函数J收敛后,就可以完成训练。
Batch梯度下降法和Mini-batch梯度下降法的代价函数下降曲线不同。
Mini-batch梯度下降法的代价函数曲线有噪声,但是总体是下降趋势。出现噪声的原因可能是有些子集容易拟合,代价函数值比较低,有些子集不容易拟合,代价函数值比较高。
Mini-batch的大小为训练集的样本个数m/T。如果Mini-batch size = m,那么Mini-batch就变成Batch梯度下降法。如果Mini-batch size = 1,Mini-batch就变成随机梯度下降法。
下图是不同梯度下降法的代价函数下降过程的直观表现
其中蓝色线代表Batch梯度下降法,紫色线代表随机梯度下降法,绿色线表示Mini-batch梯度下降法。可以看到随机梯度下降法的下降方向是带有很大的噪声,不像Batch梯度下降法直接往最低方向下降,Mini-batch梯度下降法的下降过程也带有一些噪声。随机梯度下降法每次迭代只训练一个样本,放弃了矢量运算的快速,增加了训练的时间,不过随机梯度下降法也有适用的场景,比如在线学习。
为了能够加快训练速度,Mini-batch size的大小要适中,根据CPU或GPU的大小决定。Mini-batch size太小会浪费运行空间,太大反而会拖慢训练时间。根据CPU和GPU的运算特性,Mini-batch size一般是2的倍数,比如64,128,256,512等。一般训练集超过2000个样本时使用Mini-batch。
指数加权平均
还有其他比梯度下降法更快的优化算法,在学习它们之前需要了解指数加权平均,在统计中也叫作指数加权移动平均。
下图是伦敦一年内的温度变化曲线:
设
θi
θ
i
为第i天的温度,
Vi
V
i
为平均温度,通过如下公式计算得到
当 β=0.9 β = 0.9 时,计算所有的 Vi V i 值,得到上图的红色线。
V相当于
11−β
1
1
−
β
天的平均温度。当
β=0.9
β
=
0.9
时,V相当于最近10天的平均温度。下图的绿线表示
β=0.98
β
=
0.98
,即最近50天的平均温度曲线,可以看到温度变化的幅度不大,很平缓。下图的黄线表示
β=0.5
β
=
0.5
,即最近2天的平均温度变化曲线,两天的平均温度变化幅度挺大的。所有的这些平均温度变化曲线都往右边偏移了一部分。
我们假设要计算第t天的V值,那么
可以看到, Vt V t 是前t天的加权平均值,加权值呈指数下降。当 β11−β≈1e β 1 1 − β ≈ 1 e 时,权重 (1−β)β2 ( 1 − β ) β 2 已经很小了,几乎可以忽略不计了,因此 Vt V t 相当于前 11−β 1 1 − β 天的加权平均值。
与直接算平均值相比,指数加权平均值的好处是使用代码少(公式只需要一行代码),占用的内存少(只需要存储 V0 V 0 )。
因为设置
V0=0
V
0
=
0
,所以V一开始的值比较小,比如
β=0.9
β
=
0.9
,那么
V1=0.9V0+0.1θ1=0.1θ1
V
1
=
0.9
V
0
+
0.1
θ
1
=
0.1
θ
1
,这样不合理,需要对V进行偏差修正。偏差修正后V的公式为:
当i比较小时, Vi/(1−θi) V i / ( 1 − θ i ) 可以放大 Vi V i 值,使得 Vi V i 值看起来比较合理。当i很大时, 1−θi≈1 1 − θ i ≈ 1 ,对 Vi V i 值没影响。
如果对开始时期的偏差不在意,可以不进行偏差修正。
Momentum
Momentum梯度下降法与标准的梯度下降法的不同在于参数更新,Momentum的做法是:
参数更新时减去的是梯度的平均值。
标准的梯度下降法是上下波动地接近代价函数的最低值,如上图蓝线所示。Momentum法在参数更新时减去的是梯度的平均值。代价函数值纵坐标的移动距离有正有负,抵消之后平均值很低,因此在纵坐标的摆动幅度减少。而代价函数值在横坐标依然直直地往最低值走,如上图红色线所示。因此,Momentum梯度下降法可以比标准的梯度下降法运行的更快。
RMSprop(root mean square prop)
RMSprop在梯度下降的每次迭代中进行如下操作:
还是从上图来说明一下RMSprop算法。我们希望在纵坐标上代价函数值的摆动不要太大,在横坐标上下降速度要更快。我们假设纵坐标是由参数b影响的,b一般比较大,而横坐标是由参数W影响的,W比较小。 SdW S dW 和 Sdb S db 也就一个比较小,一个比较大。最后,dW除以一个比较小的数就变大,在横坐标上下降速度更快;db除以一个比较大的数就变小,在纵坐标上摆动的幅度就变小,所以RMSprop速度更快。 ε ε 是一个很小的数,如 10−8 10 − 8 ,为了保证不会出现除以0的错误运算,保证数值的稳定。
Adam优化算法
Adam全称Adaptive Moment Estimation, 是Momentum和RMSprop二者的结合。具体过程如下。
在第t次迭代过程中
其中 α α 需要多次尝试确定最合适的值。 β1 β 1 的缺省值为0.9, β2 β 2 的缺省值为0.999, ε ε 的缺省值为 10−8 10 − 8 。
学习率衰减
加快学习算法的一个方法就是随着时间慢慢减少学习率。因为Mini-batch不同子集的随机性,代价函数值会在最小值附近徘徊。如果学习率 α α 慢慢变小,代价函数值在最小值附近徘徊的区域会慢慢变小,最后趋向于最小值。
有多种学习率衰减的方法。
第一种方法:
其中decay-rate是衰减率,epoch-num是指mini-batch的迭代次数, α0 α 0 是初始学习率。衰减率和初始学习率要自己设定。
第二种方法:指数衰减法
其中0.95可以其他常数。
第三种方法:
或者
其中T指的是Mini-batch的划分的子训练集的个数,可是某一常数。
第四种方法:离散下降法
每过一段时间,学习率变为原来的一半。
局部最优问题
学习过程中我们经常担心算法陷入到局部最优解中(如左下图所示),但是对于高维度向量来说,每个维度都凸起的情况不多,碰到局部最优解的概率很低。比如一个2000维的高维向量,遇到局部最优解的概率是
2−2000
2
−
2000
。所以我们不需要经常担心遇到局部最优问题。我们更容易遇到的情况是一半的维度凸起,另外一半凹下,合起来像是马鞍(如右下图所示)。马鞍范围是一个平缓区,代价函数值落到这一区域会减缓学习速度,需要优化的学习算法(比如Adam)来加快学习过程。