优化算法
在大数据上训练模型会很慢,若使用优化算法,就会大大提高训练效率。本周的内容就是介绍常见的优化算法,如mini-batch、momentum、RMSprop、Adam,最后再介绍下局部最优与鞍点的概念。
2.1 mini-batch gradient descent
batch VS mini-batch gradient descent
向量化操作使得我们可以同时处理m个样本,但是当m很大时,处理速度仍然较慢。
batch gradient descent就是我们之前的处理方法,要求我们必须处理整个训练集,才能进行一次梯度下降。
mini-batch的思想是将训练集划分为很多的mini-batch。假设训练集有样本500w,每个mini-batch有样本1000个,那么我们总共就有5000个mini-batch,每个mini-batch记为
X
{
t
}
,
t
=
1
,
2
,
.
.
.
,
5000
X^{\{t\}},t=1,2,...,5000
X{t},t=1,2,...,5000,对Y也进行同样的操作。mini-batch 梯度下降法的原理如下:
图片中的代码被称为一次epoch。1 次epoch意味着对训练集的一次完整遍历。batch gradient descent中,遍历一次训练集只能做一次梯度下降,而mini-batch gradient descent中,遍历一次训练集,即1 epoch,允许做5000次梯度下降。
2.2 understanding mini-batch gradient descent
1、batch gradient descent的损失函数是单调递减的。
2、mini-batch gradient descent的损失函数却不是单调递减的,而是在大的下降趋势中,不断上下震动。这是因为,每次更新使用的都是训练集中的一部分数据,利用部分数据算出的代价总是会与真实值有些偏差。
如下图所示
在mini-batch gradient descent中,我们要选择的参数是mini-batch size:
: 当mini-batch size = m,即为batch gradient descent。缺点:单次迭代耗时太长。
当mini-batch size = 1,即为stochastic gradient descent。缺点:失去了所有向量化带来的加速。
下图给出了batch、mini-batch、SGD在梯度下降时情形。
因此,在实践中mini-batch size的值设为1~m之间,可以实现最快的学习。这样的mini-batch gradient descent不会总朝着最小值靠近,但它比随机梯度下降要更持续的靠近最小值的方向,而且优化速度会快于batch gradient descent。
mini-batch size选择的指导原则:
1、如果训练集较小(少于2000个样本),直接使用batch gradient descent
2、 典型的mini-batch size大小:64~512,若将mini-batch size设置为2的幂,代码会跑的快一些,即设置为64、128、256、512。
3、make sure
X
{
t
}
X^{\{t\}}
X{t},
Y
{
t
}
Y^{\{t\}}
Y{t} fit in CPU, GPU memory(没太懂这句话的意思)
下面将介绍几种比梯度下降法更高效的优化算法。
2.3 exponentially weighted averages
指数加权平均,也叫指数加权移动平均
v
t
=
β
v
t
−
1
+
(
1
−
β
)
θ
t
v_t=\beta v_{t-1}+(1-\beta)\theta_t
vt=βvt−1+(1−β)θt
2.4 understanding exponentially weighted averages
如下图所示,将
v
100
v_{100}
v100用
θ
100
\theta_{100}
θ100、
θ
99
\theta_{99}
θ99、…进行表示,可得
v
100
=
0.1
θ
100
+
0.1
∗
0.9
θ
99
+
0.1
∗
0.
9
2
θ
98
+
0.1
∗
0.
9
3
θ
97
+
0.1
∗
0.
9
4
θ
96
.
.
.
v_{100}=0.1\theta_{100}+0.1*0.9\theta_{99}+0.1*0.9^2\theta_{98}+0.1*0.9^3\theta_{97}+0.1*0.9^4\theta_{96}...
v100=0.1θ100+0.1∗0.9θ99+0.1∗0.92θ98+0.1∗0.93θ97+0.1∗0.94θ96...
其中,前面的系数就是权重,如图中蓝色曲线所示,可以看到权重是指数衰减的,这也就是指数加权平均名称的由来。
(
1
−
ε
)
1
ε
≈
1
e
(1-\varepsilon)^{\frac{1}{\varepsilon}}\approx \frac{1}{e}
(1−ε)ε1≈e1
所以,
0.
9
10
=
1
e
0.9^{10}=\frac{1}{e}
0.910=e1
实现:
v
θ
:
=
β
∗
v
θ
+
(
1
−
β
)
θ
t
v_{\theta}:=\beta*v_{\theta}+(1-\beta)\theta _t
vθ:=β∗vθ+(1−β)θt,这种方法比较节省内存。
2.5 bias correction in exponentially weighted averages-指数加权平均的偏差修正
为什么需要偏差矫正?因为在开始做指数加权平均时,我们假设
v
0
v_0
v0等于0,这样,在最开始算平均值的时候,就非常不准,按照下式矫正
v
t
=
v
t
1
−
β
t
v_t=\frac{v_t}{1-\beta ^t}
vt=1−βtvt
这样,在开始的时候,t较小,对
v
t
v_t
vt的矫正作用较大;随着t越来越大,
1
−
β
t
1-\beta ^t
1−βt越来越趋向于1,对
v
t
v_t
vt的矫正作用越来越微弱。
在机器学习中,很多人不在乎使用bias correction,因为他们不在意刚开始的值,更注重之后得到的计算结果。如果比较关心初期时候的bias,那么bias correction能帮助你获得较好的估测。
2.6 gradient descent with momentum
momentum的运行速度几乎总是快于标准梯度下降法。它的基本思想就是计算梯度的指数加权平均,再利用该加权平均来更新权重。该算法对碗状代价函数效果好。
v
d
w
=
0
v_{dw}=0
vdw=0 ,
v
d
b
=
0
v_{db}=0
vdb=0(和w,b具有相同的维度)
对每次的迭代t:
: 计算dw,db,在当前的mini-batch
v
d
w
=
β
v
d
w
+
(
1
−
β
)
d
w
v_{dw}=\beta v_{dw}+(1-\beta)dw
vdw=βvdw+(1−β)dw ,w的移动平均数
v
d
b
=
β
v
d
b
+
(
1
−
β
)
d
b
v_{db}=\beta v_{db}+(1-\beta)db
vdb=βvdb+(1−β)db ,b的移动平均数
更新权重
w
:
=
w
−
α
v
d
w
w:=w-\alpha v_{dw}
w:=w−αvdw
b
:
=
b
−
α
v
d
b
b:=b-\alpha v_{db}
b:=b−αvdb
通过加权平均,可以使得梯度在摆动大的维度减小摆动,在无摆动的维度快速下降,这样可以减缓梯度下降的幅度,让算法在抵达最小值的路上减少了摆动。将微分项
d
w
dw
dw想象成加速度,
v
d
w
v_{dw}
vdw想象成速度,在每一次梯度下降的时候,可以让算法更好的找到下降的方向。
momentum实现的时候需要两个超参数
α
\alpha
α和
β
\beta
β,其中
β
=
0.9
\beta=0.9
β=0.9。
2.7 RMSprop
RMSprop(root mean square prop)也可以加速梯度下降。当在进行梯度下降时,我们想放缓某些轴上的下降速度,加速(至少不放缓)另一些轴上的下降速度,这时候就需要RMSprop。
S
d
w
=
0
S_{dw}=0
Sdw=0 ,
S
d
b
=
0
S_{db}=0
Sdb=0(和w,b具有相同的维度)
对每次的迭代t:
: 计算dw,db,在当前的mini-batch
S
d
w
=
β
S
d
w
+
(
1
−
β
)
(
d
w
)
2
S_{dw}=\beta S_{dw}+(1-\beta)(dw)^2
Sdw=βSdw+(1−β)(dw)2 ,element-wise square operation
S
d
b
=
β
S
d
b
+
(
1
−
β
)
(
d
b
)
2
S_{db}=\beta S_{db}+(1-\beta)(db)^2
Sdb=βSdb+(1−β)(db)2 ,element-wise square operation
更新权重
w
:
=
w
−
α
d
w
S
d
w
+
ε
,
ε
=
1
0
−
8
w:=w-\alpha \frac {dw}{\sqrt{S_{dw}}+\varepsilon},\varepsilon=10^{-8}
w:=w−αSdw+εdw,ε=10−8
b
:
=
b
−
α
d
b
S
d
b
+
ε
b:=b-\alpha \frac{db}{\sqrt{S_{db}}+\varepsilon}
b:=b−αSdb+εdb
当db较大,dw较小的时候,这样就可以使用一个较大的学习率,而不必担心在某些轴上的偏离较大。
2.8 Adam optimization algorithm
可将Adam看作momentum和RMSprop的结合是一种及其常用的学习算法,能有效适用于不同的神经网络。Adam是Adaptive Moment Estimation。一般在实现Adam算法的时候,都要进行bias correction。
v
d
w
=
0
v_{dw}=0
vdw=0 ,
v
d
b
=
0
v_{db}=0
vdb=0,
S
d
w
=
0
S_{dw}=0
Sdw=0 ,
S
d
b
=
0
S_{db}=0
Sdb=0(和w,b具有相同的维度)
对每次的迭代t:
: 计算dw,db,在当前的mini-batch
v
d
w
=
β
1
v
d
w
+
(
1
−
β
1
)
d
w
v_{dw}=\beta_1 v_{dw}+(1-\beta_1)dw
vdw=β1vdw+(1−β1)dw
v
d
b
=
β
1
v
d
b
+
(
1
−
β
1
)
d
b
v_{db}=\beta_1 v_{db}+(1-\beta_1)db
vdb=β1vdb+(1−β1)db
S
d
w
=
β
2
S
d
w
+
(
1
−
β
2
)
(
d
w
)
2
S_{dw}=\beta_2 S_{dw}+(1-\beta_2)(dw)^2
Sdw=β2Sdw+(1−β2)(dw)2
S
d
b
=
β
2
S
d
b
+
(
1
−
β
2
)
(
d
b
)
2
S_{db}=\beta_2 S_{db}+(1-\beta_2)(db)^2
Sdb=β2Sdb+(1−β2)(db)2
v
d
w
c
o
r
r
e
c
t
e
d
=
v
d
w
1
−
β
1
t
v_{dw}^{corrected}=\frac{v_{dw}}{1-\beta_1^t}
vdwcorrected=1−β1tvdw
v
d
b
c
o
r
r
e
c
t
e
d
=
v
d
b
1
−
β
1
t
v_{db}^{corrected}=\frac{v_{db}}{1-\beta_1^t}
vdbcorrected=1−β1tvdb
S
d
w
c
o
r
r
e
c
t
e
d
=
S
d
w
1
−
β
2
t
S_{dw}^{corrected}=\frac{S_{dw}}{1-\beta_2^t}
Sdwcorrected=1−β2tSdw
S
d
b
c
o
r
r
e
c
t
e
d
=
S
d
b
1
−
β
2
t
S_{db}^{corrected}=\frac{S_{db}}{1-\beta_2^t}
Sdbcorrected=1−β2tSdb
更新权重
w
:
=
w
−
α
v
d
w
c
o
r
r
e
c
t
e
d
S
d
w
c
o
r
r
e
c
t
e
d
+
ε
w:=w-\alpha \frac {v_{dw}^{corrected}}{\sqrt{S_{dw}^{corrected}}+\varepsilon}
w:=w−αSdwcorrected+εvdwcorrected,一般情况下
ε
\varepsilon
ε取
1
0
−
8
10^{-8}
10−8
b
:
=
b
−
α
v
d
b
c
o
r
r
e
c
t
e
d
S
d
b
c
o
r
r
e
c
t
e
d
+
ε
b:=b-\alpha \frac{v_{db}^{corrected}}{\sqrt{S_{db}^{corrected}}+\varepsilon}
b:=b−αSdbcorrected+εvdbcorrected
该算法有很多超参数,学习率
α
\alpha
α仍然很重要,可以尝试不同的值来tune,
β
1
\beta_1
β1的默认值是0.9,
β
2
\beta_2
β2的值推荐为0.999,这是Adam算法的发明者推荐的,
ε
\varepsilon
ε一般为
1
0
−
8
10^{-8}
10−8。
2.9 learning rate decay
另一个加快学习算法的方法就是学习率衰减。设初始学习率为
α
0
\alpha_0
α0,则随着学习的进行,
α
=
1
1
+
d
e
c
a
y
_
r
a
t
e
∗
e
p
o
c
h
_
n
u
m
α
0
\alpha = \frac{1}{1+decay\_rate*epoch\_num}\alpha_0
α=1+decay_rate∗epoch_num1α0
因此,若要使用学习率衰减,就需要尝试很多
α
0
\alpha_0
α0和dacay_rate,直到找到合适的值。
除了上述方法外,还有其他的衰减方法,比如
: 指数衰减:
α
=
K
e
p
o
c
h
α
0
\alpha = K^{epoch}\alpha_0
α=Kepochα0,比如K=0.95
α
=
K
e
p
o
c
h
_
n
u
m
α
0
\alpha=\frac{K}{\sqrt{epoch\_num}}\alpha_0
α=epoch_numKα0或者
α
=
K
t
α
0
\alpha=\frac{K}{\sqrt{t}}\alpha_0
α=tKα0
或者离散下降的
α
\alpha
α值。
2.10 The problem of local optima
在创建神经网络时,大多数情况下,梯度为0的点并不是局部最优点,而是鞍点(saddle point),这与我们之前以为的那些坑坑洼洼的三维图像中的局部最优点差别很大,或者说,我们之前都以为错了。因为,当维数很高的时候,并不能保证每一维在梯度为0的点上都是向上弯曲的,它也有可能是向下弯曲的,因此,就形成了鞍点,而不是我们之前以为的局部最优点。这样,我们就不存在局部最优的问题了。如下图
那么到底问题在哪?
- 不太可能陷入不好的局部最优中
- 平稳段使得学习变得非常缓慢,这种情况下,就要momentum、RMSprop或Adam这样的算法来加速走出平稳段。