在大数据上进行深度学习的速度很慢,因此我们需要学习一些方法来加快深度学习的速度。
1batch vs. mini-batch梯度下降
1.什么是mini-batch?
向量化能够使得我们更快地处理输入X和输出Y,可是当输入样本量太大时,比如m=5000000,梯度下降的速度仍旧会比较慢。这时可以把训练集分割为小一点的子训练集,这些子集称为mini-batch,比如1~1000为第一个mini-batch,符号为
X
{
1
}
X^{\{1\}}
X{1},那么一共有5000个mini-batch,Y也是如此。每个mini-batch的符号为
X
{
t
}
,
Y
{
t
}
X^{\{t\}},Y^{\{t\}}
X{t},Y{t}。
2.几种梯度下降的性能。PS:深度学习中的SGD指的就是mini-batch gredient descent
使用mini-batch gradient descent需要将batch gradient descent分解为T次mini-batch梯度下降。
batch size | name | 特点 |
---|---|---|
size=m | batch… | 向量化,一次迭代需要长时间 |
size=T | mini batch… | 既有向量化带来的速度提升,又使得梯度下降的速度变快 |
size=1 | stochastic… | 失去了向量化带来的优势 |
注意:随机梯度下降和mini-batch永远不会收敛,只是会在最小值附近。
3.mini-batch的size怎么选?
一般选择2的整数次幂,{64,128,256,512}.
2 优化算法
a)原理:指数加权平均(exponentially weighted average)
1.概念
每一天的均值
V
t
=
β
V
t
−
1
+
(
1
−
β
)
θ
t
V_t=\beta V_{t-1}+(1-\beta)\theta_t
Vt=βVt−1+(1−β)θt,计算出的均值
V
t
V_t
Vt大约是
1
/
(
1
−
β
)
1/(1-\beta)
1/(1−β)天的均值。所以
β
\beta
β越接近1,均值曲线越平滑,如绿色曲线,越接近0波动越大,如黄色曲线。
当
β
=
0.9
\beta=0.9
β=0.9,我们将公式展开,代入每天的温度,可以计算出与当前值相差10天的温度值的权重为当天权重的
0.
9
10
≈
0.35
≈
e
0.9^{10}\approx0.35\approx{e}
0.910≈0.35≈e,也就是说它的权重为当前天的1/3,我们不再考虑权重小于当前1/3的温度值。因此计算均值时,是将公式
β
n
≈
1
e
\beta^n\approx\frac{1}{e}
βn≈e1近似为
n
=
1
1
−
β
n=\frac{1}{1-\beta}
n=1−β1。
2.优势
使用指数加权平均来计算均值的好处是不需要存储每一天的数据,它的近似计算均值的方法只需要每次取出一天的均值与之前的均值做加权计算就行了。在计算机中实现也十分简单:
v
=
0
v=0
v=0
repeat{
get next
θ
\theta
θ
v
:
=
β
v
+
(
1
−
β
)
θ
v:=\beta v+(1-\beta)\theta
v:=βv+(1−β)θ
}
3.偏差修正bias correction
在指数加权平均的初期阶段,因为初始化v=0,因此最开始算的均值v会偏小,这时我们进行偏差修正使得初始值正常。
v
=
0
v=0
v=0
repeat{
get next
θ
\theta
θ
v
:
=
β
v
+
(
1
−
β
)
θ
v:=\beta v+(1-\beta)\theta
v:=βv+(1−β)θ
v
:
=
v
/
(
1
−
β
t
)
v:=v/(1-\beta^t)
v:=v/(1−βt) # t是循环次数
}
开始时t比较小用来修正v,后期t较大,
β
t
\beta^t
βt接近0,修正作用减小。
b)动量梯度下降Momentum
对于碗状的损失函数,在利用Momentum之后因为均值化参数,横轴保持向前摆动,纵轴因为正负值相互抵消而摆动减小。(也就是在梯度方向不变的时候加速学习,在梯度方向改变的时候减少更新,因此增加了稳定性。)
这样使得学习速率learning rate可以设置为较大的值。
从这里看出,每一次进行梯度下降的值都是前几次计算出来的dw,db的均值。
c) RMS(root mean square) prop
implemention
on each iteration t: |
---|
compute dw,db on current mini-batch |
S d w = β 2 S d w + ( 1 − β 2 ) d w 2 S_{d_w}=\beta_2 S_{d_w}+(1-\beta_2)d^2_w Sdw=β2Sdw+(1−β2)dw2 |
S d b = β 2 S d b + ( 1 − β 2 ) d b 2 S_{d_b}=\beta_2 S_{d_b}+(1-\beta_2)d^2_b Sdb=β2Sdb+(1−β2)db2 |
w = w − α d w S d w + ϵ w=w-\alpha\frac{d_w}{\sqrt{S_{d_w}}+\epsilon} w=w−αSdw+ϵdw, 一般取 ϵ = 1 0 − 8 \epsilon=10^{-8} ϵ=10−8 |
b = b − α d b S d b + ϵ b=b-\alpha\frac{d_b}{\sqrt{S_{d_b}}+\epsilon} b=b−αSdb+ϵdb |
使得纵轴上变化较大的db被一个较大的数(斜率大)相除,而横洲上的dw被一个较小的数(斜率小)相除,这样做的结果就是减小的纵轴上的摆动。
d) Adam
Adam方法是将Momentum与RMS方法相结合的一种优化算法。
on each iteration t: |
---|
compute dw,db on current mini-batch |
V d w = 0 , V d b = 0 , S d w = 0 , V d b = 0 , V_{d_w}=0, V_{d_b}=0, S_{d_w}=0, V_{d_b}=0, Vdw=0,Vdb=0,Sdw=0,Vdb=0, |
V d w = β 1 V d w + ( 1 − β 1 ) d w V_{d_w}=\beta_1 V_{d_w}+(1-\beta_1)d_w Vdw=β1Vdw+(1−β1)dw, V d b = β 1 V d b + ( 1 − β 1 ) d b V_{d_b}=\beta_1 V_{d_b}+(1-\beta_1)d_b Vdb=β1Vdb+(1−β1)db, 一般有 β 1 = 0.9 \beta_1=0.9 β1=0.9 |
S d w = β 2 S d w + ( 1 − β 2 ) d w 2 S_{d_w}=\beta_2 S_{d_w}+(1-\beta_2)d^2_w Sdw=β2Sdw+(1−β2)dw2, S d b = β 2 S d b + ( 1 − β 2 ) d b 2 S_{d_b}=\beta_2 S_{d_b}+(1-\beta_2)d^2_b Sdb=β2Sdb+(1−β2)db2, 一般有 β 2 = 0.999 \beta_2=0.999 β2=0.999 |
V d w c o r r r e c t e d = V d w / ( 1 − β 1 t ) , V d b c o r r r e c t e d = V d b / ( 1 − β 1 t ) V_{d_w}^{\rm corrrected}=V_{d_w}/(1-\beta_1^t), V_{d_b}^{\rm corrrected}=V_{d_b}/(1-\beta_1^t) Vdwcorrrected=Vdw/(1−β1t),Vdbcorrrected=Vdb/(1−β1t) |
S d w c o r r r e c t e d = S d w / ( 1 − β 2 t ) , S d b c o r r r e c t e d = S d b / ( 1 − β 2 t ) S_{d_w}^{\rm corrrected}=S_{d_w}/(1-\beta_2^t), S_{d_b}^{\rm corrrected}=S_{d_b}/(1-\beta_2^t) Sdwcorrrected=Sdw/(1−β2t),Sdbcorrrected=Sdb/(1−β2t) |
w = w − α V d w S d w + ϵ w=w-\alpha\frac{V_{d_w}}{\sqrt{S_{d_w}}+\epsilon} w=w−αSdw+ϵVdw, b = b − α V d b S d b + ϵ b=b-\alpha\frac{V_{d_b}}{\sqrt{S_{d_b}}+\epsilon} b=b−αSdb+ϵVdb,一般取 ϵ = 1 0 − 8 \epsilon=10^{-8} ϵ=10−8 |
超参数有 α , β 1 , β 2 , ϵ \alpha, \beta_1, \beta_2, \epsilon α,β1,β2,ϵ, α \alpha α需要调节参数,其余超参数一般取经验值。
3 Learning rate decay学习速率衰减
公式:
α
=
1
1
+
d
e
c
a
y
R
a
t
e
∗
e
p
o
c
h
N
u
m
α
0
\alpha=\frac{1}{1+{\rm decayRate}*{\rm epochNum}}\alpha_0
α=1+decayRate∗epochNum1α0
epochNum指的是遍历一遍所有训练集的次数。公式中有两个超参数
α
0
\alpha_0
α0,decayRate需要调参。公式表示的是随着遍历次数的增加,学习速率逐渐降低。
其他的学习速率降低:
α
=
0.9
5
e
p
o
c
h
N
u
m
α
0
\alpha=0.95^{\rm epochNum}\alpha_0
α=0.95epochNumα0
α
=
k
e
p
o
c
h
N
u
m
α
0
\alpha=\frac{k}{\sqrt{\rm epochNum}}\alpha_0
α=epochNumkα0
4 超参数调试
1)超参数
红色是最重要的,黄色次之,紫色再次之。
2)调节超参数的方法
两种方法:1.随机取值;2.从大范围到小范围(从粗糙到精细)
随机取值的好处是在你不知道哪个参数更重要的时候,可以得到更多不一样的取值,比如
α
\alpha
α与
ϵ
\epsilon
ϵ一起调试的时候,如果使用网格搜索,那么不同
ϵ
\epsilon
ϵ下相同
α
\alpha
α得到的效果其实差不多。
从粗糙到精细是指在调试参数之后,发现参数在某一范围内的效果较好,那么在这个更小的范围内再进行更加密集的调参。
3)随机取值的标尺
对于不同的超参数有不同的随机取值标准:在线性轴取值和在对数轴上取值。
对一些超参数,例如神经网络的层数
L
L
L和每一层的隐藏单元数
n
[
l
]
n^{[l]}
n[l]可以直接在线性轴上取值。
但是对一些参数,比如学习速率
α
\alpha
α应该在对数轴上取值,例如
α
\alpha
α取值在0.0001和1之间时,使用
r
=
−
4
∗
n
p
.
r
a
n
d
o
m
.
r
a
n
d
n
(
)
α
=
1
0
r
r=-4*np.random.randn() \\ \alpha=10^r
r=−4∗np.random.randn()α=10r
对另一种参数
β
\beta
β取值在0.9到0.999之间的,也应该使用对数取值,但这里要加上一步处理,我们做的是对
1
−
β
1-\beta
1−β进行取值,对应0.1~0.001。原因是对应不同的
β
\beta
β值,我们关心的是平均数量的尺寸
1
/
(
1
−
β
)
1/(1-\beta)
1/(1−β)。
4)Tips
1 重新评估参数每几周一次
2 选择不同的方式来调试模型,当计算机资源不够的时候,数据量太大,一次只能运行一个模型;当计算机资源足够时,一次可以运行多个模型。
babysitting one model:不断观察模型来调整学习速率
training many models in parallel :尝试不同的超参数,观察不同超参数的损失函数,选择最好的一个
5 局部最优问题
在深度学习中,最优化问题其实并不容易困在局部最小值点。在高维度空间时(如20000维),局部最小值点需要在所有维度上都取得最小值,概率为
2
−
20000
2^{−20000}
2−20000,相反更容易困在鞍点处。 也就是它的导数在某些维度上凸,在有些维度下凹,(在一个方向是极大值,另一个方向是极小值的点)。鞍点的Hessian矩阵是半正定矩阵。
如果局部最优不是问题,那问题是什么?
缓慢变化的平台会使得训练减慢,因此可以通过自适应学习率算法如Adam或者RMSProp加速学习。
总结
1.优化算法是为了做什么?
2.几种不同的优化算法的优缺点?(重点)
三种优化算法+adagrad
深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)
深度学习优化算法总结
3.超参数的调试