6.优化算法

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=10001i=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=10001i=1lL(y^i,yi)+2×1000λw[l]F2
m样本量变为了1000


理解mini-batch梯度下降法

batch梯度下降:每次迭代需要遍历所有整个训练集

mini-batch梯度下降:不是每次迭代都是在下降的,每一次只是处理划分开的部分样本集,Jt只和Xt,YtJ^{t}只和X^{t},Y^{t}JtXt,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.9vi1+0.1vi(i=1,2,...,n)
此移动平均值大致就是图中的红线

通用公式:vt=βvt−1+(1−β)θtv_t=\beta v_{t-1}+(1-\beta)\theta _tvt=βvt1+(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θ100k+...

0.1 – 0.1×0.9−−0.1×(0.9)20.1\times{0.9} -- 0.1\times{(0.9)^2}0.1×0.90.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.90.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×(10.91×(10.9n1))

当n趋于∞时,lim⁡n→∞0.9n−1=0\lim_{n \to \infty}0.9^{n-1}=0nlim0.9n1=0

所以相加等于1

课程中认为曲线高度下降到13\frac{1}{3}31左右,相当于这一天的权重是一个很小的数值了

(1−ε)1ε≈1e(1-\varepsilon)^{\frac{1}{\varepsilon}}\approx\frac{1}{e}(1ε)ε1e1大约是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βvt1+(1β)θt

为什么如此呢?

在初始时,v0=0v_0=0v0=0v1=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比真值小了很多很多。

所以在初始值很小的时候,可以考虑用偏差修正。


动量梯度下降法

计算梯度的指数加权移动平均数,并利用该梯度更新权重

如果是传统的梯度下降,其会上下波动,减慢速度

另一个角度就是,在纵轴上你希望学习的慢一些,而在横轴上你希望学习的快一些。

要做的就是:

  1. vdW=βvdW+(1−β)dWv_{dW}=\beta v_{dW} + (1-\beta)dWvdW=βvdW+(1β)dW
  2. 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

  1. 计算微分,一般采用mini-batch梯度下降法

  2. 计算动量梯度下降法

    1. vdW=β1vdW+(1−β1)dWv_{dW}=\beta_1 v_{dW} + (1-\beta_1)dWvdW=β1vdW+(1β1)dW
    2. vdb=β1vdb+(1−β1)dbv_{db}=\beta_1 v_{db} + (1-\beta_1)dbvdb=β1vdb+(1β1)db
  3. 用RMSprop进行更新

    1. SdW=β2SdW+(1−β2)dW2S_{dW}=\beta_2 S_{dW} + (1-\beta_2)dW^2SdW=β2SdW+(1β2)dW2
    2. Sdb=β2Sdb+(1−β2)db2S_{db}=\beta_2 S_{db} + (1-\beta_2)db^2Sdb=β2Sdb+(1β2)db2
  4. 一般要进行偏差修正

    1. vdWcorrected=vdW1−β1tv_{dW}^{corrected}=\frac{v_{dW}}{1-\beta_1^t}vdWcorrected=1β1tvdW
    2. vdbcorrected=vdb1−β1tv_{db}^{corrected}=\frac{v_{db}}{1-\beta_1^t}vdbcorrected=1β1tvdb
    3. SdWcorrected=SdW1−β2tS_{dW}^{corrected}=\frac{S_{dW}}{1-\beta_2^t}SdWcorrected=1β2tSdW
    4. Sdbcorrected=Sdb1−β2tS_{db}^{corrected}=\frac{S_{db}}{1-\beta_2^t}Sdbcorrected=1β2tSdb
  5. 更新权重

    1. W=W−αvdWcorrectedSdWcorrected+εW=W-\frac{\alpha v_{dW}^{corrected}}{\sqrt{S_{dW}^{corrected}}+\varepsilon}W=WSdWcorrected+εαvdWcorrected
    2. b=b−αvdbcorrectedSdbcorrected+εb=b-\frac{\alpha v_{db}^{corrected}}{\sqrt{S_{db}^{corrected}}+\varepsilon}b=bSdbcorrected+εαvdbcorrected

α\alphaα毋庸置疑它很重要,β1\beta_1β1的缺省值是0.9,β2\beta_2β2推荐0.999
ε\varepsilonε推荐使用10−810^{-8}108


学习率衰减

假设使用mini-batch梯度下降法,在迭代过程会有噪音,最后在最小值附近摆动,并不会真正收敛于最小值。

慢慢较少α\alphaα,最后可以在最小值附近的一小块区域摆动。

α=11+decayrate∗epochnumα0\alpha=\frac{1}{1+decayrate*epoch_num}\alpha_0α=1+decayrateepochnum1α0

decayrate:衰减率
epoch-num:代数
α0\alpha_0α0初始学习率

除此还有,指数衰减:
α=0.95epoch−numα0\alpha=0.95^{epoch-num}\alpha_0α=0.95epochnumα0
还有:
α=kepoch−numα0\alpha=\frac{k}{\sqrt{epoch-num}}\alpha_0α=epochnumkα0


局部最优问题

在参数很多的情况下,很少会困在极差的局部最优当中

比起上,平稳段的学习速率缓慢才是要点,这时,Momentum,RMSprop,Adam可以加快速度。

原因我认为是它考虑了历史因素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值