改善深层神经网络:超参数调试、正则化以及优化——优化算法(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)(维数) ,但是当样本足够大的时候,例如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)}]

输出: 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)}]

如果算1000个元素为一个Mini_batch,那么总数为5w,则一共有50组,分别命名为
X: X[1],X[2], ,X[50]X^{[1]},X^{[2]},\cdots ,X^{[50]} (本来这个是用{}表示的,但是软件问题,用[ ])
Y: Y[1],Y[2], ,Y[50]Y^{[1]},Y^{[2]},\cdots,Y^{[50]}

Mini-batch的数量t组成了**X[t]**和**Y[t]**包含相应的输入输出,对应的维数分别为(nx,1000)(n_{x},1000)(1,1000)(1,1000),尽管把整一个数据集进行了分块,但是需要遍历这些Mini_batch,一共有50000/1000=50,则需要遍历50次。

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

上述图片中,for i in range(50) 指的是当你将大的数据集划分成很多小组 (X[n],Y[n]X^{[n]},Y^{[n]})的时候,对这些mini-batch进行逐个forward propagation 和 back propagation。

对于batch梯度下降法而言,遍历一次

2.理解mini-batch

batch梯度下降法和mini梯度下降法的下降曲线如下:
改善深层神经网络:超参数调试、正则化以及优化——优化算法(2-2)

mini_batch 的方法之所以会比较抖,主要是因为在一代训练中,不断的用较少的样本来对W和b进行优化,每次都会向局部最小值上走,导致比较震荡,但是总体的趋势还是不变的。

在极端情况下,如果mini-batch集合的元素等于m,所以把mini-batch大小设为m就可以得到batch梯度下降法。在另一种极端情况下,假设mini-batch大小为1,就有了新的算法,叫做随机梯度下降法每个样本都是独立的mini-batch,( X[1],Y[1]X^{[1]},Y^{[1]}) 则为第一个训练集样本,如下所示,bacth比较按照正常的状态下降,而Mini-batch则会向着相应的局部最小值下降,永不不会收敛,而是在最小值附近波动。

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

当样本过大的时候:把所有的样本放在同一个矩阵,会导致迭代速度变慢。但是如果mini-batch所选的尺寸太小,如果单单只选择1的话,就是失去了向量化的意义,所以要选择合适的mini-batch尺寸。

如何选择mini-batch的尺寸呢?
1.如果训练集太小,直接使用batch梯度下降法(样本数<2000)
2.样本数目太大的话,一般的mini-batch大小为64到512,考虑到电脑的内存问题,如果是2的n次方会快些,如64,128,256,512

3.指数加权平均(指数加权平均数)

指数加权平均的关键函数:
vt=βvt1+(1β)θtv_{t}=\beta v_{t-1}+(1-\beta)\theta_{t} (这里加权平均我们使用的是V_t)

---------------------------------------------------------------------------------

理解指数加权平均
例子,当 β\beta=0.9 时:
v100=0.9v99+0.1θ100v_{100}=0.9v_{99}+0.1\theta_{100}
v98=0.9v97+0.1θ98v_{98}=0.9v_{97}+0.1\theta_{98}
v99=0.9v98+0.1θ99v_{99}=0.9v_{98}+0.1\theta_{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})) =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}+...

对于上面的公式,可以如下图来理解,图一为温度数据,图二为指数衰减函数,公式为 y=0.1(0.9)ny=0.1*(0.9)^{n},上面公式即为俩个图对应天数的数据的乘积的和。

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

上式中,所有θ\theta前面的系数相加起来为1或者接近于1,称之为偏差修正。

总体来说存在,(1ε)1/ε=1e(1-\varepsilon)^{1/\varepsilon}=\frac{1}{e},在我们的例子中, (1ε)=β=0.9(1-\varepsilon)=\beta=0.9,即0.9100.351e0.9^{10}\approx0.35\approx\frac{1}{e} (0.36左右),只关注了过去10天的天气。

为什么这么说只关注了10天的天气呢?
这是因为,当其权重小于原来的1/e 后,就认为小于原来1/e后面的数据已经不重要了,这点很重要。

------------------------------------------------------------------------------------
β=0.9\beta=0.9,该指数加权平均只关注了(1/(1-0.9))=10天的温度,而当 β=0.98\beta=0.98,则该指数加权平均关注了(1/(1-0.98))=50 天的温度,曲线变化如下(红色表示0.9的,绿色表示0.98的):

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

0.98这个曲线,波动更小,更加平坦,缺点是曲线进一步右移,因为关注的天数升高了,同时也要平均更多的值。平均更多的值,指数加权平均在温度变化的时候,适应地更缓慢一些,毕竟0.98的时候,只是给了0.02给当天温度。

如果 β=0.9\beta=0.9,那么变化曲线如下黄色部分所示,能够更好的适应温度变化:

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

-------------------------------------------------------------------
理解修正偏差:
在我们执行指数加权平均的公式时,当 β\beta=0.98时,我们得到的不是图中的绿色曲线,而是下图的紫色曲线,起点较低:

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

原因是当计算初始化加权平均的时候,由于初始化v0=0,所以在前期的时候计算出来的v都比正常值要小很多。

使用偏差修正:
修正系数为11βt\frac{1}{1-\beta^{t}}

假如1天的温度为40度,β=0.98\beta=0.98,那么本来v1=0.980+0.0240=8(差距很大),如果是加了修正系数,那么就变为v1=v1/(1-0.98)=40(刚好等于)。

对于v2也是,如果不加修正效果,假设 θ2\theta_{2}=35,不加修正效果为:

