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:(nxn_xnx,m)
Y:(1,m)
向量化能够更快的处理所有的样本。
但如果m很大很大,比如m是5000万
或者更大,每次都要处理5000万个样本才可以下一步。这会导致很慢。
所以可以让梯度下降
先处理一部分
。
将训练集分割成的小一点的子集,它叫做mini-batch,把分割的再组成一个向量,假如按1000来划分子集:
X1=[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:(nxn_xnx,1000)
Y:(1,1000)
利用for循环5000次,每次都去进行梯度下降。
注意向量化执行,一次性处理1000个而不是500万个
损失成本函数J:
J=11000∑i=1lL(y^i,yi)J=\frac{1}{1000}\sum_{i=1}^lL(\hat{y}^i,y^i)J=10001∑i=1lL(y^i,yi)
如果使用了正则化:
J=11000∑i=1lL(y^i,yi)+λ2×1000∑∥w[l]∥F2J=\frac{1}{1000}\sum_{i=1}^lL(\hat{y}^i,y^i)+\frac{\lambda}{2\times{1000}}\sum\Vert{w^{[l]}}\Vert^2_FJ=10001∑i=1lL(y^i,yi)+2×1000λ∑∥w[l]∥F2
m样本量变为了1000
理解mini-batch梯度下降法

batch梯度下降:每次迭代需要遍历所有整个训练集
mini-batch梯度下降:不是每次迭代都是在下降的,每一次只是处理划分开的部分样本集,Jt只和Xt,YtJ^{t}只和X^{t},Y^{t}Jt只和Xt,Yt有关,所以每次迭代在训练不同的样本集
batch左图,较为平滑的下降,mini-batch右图,在下滑过程中出现了许多的噪声。
mini-batch取m–batch
mini-batch取1–随机梯度下降法

上图是随机梯度下降法(紫
)和batch梯度下降(蓝
)
实际上在1-m之间
课程建议:
样本量小于2000—batch梯度下降法比较合适
否则,mini-batch一般选择64-512之间的某一个2n2^n2n
? mini-batch和CPU/GPU内存不相符导致算法的表现急转直下是指大了还是小了?
指数加权平均数

移动平均值
:
比如上图的温度图:
假设权值是0.9,那么移动平均值计算公式就是vi=0.9vi−1+0.1vi(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)
此移动平均值大致就是图中的红线
。
通用公式:vt=βvt−1+(1−β)θtv_t=\beta v_{t-1}+(1-\beta)\theta _tvt=βvt−1+(1−β)θt
当β\betaβ较大时,指数加权平均适应的更慢
一些
权重越大,平均以往的天数要多一些,越小,则当日温度影响较大


红线:0.9,绿线:0.98,黄线:0.5
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+...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)20.1\times{0.9} -- 0.1\times{(0.9)^2}0.1×0.9−−0.1×(0.9)2以此类推,得到了一个指数衰减函数

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.9n−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趋于∞时,limn→∞0.9n−1=0\lim_{n \to \infty}0.9^{n-1}=0n→∞lim0.9n−1=0
所以相加等于1
课程中认为曲线高度下降到13\frac{1}{3}31左右,相当于这一天的权重是一个很小的数值了
(1−ε)1ε≈1e(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天的函数
指数加权移动平均的好处在于计算过程占用内存极少,缺点是若需要储存,占用内存极大
偏差修正
vt=βvt−1+(1−β)θtβtv_t=\frac{\beta v_{t-1}+(1-\beta)\theta _{t}}{\beta ^t}vt=βtβvt−1+(1−β)θt
为什么如此呢?
在初始时,v0=0v_0=0v0=0,v1=0.98v0+0.02v1v1=0.98v_0+0.02v_1v1=0.98v0+0.02v1,但是v0=0v_0=0v0=0所以vt=0.02θt=8v_t=0.02\theta _t=8vt=0.02θt=8比真值小了很多很多。
所以在初始值很小的时候,可以考虑用偏差修正。
动量梯度下降法
计算梯度的指数加权移动平均数,并利用该梯度更新权重
如果是传统的梯度下降,其会上下波动,减慢速度

另一个角度就是,在纵轴上你希望学习的慢一些,而在横轴上你希望学习的快一些。
要做的就是:
- vdW=βvdW+(1−β)dWv_{dW}=\beta v_{dW} + (1-\beta)dWvdW=βvdW+(1−β)dW
- W=W−αvdWW = W - \alpha v_{dW}W=W−αvdW,b=b−αvdbb = b - \alpha v_{db}b=b−αvdb
平均过程当中,由于其记忆性,之前的上下波动意味着有正有负,从而相互抵消,而横轴方向,所有的微分都指向最小值点,所以平均值仍较大,收敛的快一些。
RMSprop
RMSprop全程root mean square prop
假设纵轴代表b,横轴代表WWW,
此处采用新符号:SdWS_{dW}SdW
SdW=βSdW+(1−β)dW2S_{dW}=\beta S_{dW} + (1-\beta)dW^2SdW=βSdW+(1−β)dW2
Sdb=βSdb+(1−β)db2S_{db}=\beta S_{db} + (1-\beta)db^2Sdb=βSdb+(1−β)db2
然后:
W=W−αdWSdW+εW=W-\alpha\frac{dW}{\sqrt{S_{dW}}+\varepsilon}W=W−αSdW+εdW
b=b−αdbSdb+εb=b-\alpha\frac{db}{\sqrt{S_{db}}+\varepsilon}b=b−αSdb+εdb
希望SdWS_{dW}SdW较小而SdbS_{db}Sdb较大

蓝线是动量梯度下降,绿线是RMSprop
Adam算法
初始化为0
-
计算微分,一般采用mini-batch梯度下降法
-
计算动量梯度下降法
- vdW=β1vdW+(1−β1)dWv_{dW}=\beta_1 v_{dW} + (1-\beta_1)dWvdW=β1vdW+(1−β1)dW
- vdb=β1vdb+(1−β1)dbv_{db}=\beta_1 v_{db} + (1-\beta_1)dbvdb=β1vdb+(1−β1)db
-
用RMSprop进行更新
- SdW=β2SdW+(1−β2)dW2S_{dW}=\beta_2 S_{dW} + (1-\beta_2)dW^2SdW=β2SdW+(1−β2)dW2
- Sdb=β2Sdb+(1−β2)db2S_{db}=\beta_2 S_{db} + (1-\beta_2)db^2Sdb=β2Sdb+(1−β2)db2
-
一般要进行偏差修正
- vdWcorrected=vdW1−β1tv_{dW}^{corrected}=\frac{v_{dW}}{1-\beta_1^t}vdWcorrected=1−β1tvdW
- vdbcorrected=vdb1−β1tv_{db}^{corrected}=\frac{v_{db}}{1-\beta_1^t}vdbcorrected=1−β1tvdb
- SdWcorrected=SdW1−β2tS_{dW}^{corrected}=\frac{S_{dW}}{1-\beta_2^t}SdWcorrected=1−β2tSdW
- Sdbcorrected=Sdb1−β2tS_{db}^{corrected}=\frac{S_{db}}{1-\beta_2^t}Sdbcorrected=1−β2tSdb
-
更新权重
- W=W−αvdWcorrectedSdWcorrected+εW=W-\frac{\alpha v_{dW}^{corrected}}{\sqrt{S_{dW}^{corrected}}+\varepsilon}W=W−SdWcorrected+εαvdWcorrected
- b=b−αvdbcorrectedSdbcorrected+ε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ε推荐使用10−810^{-8}10−8
学习率衰减

假设使用mini-batch梯度下降法,在迭代过程会有噪音,最后在最小值附近摆动,并不会真正收敛于最小值。
慢慢较少α\alphaα,最后可以在最小值附近的一小块区域摆动。
α=11+decayrate∗epochnumα0\alpha=\frac{1}{1+decayrate*epoch_num}\alpha_0α=1+decayrate∗epochnum1α0
decayrate:衰减率
epoch-num:代数
α0\alpha_0α0初始学习率
除此还有,指数衰减:
α=0.95epoch−numα0\alpha=0.95^{epoch-num}\alpha_0α=0.95epoch−numα0
还有:
α=kepoch−numα0\alpha=\frac{k}{\sqrt{epoch-num}}\alpha_0α=epoch−numkα0
局部最优问题
在参数很多的情况下,很少会困在极差的局部最优当中
比起上,平稳段的学习速率缓慢才是要点,这时,Momentum,RMSprop,Adam可以加快速度。
原因我认为是它考虑了历史因素。