吴恩达deep learning ai 笔记总结(2-2) 改善深层神经网络-优化算法

改善深层神经网络-优化算法

摘要:本篇继续讨论深度神经网络中的一些优化算法,通过使用这些技巧和方法来提高神经网络的训练速度和精度。

Gradient Checking

Back Propagation神经网络有一项重要的测试是梯度检查(gradient checking)。其目的是检查验证反向传播过程中梯度下降算法是否正确。
利用微分思想,使用Numerical Method 方法,函数f在点θ处的梯度可以使用双边误差的方法去逼近导数:
在这里插入图片描述
误差:
在这里插入图片描述
了解了如何近似求出梯度值后,来看如何进行梯度检查,来验证训练过程中是否出现bugs。
因为我们的神经网络中含有大量的参数,为了做梯度检验,需要将这些参数全部连接起来,这些矩阵构造成一维向量,然后将这些一维向量组合起来构成一个更大的一维向量θ。
然后将反向传播过程通过梯度下降算法得到的dW,照一样的顺序构造成一个一维向量dθ,dθ的维度与θ一致。

小tips:

  • 不要在整个训练过程中都进行梯度检查,仅仅作为debug使用。
  • 如果梯度检查出现错误,找到对应出错的梯度,检查其推导是否出现错误。
  • 注意不要忽略正则化项,计算近似梯度的时候要包括进去。
  • 梯度检查时关闭dropout,检查完毕后再打开dropout。
  • 随机初始化时运行梯度检查,经过一些训练后再进行梯度检查(不常用)

Mini-batch 训练

之前我们介绍的神经网络训练过程是对所有m个样本,称为batch,通过向量化计算方式,同时进行的。如果m很大,例如达到百万数量级,训练速度往往会很慢,因为每次迭代都要对所有样本进行进行求和运算和矩阵运算。我们将这种梯度下降算法称为Batch Gradient Descent。

为了解决这一问题,我们可以把m个训练样本分成若干个子集,称为mini-batches,这样每个子集包含的数据量就小了,例如只有1000,然后每次在单一子集上进行神经网络训练,速度就会大大提高。这种梯度下降算法叫做Mini-batch Gradient Descent。

Mini-batches Gradient Descent的实现过程是先将总的训练样本分成T个子集(mini-batches),然后对每个mini-batch进行神经网络训练,包括Forward Propagation,Compute Cost Function,Backward Propagation,循环至T个mini-batch都训练完毕。

经过T次循环之后,所有m个训练样本都进行了梯度下降计算。这个过程,我们称之为经历了一个epoch。对于Batch Gradient Descent而言,一个epoch只进行一次梯度下降算法;而Mini-Batches Gradient Descent,一个epoch会进行T次梯度下降算法。

值得一提的是,对于Mini-Batches Gradient Descent,可以进行多次epoch训练。而且,每次epoch,最好是将总体训练数据重新打乱、重新分成T组mini-batches,这样有利于训练出最佳的神经网络模型。

普通的batch梯度下降法和Mini-batch梯度下降法代价函数的变化趋势,如下图所示:
在这里插入图片描述
batch梯度下降:

  • 对所有m个训练样本执行一次梯度下降,每一次迭代时间较长;
  • Cost function 总是向减小的方向下降。

Stachastic 梯度下降:

  • 对每一个训练样本执行一次梯度下降,但是丢失了向量化带来的计算加速;
  • Cost function总体的趋势向最小值的方向下降,但是无法到达全局最小值点,呈现波动的形式。

Mini-batch梯度下降:

  • 选择一个1<size<m1<size<m 的合适的size进行Mini-batch梯度下降,可以实现快速学习,也应用了向量化带来的好处。
  • Cost function的下降处于前两者之间。

Mini-batch 大小的选择

  • 一般来说,如果总体样本数量m不太大时,例如m≤2000m≤2000,建议直接使用Batch gradient descent。
  • 如果总体样本数量m很大时,建议将样本分成许多mini-batches。推荐常用的mini-batch size为64,128,256,512。这些都是2的幂。之所以这样设置的原因是计算机存储数据一般是2的幂,这样设置可以提高运算速度
  • Mini-batch的大小要符合CPU/GPU内存。

指数加权平均(Exponentially weighted averages)

指数加权平均的一般形式:
在这里插入图片描述
下图是一个关于天数和温度的散点图:
在这里插入图片描述
当β=0.9时,指数加权平均最后的结果如图中红色线所示;
当β=0.98时,指数加权平均最后的结果如图中绿色线所示;
当β=0.5时,指数加权平均最后的结果如下图中黄色线所示;

β值决定了指数加权平均的天数
β值越大,则指数加权平均的天数越多,平均后的趋势线就越平缓,但是同时也会向右平移。下图绿色曲线和黄色曲线分别表示了β=0.98和β=0.5时,指数加权平均的结果。
在这里插入图片描述

理解指数加权平均

例子,当β=0.9时:

在这里插入图片描述
展开:
在这里插入图片描述
上式中所有θ前面的系数相加起来为1或者接近于1,称之为Bias纠正。

将指数加权平均公式的一般形式写下来:
在这里插入图片描述
观察上面这个式子,θt,θt−1,θt−2,θ1是原始数据值,(1−β),(1−β)β,(1−β)β2,⋯,(1−β)βt−1是类似指数曲线,从右向左,呈指数下降的。Vt的值就是这两个子式的点乘,将原始数据值与衰减指数点乘,相当于做了指数衰减,离得越近,影响越大,离得越远,影响越小,衰减越厉害。
在这里插入图片描述
指数加权平均实现
在这里插入图片描述
在计算当前时刻的平均值,只需要前一天的平均值和当前时刻的值,所以在数据量非常大的情况下,指数加权平均在节约计算成本的方面是一种非常有效的方式,可以很大程度上减少计算机资源存储和内存的占用。

