吴恩达-DeepLearning.ai-Course2-Week2笔记

本周主要讲解加速神经网络的算法

1.小批量梯度下降算法(mini-batch gradient descent)

如果你得训练集数量巨大,500万或者上千万,梯度下降算法会非常慢,如果你让梯度下降在处理完整个巨型的500万训练集之前就开始有所成效,具体来说:首先将你的训练集拆分成更小的微小的训练集,即小批量训练集(mini-batch),注意新符号的引入和维度

所以一共有5000个小批量样例,对于Y也做同样的处理如上图,该算法叫做批量下降梯度算法(batch gradient descent),该算法同时处理整个训练集(有别于小批量梯度下降)

小批量梯度下降:

在训练集上运行小批量梯度下降法的时候,在for循环里,t=1到5000都要运行一遍因为我们有5000个子集,每个子集1000个样例,而小批量梯度下降是,在for循环里用来替代(矢量化的方式计算),那么每次就好像你有一个规模为1000的训练集


遍历是指过一遍训练集,只不过在批量梯度下降算法中,对训练集的一轮处理只能得到一步梯度逼近,而小批量梯度下降法中对训练集的一轮处理,也就是一次遍历,可以得到5000步梯度逼近(因为一共5000份样例,每个样例1000个训练元素,矢量化使这1000个训练元素同时计算,那么一次遍历就是从t=15000 得到了5000步梯度逼近),当然你会一如既往的对训练集进行多轮遍历,可以用另一个for循环或者while循环实现


2. 理解小批量梯度下降算法

    如下图,左侧是批量梯度下降,损失函数很平滑的逐渐变小,不会出现忽大忽小的情况而右边是最小批量下降的函数,会出现忽大忽小的情况,但整体是下降的,之所以有噪声,

是因为计算损失函数的时候,的不同导致损失函数忽大忽小



Choosing your mini-batch size


你必须定义的一个参数是mini-batch的大小,如果m是训练集的大小,一个极端的情况是mini-batch的大小等于m,这样其实就是批量梯度下降,另一个极端情况是把mini-batch的大小设为1,会得到一种叫做随机梯度下降的算法,这里的每条数据就是一个mini-batch

最小梯度下降算法在这两个极端中间,一个在1和m之间的值,因为1和m都太小或者太大了

批量梯度下降算法,你的mini-bath大小就是m,那么你将在每一次迭代中遍历整个训练集,这样最大的缺点是如果你的训练集非常大,就将在每次迭代上花费太长的时间,如果你的训练集比较小,那么它还是一个不错的选择,相反如果你使用随机梯度下降算法使用一个样本来更新梯度没问题,但是其缺点是你失去了利用向量加速运算的机会(因为这里你每次只处理一个训练数据,非常没有效率)所以最好选择一个中间值让mini-batch不能太大也不能太小,这样你的训练才能最快,有两个好处,第一是你可以使用向量的方式运算,第二是你不用等待整个训练集都遍历完一遍才运行梯度下降,而是可以每遍历一遍训练集可以执行5000次梯度下降算法,所以在实践中这样选择mini-batch的大小是最好的


Mini-batch的选取准则:

1>    如果你的训练集较小(小于2000),就使用批量梯度下降算法,这时候没有理由使用小批量梯度下降算法,因为你可以快速的处理整个训练集,所以使用批量梯度下降算法时没问题的

2>否则如果你有一个更大的训练集,一般选择64 128 256 512。。。作为mini-batch的大小,因为计算机内存的布局和访问方式,所以吧mini-batch的大小设置为2的幂数,你的代码会运行的快一些

3>确保你的mini-batch的样本可以放进你的CPU/GPU中

3.指数加权滑动平均




4.修正偏差

5.动量梯度下降算法

算法的主要思想是计算梯度的指数加权平均,然后用这个梯度来更新权重

假设你想要优化一个代价函数,无论用梯度下降还是最小梯度下降,如下图所示,你会发现梯度下降算法会计算很多步,向着最小值缓慢地振荡前进,这种上下振荡会减慢梯度下降的速度,同时也让你无法使用较大的学习率,如果你使用的学习率很大,可能会超调(会超过椭圆发散出去),因此为了避免振荡过大,你只能使用较小的学习率,换一个角度来看这个问题,在纵轴上,你希望学习慢一点,因此你不希望有这些振荡,但是在横轴上,你希望加快学习速度,因为你希望快速的从左到右朝着最小值移动(红点)

下面是实现动量梯度下降的步骤:

对每一次迭代,具体来说,在第t次迭代中,你需要计算导数dw,db(计算当前的小批量dW,db)如果你用的是批量梯度下降算法,则当前的小批量就是你的整个批量,这同样适用于批量梯度下降,如果当前的小批量是整个训练集也同样适用,然后要做的是计算,

如上图所示,注意更新dw和db的方式,这样做可以让梯度下降的每一步变得平滑,

举例来说,假设你计算的前几个导数分别是,可以看出振荡比较大,如果把这些梯度平均一下,你会发现这些震荡在纵轴上的平均值趋近于0,所以在垂直方向上,你会希望减慢速度,正数和负数在计算平均时相互抵消了,平均值接近于0,而在水平方向上,所有导数都指向水平方向的右边,所以水平方向的平均值仍然较大,因此在数次迭代之后,你会发现动量梯度下降算法的每一步在垂直方向上的振荡非常小,且在水平方向上运动的更快,这会让你的算法选择更加直接的路径,或者说减弱了前往最小值的路径上的振荡,如下图所示:


对动量有这样一种直观的解释,可能有助于部分人理解,如果你想最小化一个碗型函数,