v2=0.98v1+0.02θ2=0.980.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}=1.484,如果加了修正系数,则乘以1/(1-0.98*0.98),结果为37.47(结果与35接近)

当t越大时,修正系数越接近1。

4.动量梯度下降法(Momentum)

动量梯度下降的基本思想就是计算梯度的指数加权平均数,并利用该梯度来更新权重。

在我们优化Cost function的时候,以下图所示的函数图为例:
改善深层神经网络:超参数调试、正则化以及优化——优化算法(2-2)
在利用梯度下降法来最小化该函数的时候,每一次迭代所更新的代价函数如图蓝色线所示在上下波动,减缓了梯度下降的速度,而且我们只能使用一个较小的学习率迭代。因为怕跑出了函数。

但是我们希望函数(如上所示),在纵向波动小点,在横向波动大点,这样子能快点到达最小点但是又不会超出函数值,如红色线所示。

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

β\beta常用值为0.9,比较好的鲁棒数。vdwv_{dw}表示的是之前的梯度下降的值,然后 dwdw表示的是当前算出来的,所以现在的每一步迭代其实是跟之前的值是有关的。

在我们进行动量梯度下降算法的时候,由于使用了指数加权平均的方法。原来在纵轴方向上的上下波动,经过平均以后,接近于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} (后面对dw平方是针对整个符号而言的)
Sdb=βSdb+(1β)db2S_{db}=\beta S_{db}+(1-\beta)db^{2}
到后面更新部分:
w=wαdwSdww=w-\alpha\frac{dw}{\sqrt{S_{dw}}}(dw是当前计算出来的梯度)

b=bαdbSdbb=b-\alpha\frac{db}{\sqrt{S_{db}}}

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

所以,我们需要的是SdwS_{dw}可以小一点, SdbS_{db}可以稍微大点,这样子在迭代过程中可以适当的减少纵轴的变化(这里的纵轴b和横轴w只是为了方便展示而已)。

进行RMSprop后,得到的曲线如下(绿色曲线为采用了RMSprop后的变化趋势):

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

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}=0
在第t次迭代中,我们使用的是mini_batch

2.然后计算Momentum:

Vdw=β1Vdw+(1β1)dWV_{dw}=\beta_{1}V_{dw}+(1-\beta_{1})dW
Vdb=β1Vdb+(1β1)dbV_{db}=\beta_{1}V_{db}+(1-\beta_{1})db

这里我们更新了超参数 β1\beta_{1}
3.接着计算RMSprop

SdW=β2VdW+(1β2)(dW)2S_{dW}=\beta_{2}V_{dW}+(1-\beta_{2})(dW)^{2}
Sdb=β2Vdb+(1β2)(db)2S_{db}=\beta_{2}V_{db}+(1-\beta_{2})(db)^{2}
这里我们更新了超参数 β2\beta_{2}

4.一般使用Adam算法的时候,需要采用修正偏差

对Momentum进行参数调整:

Vdwcorrect=Vdw/(1β1t)V_{dw}^{correct}=V_{dw}/(1-\beta_{1}^{t})

Vdbcorrect=Vdb/(1β1t)V_{db}^{correct}=V_{db}/(1-\beta_{1}^{t})

对于RMSprop进行参数调整:

Sdwcorrect=Sdw/(1β2t)S_{dw}^{correct}=S_{dw}/(1-\beta_{2}^{t})

Sdbcorrect=Sdb/(1β2t)S_{db}^{correct}=S_{db}/(1-\beta_{2}^{t})

则有 :
W=WαVdwcorrectSdwcorrect+εW=W-\alpha\frac{V_{dw}^{correct}}{\sqrt{S_{dw}^{correct}}+\varepsilon}

b=bαVdbcorrectSdbcorrect+εb=b-\alpha\frac{V_{db}^{correct}}{\sqrt{S_{db}^{correct}}+\varepsilon}

对于上面的超参数(Hyperameters):
学习率 α\alpha,要不断的调整。
至于超参数 β1\beta_{1},缺省值为0.9,(dW)
对于超参数 β2\beta_{2},缺省值为0.999 ( dW2dW^{2}
关于ε\varepsilon的选择大概为 10810^{-8}

7.学习率衰减(Learning rate decay)

为什么要计算学习率衰减?
假设使用的是mini_batch梯度下降法,在迭代过程中会有噪音,可以迭代,但是会使得迭代到最后在最小点附近波动。

但是如果我们使用学习率衰减,逐渐减小学习率 α\alpha,在算法开始的时候,学习速率还是相对较快,能够相对快速的向最小值点的方向下降。但是随着" α\alpha的减小,下降的步伐也会逐渐变小,最终会在最小值附近的一块最小的区域里波动,如图中绿色线所示:

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

我们可以这样定义学习率: α=11+decayrateepochnumα0\alpha=\frac{1}{1+decayrate*epochnum}\ast \alpha_{0} (其中 α0\alpha_{0}为初始学习率,epochnum表示的是遍历数据集的次数。

也有其他公式如:α=0.95eppchnumα0\alpha=0.95^{eppch_num}\alpha_{0}

其他:α=kepochnumα0\alpha=\frac{k}{epochnum}\alpha_{0}

其中,当我们有10000个样本,每个min_batch 有1000个样本,则我们有10个min_batch,当我们历遍一次样本集,即历遍10次min_batch,epochnum+1。

8.局部最优问题

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

如上图左图所示,在低维的情况下,我们可能经常得到局部最优值,但是如果我们在高维的时候,很少会碰到局部极小值,更多的是鞍点。

在高纬度的情况下:
1.几乎不可能陷入局部最小点。
2.处于鞍点的停滞区会减缓学习过程,利用如Adam等算法进行改善。