2.1 Mini-batch梯度下降法
机器学习的应用是高度依赖经验的过程,伴随着大量的迭代过程,需要训练大量的模型才能找到最合适那个。Mini-batch梯度下降法是一种有效的能够提升计算效率的优化算法。
假如你的模型有5,000,000个样本,如果直接对整个样本集(batch)进行训练的话,过程将会非常缓慢。因此,可以将大样本划分为许多小样本,分别对每个小样本进行训练。例如可以划分出5000个小样本,一个小样本中有1000个样本数据,每个小样本就叫做mini-batch。对这5000个小样本进行完成一次向前和向后传播,称为一个epoch,也就是一次历遍了训练集。
2.2 理解mini-batch梯度下降法
在整个训练集进行上进行训练时,绘制的代价函数随迭代次数的变化曲线是连续下降的。而用mini-batch进行训练时,代价函数随迭代次数的变化曲线虽然也是整体下降,但是会伴随着上下的微小波动,如图1所示。
图1 batch和mini-batch梯度下降法代价函数的不同
这是由于每次梯度下降使用的是不同的mini-batch数据,有些mini-batch数据容易进行梯度下降,有些则较为困难。
在选择mini-batch中样本的大小size时,如果size=m,则变为batch梯度下降法。
如果size=1,则这种算法称为随机梯度下降法(Stochastic Gradient Descent),这时每个样本都是独立的mini-batch。以上两种情况是极端的情况,一般常见的做法是size取1~m的中间值。
实施不同size的梯度下降法时效果如下图所示。
图2 不同大小的mini-batch梯度下降法
蓝色折线为batch梯度下降法,下降幅度较大,相对噪声较低,但是一次训练样本太多,单次迭代耗时太长。
紫色折线为随机梯度下降法,大部分情况下每步的优化方向是指向代价函数最小值的方向,但是有时候会偏离最小化的方向,随机梯度下降永远不会到达代价函数最小值,只会在最小值附近徘徊。随机梯度下降法不能利用向量化带来的加速计算的效果,效率低下。
绿色折线是正常size的mini-batch梯度下降法。这种方法能够充分利用向量化的优点,不需要完整的训练集结束就可以开展后续的改进过程。
在选取mini-batch的size时的选取原则是:如果训练样本较小(如小于2000时),则直接使用batch梯度下降法。如果训练样本较大时,可以选择size为64,128,256,512等,可以尝试几次来确定最合适的size大小。
2.3 指数加权平均
在后面几节中将会讲到一些优化算法,这些算法需要用到指数加权平均,统计学中叫做指数加权移动平均。
图3 伦敦天气随时间的变化规律
图3为伦敦天气随时间的变化规律,移动平均值的计算如下:
v0=0
v
0
=
0
v1=0.9v0+0.1θ1
v
1
=
0.9
v
0
+
0.1
θ
1
v2=0.9v1+0.1θ2
v
2
=
0.9
v
1
+
0.1
θ
2
...
.
.
.
vt=0.9vt−1+0.1θt
v
t
=
0.9
v
t
−
1
+
0.1
θ
t
其中
vt
v
t
为第
t
t
天的加权平均值,为第
t
t
天的温度。用一个公式表示的话:
直观理解的话,
vt
v
t
大约等于
11−β
1
1
−
β
天温度的平均值。如果
β=0.9
β
=
0.9
的话,
vt
v
t
就是前10天的平均值,窗口宽度为10,如果
β=0.98
β
=
0.98
的话,
vt
v
t
就是前50天的平均值,窗口宽度为50,增加了更多的权重,曲线也更为平稳。如图4所示,红色曲线为
β=0.9
β
=
0.9
的平均值,绿色曲线为
β=0.98
β
=
0.98
的平均值。
图4 β=0.9 β = 0.9 和 β=0.98 β = 0.98 的平均值
一种极端的情况是 β=0.5 β = 0.5 时,平均值只考虑到两天的权重,曲线波折很明显,有很多的噪声。如图5中的黄色曲线所示。
图5 β=0.5 β = 0.5 时的平均值
2.4 理解指数平均
vt=βvt−1+(1−β)θt
v
t
=
β
v
t
−
1
+
(
1
−
β
)
θ
t
,取
β=0.9
β
=
0.9
,计算100天的平均值,有:
v100=0.9θ100+0.1×0.9θ99+0.1×0.92θ98+...
v
100
=
0.9
θ
100
+
0.1
×
0.9
θ
99
+
0.1
×
0.9
2
θ
98
+
.
.
.
这样就构建了一个指数衰减函数与每日的温度相乘,得到了第100天的平均温度。上式中的系数加起来接近于1。
2.5 指数加权平均的偏差修正
实际上,按照上节讲到的方法计算指数加权平均值时,绘出的曲线是图6中的紫色曲线,在起始阶段的平均值要低得多。
图6 指数加权平均的修正
原因如下:
v0=0 v 0 = 0
v1=0.98v0+0.02θ1=0.02θ1 v 1 = 0.98 v 0 + 0.02 θ 1 = 0.02 θ 1
v2=0.98v1+0.1θ2=0.0196θ1+0.02θ2 v 2 = 0.98 v 1 + 0.1 θ 2 = 0.0196 θ 1 + 0.02 θ 2
可以看出,平均值 v2 v 2 明显过小。可以进行修正,用 vt1−βt v t 1 − β t 代替 vt v t ,修正以后紫色曲线就变为了绿色曲线。
2.6 动量梯度下降法
动量(momentum)梯度下降法是一种比标准梯度下降法效率更好的优化算法,其基本思路是计算梯度的指数加权平均数,并用梯度来更新权重。
图7 不同的梯度下降法示意图
图7中蓝色折线是采用batch或mini-batch梯度下降法进行的优化过程,经过多次波折后到达最小值,这种上下波动减慢了梯度下降法的速度,限制了学习率的选取,如果选取了较大的学习率,则下降过程会很容易偏离最优方向,如图中紫色折线所示。为了获得最快的下降速率,我们希望下降曲线在是水平方向较快,而垂直方向则缓慢,如图中红色曲线所示,可以用momentum梯度下降法来实现,具体步骤如下:
在第
t
t
次迭代过程中,首先计算和
db
d
b
,然后计算
Vdw
V
d
w
和
Vdb
V
d
b
。
Vdw=βVdw+(1−β)dw
V
d
w
=
β
V
d
w
+
(
1
−
β
)
d
w
Vdb=βVdb+(1−β)db
V
d
b
=
β
V
d
b
+
(
1
−
β
)
d
b
然后更新
W
W
和:
w=w−αVdw
w
=
w
−
α
V
d
w
b=b−αVdb
b
=
b
−
α
V
d
b
这样就可以减小在垂直方向的摆动幅度,图7中的蓝色折线在垂直方向上下摆动,正负抵消,平均值为0,通过指数加权平均,可以使得在垂直方向的梯度更新值很小。在水平方向上,由于所有的方向都指向最低值,则指数加权平均以后的值依然很大,能够实现快速的下降。
在上面的式子中 dw d w 和 dw d w 类似于物理中的加速度,而 β β 是一个小于1的值,类似于摩擦力。标准梯度下降法中,每步的更新都是独立的,不依赖于前面的步骤。而momentum梯度下降法则于前面步骤的更新值有关,获得类似动量的特性。
2.7 RMSprop
RMSprop(root mean square prop)是另外一种优化算法,
图8 RMSprop梯度下降法
在第 t t 次迭代过程中,首先计算和 db d b ,然后计算 Sdw S d w 和 Sdb S d b 。
Sdw=βSdw+(1−β)dw2 S d w = β S d w + ( 1 − β ) d w 2
Sdb=βSdb+(1−β)db2 S d b = β S d b + ( 1 − β ) d b 2
然后更新 W W 和:
w=w−αdwSdw+ϵ√ w = w − α d w S d w + ϵ
b=b−αdbSdb+ϵ√ b = b − α d b S d b + ϵ
图8中 w w 梯度较小,而梯度较大,这样 w w 的更新速度会较大,而的更新速度会较小。 ϵ ϵ 的作用是防止分母为0,可以取一个很小的值,如 10−8 10 − 8 。
RMSprop和Momentum类似的地方时,它们都可以防止下降过程中的剧烈摆动,以及可以选用较大的学习率。
2.8 Adam优化算法
Adam(adaptive moment estimation)算法是将RMSprop和Momentum结合起来的优化算法,可以应用于各种不同的神经网络结构中。具体实现方法如下:
令
Vdw=0,Vdb=0,Sdw=0,Sdb=0
V
d
w
=
0
,
V
d
b
=
0
,
S
d
w
=
0
,
S
d
b
=
0
在第
t
t
次迭代过程中:
Vdb=β1Vdb+(1−β1)db
V
d
b
=
β
1
V
d
b
+
(
1
−
β
1
)
d
b
Sdw=β2Sdw+(1−β2)dw2
S
d
w
=
β
2
S
d
w
+
(
1
−
β
2
)
d
w
2
Sdb=β2Sdb+(1−β2)db2
S
d
b
=
β
2
S
d
b
+
(
1
−
β
2
)
d
b
2
Vcorrecteddw=Vdw1−βt1
V
d
w
c
o
r
r
e
c
t
e
d
=
V
d
w
1
−
β
1
t
Vcorrecteddb=Vdb1−βt1
V
d
b
c
o
r
r
e
c
t
e
d
=
V
d
b
1
−
β
1
t
Scorrecteddw=Sdw1−βt2
S
d
w
c
o
r
r
e
c
t
e
d
=
S
d
w
1
−
β
2
t
Scorrecteddb=Sdb1−βt2
S
d
b
c
o
r
r
e
c
t
e
d
=
S
d
b
1
−
β
2
t
w=w−αdwSdw√+ϵ
w
=
w
−
α
d
w
S
d
w
+
ϵ
b=b−αdbSdb√+ϵ
b
=
b
−
α
d
b
S
d
b
+
ϵ
然后更新
W
W
和:
w=w−αVcorrecteddwSdw√+ϵ
w
=
w
−
α
V
d
w
c
o
r
r
e
c
t
e
d
S
d
w
+
ϵ
b=b−αVcorrecteddwSdb√+ϵ
b
=
b
−
α
V
d
w
c
o
r
r
e
c
t
e
d
S
d
b
+
ϵ
在Adam算法中,有几个关键的超参数:
α,β1,β2,ϵ
α
,
β
1
,
β
2
,
ϵ
。
其中学习率
α
α
需要不断调试,
β1
β
1
可以设置为0.9,
β2
β
2
可以设置为0.99,
ϵ
ϵ
可以设置为
10−8
10
−
8
2.9 学习率衰减
一个有效的提高学习速率的方法是随着之间的增加,慢慢减小学习率,实现方法有以下几种:
α=11+decayRate⋅epochNumber⋅α0
α
=
1
1
+
d
e
c
a
y
R
a
t
e
⋅
e
p
o
c
h
N
u
m
b
e
r
⋅
α
0
α=0.95epochNumber⋅α0
α
=
0.95
e
p
o
c
h
N
u
m
b
e
r
⋅
α
0
α=kepochNumber√⋅α0
α
=
k
e
p
o
c
h
N
u
m
b
e
r
⋅
α
0
α=kt√⋅α0
α
=
k
t
⋅
α
0
2.10 局部最优的问题
在机器学习的早期阶段,人们在进行模型优化的时候,总是担心当代价函数梯度为零的时候模型会困在局部最优点(图9中蓝色点所示的位置),而不是全局最优点。
图9 神经网络优化问题
但是上述理解存在问题,因为图9画出了2维输入变量与代价函数的关系图。
实际上代价函数梯度为零的点大多数情况下都是鞍点(saddle point),如图10所示,而不是局部最优点。
图10 鞍点
这是由于在高维输入的模型中,当梯度为零时,不同纬度的函数既可能是凸函数也可能是凹函数,例如,在2000维输入的模型中,所有这2000个 w−J w − J 函数的都为凸函数的概率极小,更可能遇到的是图10所示的有凸有凹的鞍点的情况。
像Momentum,RMSprop和Adam这样的优化算法能够快速脱离鞍点达到最优值。