你可以把dw和db两个导数看成一个球下坡时的加速度,把这些动量项(Vdw,mVdb)看成是球的速度,所以可以想象一下,你有一个晚和一个球,导数项给球了一个加速度,然后球就向下滚,因为有加速度,所以它滚得越来越快,因为beta是一个略小于1的数,可以把它看成摩擦力,让球不至于无限的加速下去,与梯度下降中每一步都独立于之前步骤所不同的是,现在你的球可以向下滚并获得动量。

算法实现如下:

有两个超参数,一个是学习率alpha和参数beta,beta控制指数加权平均,beta常用的取值是0.9,就像我们之前计算最近10天气温的平均值,这里就是计算前10次迭代的梯度的平均值,

6.RMSprop(Root Mean Square prop)算法:均方根传递

也可以加速梯度下降,我们看看它是如何工作的,


回想之前的例子,在实现梯度下降的时候,可能会在垂直方向上出现巨大的振荡,即使它试图在水平方向前进,为了说明这个例子,我们假设纵轴代表参数b 横轴代表参数W,当然这里也可以是W1和W2等其他参数,你希望减慢b方向的学习,也就是垂直方向,同时加速至少不减小水平方向的学习,这就是RMSprop算法要做的,在第t次迭代中,它会像往常一样计算当前小批量的导数dW和db,我会保留这个指数加权平均数,这次使用新的符号S_dW取代之前的V_dW, S_dW就等于beta乘以之前的值,再加上(1-beta)*dW*dW,所以这一步是保存了导数平方的指数加权平均数,之后RMSprop用以下方法更新参数:

让我们理解一下它的工作原理,记得在水平方向上即例子中W的方向上,我们希望学习速率较快,而在垂直方向上,即例子中b的方向上,我们希望降低垂直方向上的振荡,对于S_dW和S_db这两项,我们希望S_dW相对较小,S_db相对较大,所以套用以上公司,对于b会减去一个较大的数,会减缓垂直方向上的更新,实际上如果你看一下导数,就会发现垂直方向上的导数要比水平方向上的更大,所以b方向上的斜率很大,对于这样的导数,db很大,而dW相对较小,因为函数在垂直方向,即b方向的斜率要比w方向,也就是比水平方向更陡,所以 db的平方会相对较大,因此S_db会相对较大,相比之下dW会比较小,或者dW的平方比较小,所以S_dW会较小,结果是垂直方向上的更新量会除以一个较大的数,这有助于减弱振荡,而水平方向上的更新量会除以一个较小的数,因此,使用RMSprop的效果就使你的更新如下图绿色折线,在垂直方向上的振荡更小,而在水平方向上一直走下去,另一个收敛是你可以使用更大的学习率alpha,学习的更快,而不用担心在垂直方向上发散,

7.Adam算法

Adam算法是动量算法和RMSprop结合起来的一个效果很好的优化算法

牵扯到的一些超参数选取规则:



Adam代表自适应矩估计(Adaptive Moment Estimation)

8.Learning rate decay

有一种方法或许能学习算法运行更快,那就是渐渐的减小学习率,我们称为学习率衰减,让我们看看如何实现这个方法,我们用一个例子让你看看为什么用到学习率衰减,当你使用适量的小样本进行小批次梯度下降法,也许一个批次只有64个或者128个样本,当你迭代时,步长(steps)会有些浮动,它会逐步向最小值靠近,但不会完全收敛到这点,因为你的学习率a取了固定值,且不同的批次(mini-batches)也可能产生些噪声,如下图:

但是如果你慢慢地降低你的学习率a,那么在初始阶段,因为学习率a取值还比较大,学习速度仍然可以比较快,但随着a变小,步长也会渐渐变小,所以最终将围绕着极小值点更近的区域摆动,即使继续训练下去,也不会漂游远离,逐渐降低学习率a背后的思考是在学习的初始步骤中你可以采取大得多的步长,但随着学习开始收敛于一点时,较低的学习率可以允许你采用更小的步长,那么怎么实现学习率衰减呢(learning rate decay),还记得一个迭代就是将算法在所有的数据上过一遍,算法在训练集上通过第一遍,称为第一次迭代,通过第二遍,称为第二次迭代,如此类推,如果你这样设置学习率a:

decay_rate是另外一个超参数,需要再调整,epoch_num是迭代次数

9.The problem of local optima

主要向大家介绍一下现在我们是如何看待局部最优以及深度学习中的优化问题,当人们担心局部最优的时候他们脑海中浮现的往往是这幅图:


假设你在优化某些参数,比如W1和W2,这个曲面的高度表示代价函数,在这幅图中,看上去到处都是局部最优,很容易陷入局部最优,而找不到全局最优,但是代价函数中大部分梯度为0的点实际上并不是像这样的局部最优,而是鞍点(SaddlePoint),蓝色那个点就是梯度为零的点,如下图所示:


真正降低学习速度的实际上是停滞区(Plateaus),停滞区指的是,导数长时间接近于0的一段区域,如下图:本视频的要点是,首先你不太可能陷入糟糕的局部最优点,只要你训练的是一个较大的神经网络,有很多参数,代价函数J定义在一个相对高维的空间上,其次停滞区是个问题它会让学习过程变得相当慢,这也是像动量(Momentum)算法或者RmsProp算法或者Adam算法能改善你的学习算法的地方,这些场景下,更复杂的算法,比如Adam算法可以加快沿停滞区向下移动然后离开停滞区的速度,

猜你喜欢

转载自blog.csdn.net/zgx123666/article/details/79573289