改善深层神经网络:超参数调试、正则化以及优化——优化算法(2-2)
1.Mini-batch梯度下降法
对于m个数据样本,在训练神经网络的时候,最常用的是向量化,如:X=[x(1),x(2),...,x(m)],x(nx,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]**包含相应的输入输出,对应的维数分别为(nx,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.指数加权平均(指数加权平均数)
指数加权平均的关键函数:
vt=βvt−1+(1−β)θtv_{t}=\beta v_{t-1}+(1-\beta)\theta_{t}vt=βvt−1+(1−β)θt (这里加权平均我们使用的是V_t)
---------------------------------------------------------------------------------
理解指数加权平均
例子,当 β\betaβ=0.9 时:
v100=0.9v99+0.1θ100v_{100}=0.9v_{99}+0.1\theta_{100}v100=0.9v99+0.1θ100
v98=0.9v97+0.1θ98v_{98}=0.9v_{97}+0.1\theta_{98}v98=0.9v97+0.1θ98
v99=0.9v98+0.1θ99v_{99}=0.9v_{98}+0.1\theta_{99}v99=0.9v98+0.1θ99
. . .
展开则有:
v100=0.1θ100+0.9(0.1θ99+0.9(0.1θ98+0.9v97))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)ny=0.1*(0.9)^{n}y=0.1∗(0.9)n,上面公式即为俩个图对应天数的数据的乘积的和。
上式中,所有θ\thetaθ前面的系数相加起来为1或者接近于1,称之为偏差修正。
总体来说存在,(1−ε)1/ε=1e(1-\varepsilon)^{1/\varepsilon}=\frac{1}{e}(1−ε)1/ε=e1,在我们的例子中, (1−ε)=β=0.9(1-\varepsilon)=\beta=0.9(1−ε)=β=0.9,即0.910≈0.35≈1e0.9^{10}\approx0.35\approx\frac{1}{e}0.910≈0.35≈e1 (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都比正常值要小很多。
使用偏差修正:
修正系数为: 11−β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,不加修正效果为:
v2=0.98v1+0.02θ2=0.98∗0.02θ1+0.02θ2=0.0196θ1+0.02θ2v_{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.98∗0.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,比较好的鲁棒数。vdwv_{dw}vdw表示的是之前的梯度下降的值,然后 dwdwdw表示的是当前算出来的,所以现在的每一步迭代其实是跟之前的值是有关的。
在我们进行动量梯度下降算法的时候,由于使用了指数加权平均的方法。原来在纵轴方向上的上下波动,经过平均以后,接近于0,纵轴上的波动变得非常的小。但是横轴因为所有平均值都很小,所以平均值也很大。
算法的本质解释:
将Cost function想象为一个碗状,想象从顶部往下滚球,其中:
微分项:dw,db为球提供的加速度;
动量项:vdw,vdb相当于速度
小球在向下滚动的过程中,因为加速度的存在使得速度会变快,但是由于 β\betaβ的存在,其值小于1,可认为是摩擦力,所以球不会无限加速下去。
5.RMSprop(Root Mean Square Prop)
跟上面说的差不多,梯度在纵轴和横轴的波动都挺大的,假设b为纵轴,w为横轴,我们需要的是减缓b的学习,同时加快(至少不是减缓)w的学习率,关键函数如下:
Sdw=βSdw+(1−β)dw2S_{dw}=\beta S_{dw}+(1-\beta)dw^{2}Sdw=βSdw+(1−β)dw2 (后面对dw平方是针对整个符号而言的)
Sdb=βSdb+(1−β)db2S_{db}=\beta S_{db}+(1-\beta)db^{2}Sdb=βSdb+(1−β)db2
到后面更新部分:
w=w−αdwSdww=w-\alpha\frac{dw}{\sqrt{S_{dw}}}w=w−αSdwdw(dw是当前计算出来的梯度)
b=b−αdbSdbb=b-\alpha\frac{db}{\sqrt{S_{db}}}b=b−αSdbdb
为了避免Sdw,SdbS_{dw},S_{db}Sdw,Sdb接近于0,我们需要保证数值能稳定一些,在分母加一个很小很小的 ε\varepsilonε, ε=10−8\varepsilon=10^{-8}ε=10−8 是一个不错的选择。
所以,我们需要的是SdwS_{dw}Sdw可以小一点, SdbS_{db}Sdb可以稍微大点,这样子在迭代过程中可以适当的减少纵轴的变化(这里的纵轴b和横轴w只是为了方便展示而已)。
进行RMSprop后,得到的曲线如下(绿色曲线为采用了RMSprop后的变化趋势):
6.Adam(Adaptive Moment Estimation)优化算法
Adam算法就是将RMSprop算法和Momentum算法给结合起来,先假设
1.Vdw=0,Sdw=0,Vdb=0,Sdb=0V_{dw}=0,S_{dw}=0,V_{db}=0,S_{db}=0Vdw=0,Sdw=0,Vdb=0,Sdb=0
在第t次迭代中,我们使用的是mini_batch
2.然后计算Momentum:
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
这里我们更新了超参数 β1\beta_{1}β1
3.接着计算RMSprop
SdW=β2VdW+(1−β2)(dW)2S_{dW}=\beta_{2}V_{dW}+(1-\beta_{2})(dW)^{2}SdW=β2VdW+(1−β2)(dW)2
Sdb=β2Vdb+(1−β2)(db)2S_{db}=\beta_{2}V_{db}+(1-\beta_{2})(db)^{2}Sdb=β2Vdb+(1−β2)(db)2
这里我们更新了超参数 β2\beta_{2}β2
4.一般使用Adam算法的时候,需要采用修正偏差
对Momentum进行参数调整:
Vdwcorrect=Vdw/(1−β1t)V_{dw}^{correct}=V_{dw}/(1-\beta_{1}^{t})Vdwcorrect=Vdw/(1−β1t)
Vdbcorrect=Vdb/(1−β1t)V_{db}^{correct}=V_{db}/(1-\beta_{1}^{t})Vdbcorrect=Vdb/(1−β1t)
对于RMSprop进行参数调整:
Sdwcorrect=Sdw/(1−β2t)S_{dw}^{correct}=S_{dw}/(1-\beta_{2}^{t})Sdwcorrect=Sdw/(1−β2t)
Sdbcorrect=Sdb/(1−β2t)S_{db}^{correct}=S_{db}/(1-\beta_{2}^{t})Sdbcorrect=Sdb/(1−β2t)
则有 :
W=W−αVdwcorrectSdwcorrect+εW=W-\alpha\frac{V_{dw}^{correct}}{\sqrt{S_{dw}^{correct}}+\varepsilon}W=W−αSdwcorrect+εVdwcorrect
b=b−αVdbcorrectSdbcorrect+ε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 ( dW2dW^{2}dW2)
关于ε\varepsilonε的选择大概为 10−810^{-8}10−8
7.学习率衰减(Learning rate decay)
为什么要计算学习率衰减?
假设使用的是mini_batch梯度下降法,在迭代过程中会有噪音,可以迭代,但是会使得迭代到最后在最小点附近波动。
但是如果我们使用学习率衰减,逐渐减小学习率 α\alphaα,在算法开始的时候,学习速率还是相对较快,能够相对快速的向最小值点的方向下降。但是随着" α\alphaα的减小,下降的步伐也会逐渐变小,最终会在最小值附近的一块最小的区域里波动,如图中绿色线所示:
我们可以这样定义学习率: α=11+decayrate∗epochnum∗α0\alpha=\frac{1}{1+decayrate*epochnum}\ast \alpha_{0}α=1+decayrate∗epochnum1∗α0 (其中 α0\alpha_{0}α0为初始学习率,epochnum表示的是遍历数据集的次数。
也有其他公式如:α=0.95eppchnumα0\alpha=0.95^{eppch_num}\alpha_{0}α=0.95eppchnumα0
其他:α=kepochnumα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)