指数加权平均的Bias纠正

在我们执行指数加权平均的公式时,当β=0.98时,我们得到的并不是图中的绿色曲线,而是下图中的紫色曲线,其起点比较低。这是因为开始时我们设置V0=0,所以初始值会相对小一些,直到后面受前面的影响渐渐变小,趋于正常。
修正这种问题的方法是进行偏移校正(bias correction),即在每次计算完Vt后,对Vt进行下式处理:

  • bias correction
    在这里插入图片描述

在这里插入图片描述
原因:
在这里插入图片描述
偏差修正得到了绿色的曲线,在开始的时候,能够得到比紫色曲线更好的计算平均的效果。随着t逐渐增大,βt接近于0,所以后面绿色的曲线和紫色的曲线逐渐重合了。

值得一提的是,机器学习中,偏移校正并不是必须的。因为,在迭代一次次数后(t较大),Vt受初始值影响微乎其微,紫色曲线与绿色曲线基本重合。所以,一般可以忽略初始迭代过程,等到一定迭代之后再取值,这样就不需要进行偏移校正了。

Gradient descent with momentum(动量)

动量梯度下降的基本思想就是计算梯度的指数加权平均数,并利用该梯度来更新权重。其速度要比传统的梯度下降算法快很多。做法是在每次训练时,对梯度进行指数加权平均处理,然后用得到的梯度值更新权重W和常数项b。下面介绍具体的实现过程。

在我们优化 Cost function 的时候,以下图所示的函数图为例:
在这里插入图片描述

原始的梯度下降算法如上图蓝色折线所示。在梯度下降过程中,梯度下降的振荡较大,尤其对于W、b之间数值范围差别较大的情况。此时每一点处的梯度只与当前方向有关,产生类似折线的效果,前进缓慢。而且我们只能使用一个较小的学习率来进行迭代。

如果用较大的学习率,结果可能会如紫色线一样偏离函数的范围,所以为了避免这种情况,只能用较小的学习率。

但是我们又希望在如图的纵轴方向梯度下降的缓慢一些,不要有如此大的上下波动,在横轴方向梯度下降的快速一些,使得能够更快的到达最小值点,而这里用动量梯度下降法既可以实现,如红色线所示。

如果对梯度进行指数加权平均,这样使当前梯度不仅与当前方向有关,还与之前的方向有关,这样处理让梯度前进方向更加平滑,减少振荡,能够更快地到达最小值处。

权重W和常数项b的指数加权平均表达式如下:
在这里插入图片描述
动量梯度下降算法的过程如下:
在这里插入图片描述
初始时,令VdW=0,Vdb=0。一般设置β=0.9,即指数加权平均前10天的数据,实际应用效果较好。

另外,关于偏移校正,可以不使用。因为经过10次迭代后,随着滑动平均的过程,偏移情况会逐渐消失。

RMSProp

除了上面所说的Momentum梯度下降法,RMSprop(root mean square prop)也是一种可以加快梯度下降的算法。
每次迭代训练过程中,其权重W和常数项b的更新表达式为:
在这里插入图片描述
RMSprop算法的原理,仍然以下图为例,为了便于分析,令水平方向为W的方向,垂直方向为b的方向。

在这里插入图片描述
从图中可以看出,梯度下降(蓝色折线)在垂直方向(b)上振荡较大,在水平方向(W)上振荡较小,表示在b方向上梯度较大,即db较大,而在W方向上梯度较小,即dW较小。因此,上述表达式中Sb较大,而SW较小。在更新W和b的表达式中,使得W变化得多一些,b变化得少一些。即加快了W方向的速度,减小了b方向的速度,减小振荡,实现快速梯度下降算法,其梯度下降过程如绿色折线所示。总得来说,就是如果哪个方向振荡大,就减小该方向的更新速度,从而减小振荡。

Adam optimization algorithm

Adam 优化算法的基本思想就是将 Momentum 和 RMSprop 结合起来形成的一种适用于不同深度学习结构的优化算法。

算法实现
在这里插入图片描述
超参数的选择
在这里插入图片描述

学习衰减率(rate decay)

减小学习因子αα也能有效提高神经网络训练速度,这种方法被称为learning rate decay。

Learning rate decay就是随着迭代次数增加,学习因子αα逐渐减小。下面用图示的方式来解释这样做的好处。下图中,蓝色折线表示使用恒定的学习因子αα,由于每次训练αα相同,步进长度不变,在接近最优值处的振荡也大,在最优值附近较大范围内振荡,与最优值距离就比较远。绿色折线表示使用不断减小的αα,随着训练次数增加,αα逐渐减小,步进长度减小,使得能够在最优值处较小范围内微弱振荡,不断逼近最优值。相比较恒定的αα来说,learning rate decay更接近最优值。

在这里插入图片描述
学习率衰减的实现

  • 一般常用
    在这里插入图片描述
    其中,deacy_rate是参数(可调),epoch是训练完所有样本的次数。随着epoch增加,α会不断变小。

  • 指数衰减
    在这里插入图片描述

  • 其他
    在这里插入图片描述
    其中,k为可调参数,t为mini-bach number。

发布了45 篇原创文章 · 获赞 4 · 访问量 2518

猜你喜欢

转载自blog.csdn.net/keke_Memory/article/details/102762412