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


理解mini-batch梯度下降法

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

mini-batch梯度下降:不是每次迭代都是在下降的,每一次只是处理划分开的部分样本集, J t 只 和 X t , Y t J^{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之间的某一个 2 n 2^n 2n

? mini-batch和CPU/GPU内存不相符导致算法的表现急转直下是指大了还是小了?


指数加权平均数

移动平均值
比如上图的温度图:
假设权值是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.9vi1+0.1vi(i=1,2,...,n)
此移动平均值大致就是图中的红线

通用公式: v t = β v t − 1 + ( 1 − β ) θ t v_t=\beta v_{t-1}+(1-\beta)\theta _t vt=βvt1+(1β)θt

β \beta β较大时,指数加权平均适应的更一些

权重越大,平均以往的天数要多一些,越小,则当日温度影响较大

红线: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θ100k+...

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以此类推,得到了一个指数衰减函数

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. 9 n − 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. 9 n − 1 = 0 \lim_{n \to \infty}0.9^{n-1}=0 nlim0.9n1=0

所以相加等于1

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

( 1 − ε ) 1 ε ≈ 1 e (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天的函数

指数加权移动平均的好处在于计算过程占用内存极少,缺点是若需要储存,占用内存极大


偏差修正

v t = β v t − 1 + ( 1 − β ) θ t β t v_t=\frac{\beta v_{t-1}+(1-\beta)\theta _{t}}{\beta ^t} vt=βtβvt1+(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比真值小了很多很多。

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


动量梯度下降法

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

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

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

要做的就是:

  1. v d W = β v d W + ( 1 − β ) d W v_{dW}=\beta v_{dW} + (1-\beta)dW vdW=βvdW+(1β)dW
  2. 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较大

蓝线是动量梯度下降,绿线是RMSprop


Adam算法

初始化为0

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

  2. 计算动量梯度下降法

    1. 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
    2. 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
  3. 用RMSprop进行更新

    1. 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
    2. 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
  4. 一般要进行偏差修正

    1. 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
    2. 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
    3. 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
    4. 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
  5. 更新权重

    1. 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=WSdWcorrected +εαvdWcorrected
    2. 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=bSdbcorrected +εαvdbcorrected

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


学习率衰减

假设使用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+decayrateepochnum1α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.95epochnumα0
还有:
α = k e p o c h − n u m α 0 \alpha=\frac{k}{\sqrt{epoch-num}}\alpha_0 α=epochnum kα0


局部最优问题

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值