1.Mini-batch梯度下降法
对于m个数据样本,在训练神经网络的时候,最常用的是向量化,如: X = [ x ( 1 ) , x ( 2 ) , . . . , x ( m ) ] , x ( n x , m ) X=[x^{(1)},x^{(2)},...,x^{(m)}],x(n_{x},m) X=[x(1),x(2),...,x(m)],x(nx,m)(维数) ,但是当样本足够大的时候,例如5w,虽然向量化了,在back propagation的时候,必须先求得l层的梯度后才能进行l-1层的梯度,这样子速度就挺慢了,这就需要将X划分成很小的子集进行分别梯度下降,这些子集被取名为Mini-batch。如下公式:
输入权重: X = [ x ( 1 ) , x ( 2 ) , ⋯   , x ( 1000 ) ∣ x ( 1001 ) , ⋯   , x ( 2000 ) ∣ x ( ) . . . x ( m ) ] X=[x^{(1)},x^{(2)} ,\cdots ,x^{(1000)}|x^{(1001)},\cdots,x^{(2000)}|x^{()}...x^{}{(m)}] X=[x(1),x(2),⋯,x(1000)∣x(1001),⋯,x(2000)∣x()...x(m)]
输出: Y = [ y ( 1 ) , y ( 2 ) , ⋯   , y ( 1000 ) ∣ y ( 1001 ) , y ( 1002 ) , ⋯   , y ( 2000 ) ∣ y ( ) , ⋯   , y ( m ) ] Y=[y^{(1)},y^{(2)},\cdots,y^{(1000)} |y^{(1001)},y^{(1002)},\cdots,y^{(2000)}|y^{()},\cdots ,y^{(m)}] Y=[y(1),y(2),⋯,y(1000)∣y(1001),y(1002),⋯,y(2000)∣y(),⋯,y(m)]
如果算1000个元素为一个Mini_batch,那么总数为5w,则一共有50组,分别命名为
X:
X
[
1
]
,
X
[
2
]
,
⋯
 
,
X
[
50
]
X^{[1]},X^{[2]},\cdots ,X^{[50]}
X[1],X[2],⋯,X[50] (本来这个是用{}表示的,但是软件问题,用[ ])
Y:
Y
[
1
]
,
Y
[
2
]
,
⋯
 
