Mini-batch 梯度下降
向量化:
把训练样本放到一个巨大的矩阵X中:
X = [ x [ 1 ] , x [ 2 ] , . . . , x [ m ] ] X = [x^{[1]},x^{[2]},...,x^{[m]}] X=[x[1],x[2],...,x[m]]
Y = [ y [ 1 ] , y [ 2 ] , . . . , y [ m ] ] Y = [y^{[1]},y^{[2]},...,y^{[m]}] Y=[y[1],y[2],...,y[m]]
维数:
X:(
n
x
n_x
nx,m)
Y:(1,m)
向量化能够更快的处理所有的样本。
但如果m很大很大,比如m是5000万
或者更大,每次都要处理5000万个样本才可以下一步。这会导致很慢。
所以可以让梯度下降
先处理一部分
。
将训练集分割成的小一点的子集,它叫做mini-batch,把分割的再组成一个向量,假如按1000来划分子集:
X
1
=
[
x
[
1
]
,
x
[
2
]
,
.
.
.
,
x
[
1000
]
]
X^{1}=[x^{[1]},x^{[2]},...,x^{[1000]}]
X1=[x[1],x[2],...,x[1000]]
依次类推
最后有5000个mini-batch
每个维数都是:
X:(
n
x
n_x
nx,1000)
Y:(1,1000)
利用for循环5000次,每次都去进行梯度下降。
注意向量化执行,一次性处理1000个而不是500万个
损失成本函数J:
J
=
1
1000
∑
i
=
1
l
L
(
y
^
i
,
y
i
)
J=\frac{1}{1000}\sum_{i=1}^lL(\hat{y}^i,y^i)
J=10001∑i=1lL(y^i,yi)
如果使用了正则化:
J
=
1
1000
∑
i
=
1
l
L
(
y
^
i
,
y
i
)
+
λ
2
×
1000
∑
∥
w
[
l
]
∥
F
2
J=\frac{1}{1000}\sum_{i=1}^lL(\hat{y}^i,y^i)+\frac{\lambda}{2\times{1000}}\sum\Vert{w^{[l]}}\Vert^2_F
J=10001∑i=1lL(y^i,yi)+2×1000λ∑∥w[l]∥F2
m样本量变为了1000
理解mini-batch梯度下降法
![](https://i-blog.csdnimg.cn/blog_migrate/66b1184c46655713ab96881368da1312.png)
batch梯度下降:每次迭代需要遍历所有整个训练集
mini-batch梯度下降:不是每次迭代都是在下降的,每一次只是处理划分开的部分样本集, J t 只 和 X t , Y t J^{t}只和X^{t},Y^{t} Jt只和Xt,Yt有关,所以每次迭代在训练不同的样本集
batch左图,较为平滑的下降,mini-batch右图,在下滑过程中出现了许多的噪声。
mini-batch取m–batch
mini-batch取1–随机梯度下降法
![](https://i-blog.csdnimg.cn/blog_migrate/e26e3717702f69a9e103f80bbd2699e3.png)
上图是随机梯度下降法(紫
)和batch梯度下降(蓝
)
实际上在1-m之间
课程建议:
样本量小于2000—batch梯度下降法比较合适
否则,mini-batch一般选择64-512之间的某一个
2
n
2^n
2n
? mini-batch和CPU/GPU内存不相符导致算法的表现急转直下是指大了还是小了?
指数加权平均数
![](https://i-blog.csdnimg.cn/blog_migrate/920e7f3e0d8de04f7ca414db8fa3bcf1.png)
移动平均值
:
比如上图的温度图:
假设权值是0.9,那么移动平均值计算公式就是
v
i
=
0.9
v
i
−
1
+
0.1
v
i
(
i
=
1
,
2
,
.
.
.
,
n
)
v_i=0.9v_{i-1}+0.1v_i(i=1,2,...,n)
vi=0.9vi−1+0.1vi(i=1,2,...,n)
此移动平均值大致就是图中的红线
。
通用公式: v t = β v t − 1 + ( 1 − β ) θ t v_t=\beta v_{t-1}+(1-\beta)\theta _t vt=βvt−1+(1−β)θt
当
β
\beta
β较大时,指数加权平均适应的更慢
一些
权重越大,平均以往的天数要多一些,越小,则当日温度影响较大
![](https://i-blog.csdnimg.cn/blog_migrate/e20412acf391d36568b2fba7e4e67c4c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a725e0d0ea27063c08e9c15c9e6432ea.png)
红线:0.9,绿线:0.98,黄线:0.5
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 ) k θ 100 − k + . . . v_{100}=0.1\theta_{100}+0.1\times{(0.9)}\theta_{99}+0.1\times{(0.9)^2}\theta_{98}+0.1\times{(0.9)^3\theta_{97}+...+0.1\times{(0.9)^k}\theta_{100-k}}+... v100=0.1θ100+0.1×(0.9)θ99+0.1×(0.9)2θ98+0.1×(0.9)3θ97+...+0.1×(0.9)kθ100−k+...
0.1 – 0.1 × 0.9 − − 0.1 × ( 0.9 ) 2 0.1\times{0.9} -- 0.1\times{(0.9)^2} 0.1×0.9−−0.1×(0.9)2以此类推,得到了一个指数衰减函数
![](https://i-blog.csdnimg.cn/blog_migrate/2621a8233d9a4ca0020e6cfd814871cb.png)
0.1 – 0.1 × 0.9 − − 0.1 × ( 0.9 ) 2 . . . 0.1\times{0.9} -- 0.1\times{(0.9)^2}... 0.1×0.9−−0.1×(0.9)2...所有着一些相加起来为1
等比数列求和公式:
0.1 × ( 1 × ( 1 − 0. 9 n − 1 ) 1 − 0.9 ) 0.1\times{(\frac{1\times{(1-0.9^{n-1}})}{1-0.9})} 0.1×(1−0.91×(1−0.9n−1))
当n趋于∞时, lim n → ∞ 0. 9 n − 1 = 0 \lim_{n \to \infty}0.9^{n-1}=0 n→∞lim0.9n−1=0
所以相加等于1
课程中认为曲线高度下降到 1 3 \frac{1}{3} 31左右,相当于这一天的权重是一个很小的数值了
( 1 − ε ) 1 ε ≈ 1 e (1-\varepsilon)^{\frac{1}{\varepsilon}}\approx\frac{1}{e} (1−ε)ε1≈e1大约是0.34,0.35
ε
=
0.1
\varepsilon=0.1
ε=0.1
10天后影响较小了,可以看成平均了10天的函数
ε
=
0.02
\varepsilon=0.02
ε=0.02
50天后影响较小,可以看做平均了50天的函数
指数加权移动平均的好处在于计算过程占用内存极少,缺点是若需要储存,占用内存极大
偏差修正
v t = β v t − 1 + ( 1 − β ) θ t β t v_t=\frac{\beta v_{t-1}+(1-\beta)\theta _{t}}{\beta ^t} vt=βtβvt−1+(1−β)θt
为什么如此呢?
在初始时, v 0 = 0 v_0=0 v0=0, v 1 = 0.98 v 0 + 0.02 v 1 v1=0.98v_0+0.02v_1 v1=0.98v0+0.02v1,但是 v 0 = 0 v_0=0 v0=0所以 v t = 0.02 θ t = 8 v_t=0.02\theta _t=8 vt=0.02θt=8比真值小了很多很多。
所以在初始值很小的时候,可以考虑用偏差修正。
动量梯度下降法
计算梯度的指数加权移动平均数,并利用该梯度更新权重
如果是传统的梯度下降,其会上下波动,减慢速度
![](https://i-blog.csdnimg.cn/blog_migrate/a4f0a2d6014498dc33e312febfde05b3.png)
另一个角度就是,在纵轴上你希望学习的慢一些,而在横轴上你希望学习的快一些。
要做的就是:
- v d W = β v d W + ( 1 − β ) d W v_{dW}=\beta v_{dW} + (1-\beta)dW vdW=βvdW+(1−β)dW
- 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
平均过程当中,由于其记忆性,之前的上下波动意味着有正有负,从而相互抵消,而横轴方向,所有的微分都指向最小值点,所以平均值仍较大,收敛的快一些。
RMSprop
RMSprop全程root mean square prop
假设纵轴代表b,横轴代表 W W W,
此处采用新符号: S d W S_{dW} SdW
S d W = β S d W + ( 1 − β ) d W 2 S_{dW}=\beta S_{dW} + (1-\beta)dW^2 SdW=βSdW+(1−β)dW2
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}}+\varepsilon}
W=W−αSdW+εdW
b = b − α d b S d b + ε b=b-\alpha\frac{db}{\sqrt{S_{db}}+\varepsilon} b=b−αSdb+εdb
希望 S d W S_{dW} SdW较小而 S d b S_{db} Sdb较大
![](https://i-blog.csdnimg.cn/blog_migrate/d993643fa8bc02d8043758897849abcf.png)
蓝线是动量梯度下降,绿线是RMSprop
Adam算法
初始化为0
-
计算微分,一般采用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
-
用RMSprop进行更新
- 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)dW2
- 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)db2
-
一般要进行偏差修正
- 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-\frac{\alpha v_{dW}^{corrected}}{\sqrt{S_{dW}^{corrected}}+\varepsilon} W=W−SdWcorrected+εαvdWcorrected
- 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-\frac{\alpha v_{db}^{corrected}}{\sqrt{S_{db}^{corrected}}+\varepsilon} b=b−Sdbcorrected+εαvdbcorrected
α
\alpha
α毋庸置疑它很重要,
β
1
\beta_1
β1的缺省值是0.9,
β
2
\beta_2
β2推荐0.999
ε
\varepsilon
ε推荐使用
1
0
−
8
10^{-8}
10−8
学习率衰减
![](https://i-blog.csdnimg.cn/blog_migrate/851a51307887811dcc8e9af989f232ce.png)
假设使用mini-batch梯度下降法,在迭代过程会有噪音,最后在最小值附近摆动,并不会真正收敛于最小值。
慢慢较少 α \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*epoch_num}\alpha_0 α=1+decayrate∗epochnum1α0
decayrate:衰减率
epoch-num:代数
α
0
\alpha_0
α0初始学习率
除此还有,指数衰减:
α
=
0.9
5
e
p
o
c
h
−
n
u
m
α
0
\alpha=0.95^{epoch-num}\alpha_0
α=0.95epoch−numα0
还有:
α
=
k
e
p
o
c
h
−
n
u
m
α
0
\alpha=\frac{k}{\sqrt{epoch-num}}\alpha_0
α=epoch−numkα0
局部最优问题
在参数很多的情况下,很少会困在极差的局部最优当中
比起上,平稳段的学习速率缓慢才是要点,这时,Momentum,RMSprop,Adam可以加快速度。
原因我认为是它考虑了历史因素。