改善深层神经网络:超参数调试、正则化以及优化——优化算法(2-2)

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=βvt1+(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.9100.35e1 (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.980.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αSdw dw(dw是当前计算出来的梯度)

b = b − α d b S d b b=b-\alpha\frac{db}{\sqrt{S_{db}}} b=bαSdb db

为了避免 S d w , S d b S_{dw},S_{db} Sdw,Sdb接近于0,我们需要保证数值能稳定一些,在分母加一个很小很小的 ε \varepsilon ε ε = 1 0 − 8 \varepsilon=10^{-8} ε=108 是一个不错的选择。

所以,我们需要的是 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} 108

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+decayrateepochnum1α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等算法进行改善。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值