,
Y
[
50
]
Y^{[1]},Y^{[2]},\cdots,Y^{[50]}
Y[1],Y[2],⋯,Y[50]
Mini-batch的数量t组成了**X[t]**和**Y[t]**包含相应的输入输出,对应的维数分别为 ( n x , 1000 ) (n_{x},1000) (nx,1000), ( 1 , 1000 ) (1,1000) (1,1000),尽管把整一个数据集进行了分块,但是需要遍历这些Mini_batch,一共有50000/1000=50,则需要遍历50次。
上述图片中,for i in range(50) 指的是当你将大的数据集划分成很多小组 ( X [ n ] , Y [ n ] X^{[n]},Y^{[n]} X[n],Y[n])的时候,对这些mini-batch进行逐个forward propagation 和 back propagation。
对于batch梯度下降法而言,遍历一次
2.理解mini-batch
batch梯度下降法和mini梯度下降法的下降曲线如下:
mini_batch 的方法之所以会比较抖,主要是因为在一代训练中,不断的用较少的样本来对W和b进行优化,每次都会向局部最小值上走,导致比较震荡,但是总体的趋势还是不变的。
在极端情况下,如果mini-batch集合的元素等于m,所以把mini-batch大小设为m就可以得到batch梯度下降法。在另一种极端情况下,假设mini-batch大小为1,就有了新的算法,叫做随机梯度下降法,每个样本都是独立的mini-batch,( X [ 1 ] , Y [ 1 ] X^{[1]},Y^{[1]} X[1],Y[1]) 则为第一个训练集样本,如下所示,bacth比较按照正常的状态下降,而Mini-batch则会向着相应的局部最小值下降,永不不会收敛,而是在最小值附近波动。
当样本过大的时候:把所有的样本放在同一个矩阵,会导致迭代速度变慢。但是如果mini-batch所选的尺寸太小,如果单单只选择1的话,就是失去了向量化的意义,所以要选择合适的mini-batch尺寸。
如何选择mini-batch的尺寸呢?
1.如果训练集太小,直接使用batch梯度下降法(样本数<2000)
2.样本数目太大的话,一般的mini-batch大小为64到512,考虑到电脑的内存问题,如果是2的n次方会快些,如64,128,256,512
3.指数加权平均(指数加权平均数)
指数加权平均的关键函数:
v
t
=
β
v
t
−
1
+
(
1
−
β
)
θ
t
v_{t}=\beta v_{t-1}+(1-\beta)\theta_{t}
vt=βvt−1+(1−β)θt (这里加权平均我们使用的是V_t)
---------------------------------------------------------------------------------
理解指数加权平均
例子,当
β
\beta
β=0.9 时:
v
100
=
0.9
v
99
+
0.1
θ
100
v_{100}=0.9v_{99}+0.1\theta_{100}
v100=0.9v99+0.1θ100
v
98
=
0.9
v
97
+
0.1
θ
98
v_{98}=0.9v_{97}+0.1\theta_{98}
v98=0.9v97+0.1θ98
v
99
=
0.9
v
98
+
0.1
θ
99
v_{99}=0.9v_{98}+0.1\theta_{99}
v99=0.9v98+0.1θ99
. . .
展开则有:
v
100
=
0.1
θ
100
+
0.9
(
0.1
θ
99
+
0.9
(
0.1
θ
98
+
0.9
v
97
)
)
v_{100}=0.1\theta_{100}+0.9(0.1\theta_{99}+0.9(0.1\theta_{98}+0.9v_{97}))
v100=0.1θ100+0.9(0.1θ99+0.9(0.1θ98+0.9v97))
=
0.1
θ
100
+
0.1
×
0.9
θ
99
+
0.1
×
(
0.9
)
2
θ
98
+
0.1
×
(
0.9
)
3
θ
97
+
.
.
.
=0.1\theta_{100}+0.1\times0.9\theta_{99}+0.1\times(0.9)^{2}\theta_{98}+ 0.1\times(0.9)^{3}\theta_{97}+...
=0.1θ100+0.1×0.9θ99+0.1×(0.9)2θ98+0.1×(0.9)3θ97+...
对于上面的公式,可以如下图来理解,图一为温度数据,图二为指数衰减函数,公式为 y = 0.1 ∗ ( 0.9 ) n y=0.1*(0.9)^{n} y=0.1∗(0.9)n,上面公式即为俩个图对应天数的数据的乘积的和。
上式中,所有 θ \theta θ前面的系数相加起来为1或者接近于1,称之为偏差修正。
总体来说存在, ( 1 − ε ) 1 / ε = 1 e (1-\varepsilon)^{1/\varepsilon}=\frac{1}{e} (1−ε)1/ε=e1,在我们的例子中, ( 1 − ε ) = β = 0.9 (1-\varepsilon)=\beta=0.9 (1−ε)=β=0.9,即 0. 9 10 ≈ 0.35 ≈ 1 e 0.9^{10}\approx0.35\approx\frac{1}{e} 0.910≈0.35≈e1 (0.36左右),只关注了过去10天的天气。
为什么这么说只关注了10天的天气呢?
这是因为,当其权重小于原来的1/e 后,就认为小于原来1/e后面的数据已经不重要了,这点很重要。
------------------------------------------------------------------------------------
当
β
=
0.9
\beta=0.9
β=0.9,该指数加权平均只关注了(1/(1-0.9))=10天的温度,而当
β
=
0.98
\beta=0.98
β=0.98,则该指数加权平均关注了(1/(1-0.98))=50 天的温度,曲线变化如下(红色表示0.9的,绿色表示0.98的):
0.98这个曲线,波动更小,更加平坦,缺点是曲线进一步右移,因为关注的天数升高了,同时也要平均更多的值。平均更多的值,指数加权平均在温度变化的时候,适应地更缓慢一些,毕竟0.98的时候,只是给了0.02给当天温度。
如果 β = 0.9 \beta=0.9 β=0.9,那么变化曲线如下黄色部分所示,能够更好的适应温度变化:
-------------------------------------------------------------------
理解修正偏差:
在我们执行指数加权平均的公式时,当
β
\beta
β=0.98时,我们得到的不是图中的绿色曲线,而是下图的紫色曲线,起点较低:
原因是当计算初始化加权平均的时候,由于初始化v0=0,所以在前期的时候计算出来的v都比正常值要小很多。
使用偏差修正:
修正系数为:
1
1
−
β
t
\frac{1}{1-\beta^{t}}
1−βt1
假如1天的温度为40度, β = 0.98 \beta=0.98 β=0.98,那么本来v1=0.980+0.0240=8(差距很大),如果是加了修正系数,那么就变为v1=v1/(1-0.98)=40(刚好等于)。
对于v2也是,如果不加修正效果,假设 θ 2 \theta_{2} θ2=35,不加修正效果为:
v 2 = 0.98 v 1 + 0.02 θ 2 = 0.98 ∗ 0.02 θ 1 + 0.02 θ 2 = 0.0196 θ 1 + 0.02 θ 2 v_{2}=0.98v_{1}+0.02\theta_{2}=0.98*0.02\theta_{1}+0.02\theta_{2}=0.0196\theta_{1}+0.02\theta_{2} v2=0.98v1+0.02θ2=0.98∗0.02θ1+0.02θ2=0.0196θ1+0.02θ2=1.484,如果加了修正系数,则乘以1/(1-0.98*0.98),结果为37.47(结果与35接近)
当t越大时,修正系数越接近1。
4.动量梯度下降法(Momentum)
动量梯度下降的基本思想就是计算梯度的指数加权平均数,并利用该梯度来更新权重。
在我们优化Cost function的时候,以下图所示的函数图为例:
在利用梯度下降法来最小化该函数的时候,每一次迭代所更新的代价函数如图蓝色线所示在上下波动,减缓了梯度下降的速度,而且我们只能使用一个较小的学习率迭代。因为怕跑出了函数。
但是我们希望函数(如上所示),在纵向波动小点,在横向波动大点,这样子能快点到达最小点但是又不会超出函数值,如红色线所示。
β \beta β常用值为0.9,比较好的鲁棒数。 v d w v_{dw} vdw表示的是之前的梯度下降的值,然后 d w dw dw表示的是当前算出来的,所以现在的每一步迭代其实是跟之前的值是有关的。
在我们进行动量梯度下降算法的时候,由于使用了指数加权平均的方法。原来在纵轴方向上的上下波动,经过平均以后,接近于0,纵轴上的波动变得非常的小。但是横轴因为所有平均值都很小,所以平均值也很大。
算法的本质解释:
将Cost function想象为一个碗状,想象从顶部往下滚球,其中:
微分项:dw,db为球提供的加速度;
动量项:vdw,vdb相当于速度
小球在向下滚动的过程中,因为加速度的存在使得速度会变快,但是由于 β \beta β的存在,其值小于1,可认为是摩擦力,所以球不会无限加速下去。
5.RMSprop(Root Mean Square Prop)
跟上面说的差不多,梯度在纵轴和横轴的波动都挺大的,假设b为纵轴,w为横轴,我们需要的是减缓b的学习,同时加快(至少不是减缓)w的学习率,关键函数如下:
S
d
w
=
β
S
d
w
+
(
1
−
β
)
d
w
2
S_{dw}=\beta S_{dw}+(1-\beta)dw^{2}
Sdw=βSdw+(1−β)dw2 (后面对dw平方是针对整个符号而言的)
S
d
b
=
β
S
d
b
+
(
1
−
β
)
d
b
2
S_{db}=\beta S_{db}+(1-\beta)db^{2}
Sdb=βSdb+(1−β)db2
到后面更新部分:
w
=
w
−
α
d
w
S
d
w
w=w-\alpha\frac{dw}{\sqrt{S_{dw}}}
w=w−αSdwdw(dw是当前计算出来的梯度)
b = b − α d b S d b b=b-\alpha\frac{db}{\sqrt{S_{db}}} b=b−αSdbdb
为了避免 S d w , S d b S_{dw},S_{db} Sdw,Sdb接近于0,我们需要保证数值能稳定一些,在分母加一个很小很小的 ε \varepsilon ε, ε = 1 0 − 8 \varepsilon=10^{-8} ε=10−8 是一个不错的选择。
所以,我们需要的是 S d w S_{dw} Sdw可以小一点, S d b S_{db} Sdb可以稍微大点,这样子在迭代过程中可以适当的减少纵轴的变化(这里的纵轴b和横轴w只是为了方便展示而已)。
进行RMSprop后,得到的曲线如下(绿色曲线为采用了RMSprop后的变化趋势):
6.Adam(Adaptive Moment Estimation)优化算法
Adam算法就是将RMSprop算法和Momentum算法给结合起来,先假设
1.
V
d
w
=
0
,
S
d
w
=
0
,
V
d
b
=
0
,
S
d
b
=
0
V_{dw}=0,S_{dw}=0,V_{db}=0,S_{db}=0
Vdw=0,Sdw=0,Vdb=0,Sdb=0
在第t次迭代中,我们使用的是mini_batch
2.然后计算Momentum:
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
这里我们更新了超参数
β
1
\beta_{1}
β1
3.接着计算RMSprop
S
d
W
=
β
2
V
d
W
+
(
1
−
β
2
)
(
d
W
)
2
S_{dW}=\beta_{2}V_{dW}+(1-\beta_{2})(dW)^{2}
SdW=β2VdW+(1−β2)(dW)2
S
d
b
=
β
2
V
d
b
+
(
1
−
β
2
)
(
d
b
)
2
S_{db}=\beta_{2}V_{db}+(1-\beta_{2})(db)^{2}
Sdb=β2Vdb+(1−β2)(db)2
这里我们更新了超参数
β
2
\beta_{2}
β2
4.一般使用Adam算法的时候,需要采用修正偏差
对Momentum进行参数调整:
V d w c o r r e c t = V d w / ( 1 − β 1 t ) V_{dw}^{correct}=V_{dw}/(1-\beta_{1}^{t}) Vdwcorrect=Vdw/(1−β1t)
V d b c o r r e c t = V d b / ( 1 − β 1 t ) V_{db}^{correct}=V_{db}/(1-\beta_{1}^{t}) Vdbcorrect=Vdb/(1−β1t)
对于RMSprop进行参数调整:
S d w c o r r e c t = S d w / ( 1 − β 2 t ) S_{dw}^{correct}=S_{dw}/(1-\beta_{2}^{t}) Sdwcorrect=Sdw/(1−β2t)
S d b c o r r e c t = S d b / ( 1 − β 2 t ) S_{db}^{correct}=S_{db}/(1-\beta_{2}^{t}) Sdbcorrect=Sdb/(1−β2t)
则有 :
W
=
W
−
α
V
d
w
c
o
r
r
e
c
t
S
d
w
c
o
r
r
e
c
t
+
ε
W=W-\alpha\frac{V_{dw}^{correct}}{\sqrt{S_{dw}^{correct}}+\varepsilon}
W=W−αSdwcorrect+εVdwcorrect
b = b − α V d b c o r r e c t S d b c o r r e c t + ε b=b-\alpha\frac{V_{db}^{correct}}{\sqrt{S_{db}^{correct}}+\varepsilon} b=b−αSdbcorrect+εVdbcorrect
对于上面的超参数(Hyperameters):
学习率
α
\alpha
α,要不断的调整。
至于超参数
β
1
\beta_{1}
β1,缺省值为0.9,(dW)
对于超参数
β
2
\beta_{2}
β2,缺省值为0.999 (
d
W
2
dW^{2}
dW2)
关于
ε
\varepsilon
ε的选择大概为
1
0
−
8
10^{-8}
10−8
7.学习率衰减(Learning rate decay)
为什么要计算学习率衰减?
假设使用的是mini_batch梯度下降法,在迭代过程中会有噪音,可以迭代,但是会使得迭代到最后在最小点附近波动。
但是如果我们使用学习率衰减,逐渐减小学习率 α \alpha α,在算法开始的时候,学习速率还是相对较快,能够相对快速的向最小值点的方向下降。但是随着" α \alpha α的减小,下降的步伐也会逐渐变小,最终会在最小值附近的一块最小的区域里波动,如图中绿色线所示:
我们可以这样定义学习率: α = 1 1 + d e c a y r a t e ∗ e p o c h n u m ∗ α 0 \alpha=\frac{1}{1+decayrate*epochnum}\ast \alpha_{0} α=1+decayrate∗epochnum1∗α0 (其中 α 0 \alpha_{0} α0为初始学习率,epochnum表示的是遍历数据集的次数。
也有其他公式如: α = 0.9 5 e p p c h n u m α 0 \alpha=0.95^{eppch_num}\alpha_{0} α=0.95eppchnumα0
其他: α = k e p o c h n u m α 0 \alpha=\frac{k}{epochnum}\alpha_{0} α=epochnumkα0
其中,当我们有10000个样本,每个min_batch 有1000个样本,则我们有10个min_batch,当我们历遍一次样本集,即历遍10次min_batch,epochnum+1。
8.局部最优问题
如上图左图所示,在低维的情况下,我们可能经常得到局部最优值,但是如果我们在高维的时候,很少会碰到局部极小值,更多的是鞍点。
在高纬度的情况下:
1.几乎不可能陷入局部最小点。
2.处于鞍点的停滞区会减缓学习过程,利用如Adam等算法进行改善。