红色石头的我的网站:redstonewill.comweb
上节课咱们主要介绍了如何创建一个实用的深度学习神经网络。包括Train/Dev/Test sets的比例选择,Bias和Variance的概念和区别:Bias对应欠拟合,Variance对应过拟合。接着,咱们介绍了防止过拟合的两种方法:L2 regularization和Dropout。而后,介绍了如何进行规范化输入,以加快梯度降低速度和精度。而后,咱们介绍了梯度消失和梯度爆炸的概念和危害,并提出了如何使用梯度初始化来下降这种风险。最后,咱们介绍了梯度检查,来验证梯度降低算法是否正确。本节课,咱们将继续讨论深度神经网络中的一些优化算法,经过使用这些技巧和方法来提升神经网络的训练速度和精度。算法
以前咱们介绍的神经网络训练过程是对全部m个样本,称为batch,经过向量化计算方式,同时进行的。若是m很大,例如达到百万数量级,训练速度每每会很慢,由于每次迭代都要对全部样本进行进行求和运算和矩阵运算。咱们将这种梯度降低算法称为Batch Gradient Descent。网络
为了解决这一问题,咱们能够把m个训练样本分红若干个子集,称为mini-batches,这样每一个子集包含的数据量就小了,例如只有1000,而后每次在单一子集上进行神经网络训练,速度就会大大提升。这种梯度降低算法叫作Mini-batch Gradient Descent。app
假设总的训练样本个数m=5000000,其维度为 。将其分红5000个子集,每一个mini-batch含有1000个样本。咱们将每一个mini-batch记为 ,其维度为 。相应的每一个mini-batch的输出记为 ,其维度为 ,且 。机器学习
这里顺便总结一下咱们遇到的神经网络中几类字母的上标含义:svg
:第i个样本学习
:神经网络第 层网络的线性输出优化
:第t组mini-batch网站
Mini-batches Gradient Descent的实现过程是先将总的训练样本分红T个子集(mini-batches),而后对每一个mini-batch进行神经网络训练,包括Forward Propagation,Compute Cost Function,Backward Propagation,循环至T个mini-batch都训练完毕。atom
通过T次循环以后,全部m个训练样本都进行了梯度降低计算。这个过程,咱们称之为经历了一个epoch。对于Batch Gradient Descent而言,一个epoch只进行一次梯度降低算法;而Mini-Batches Gradient Descent,一个epoch会进行T次梯度降低算法。
值得一提的是,对于Mini-Batches Gradient Descent,能够进行屡次epoch训练。并且,每次epoch,最好是将整体训练数据从新打乱、从新分红T组mini-batches,这样有利于训练出最佳的神经网络模型。
Batch gradient descent和Mini-batch gradient descent的cost曲线以下图所示:
对于通常的神经网络模型,使用Batch gradient descent,随着迭代次数增长,cost是不断减少的。然而,使用Mini-batch gradient descent,随着在不一样的mini-batch上迭代训练,其cost不是单调降低,而是受相似noise的影响,出现振荡。但总体的趋势是降低的,最终也能获得较低的cost值。
之因此出现细微振荡的缘由是不一样的mini-batch之间是有差别的。例如可能第一个子集 是好的子集,而第二个子集 包含了一些噪声noise。出现细微振荡是正常的。
如何选择每一个mini-batch的大小,即包含的样本个数呢?有两个极端:若是mini-batch size=m,即为Batch gradient descent,只包含一个子集为 ;若是mini-batch size=1,即为Stachastic gradient descent,每一个样本就是一个子集 ,共有m个子集。
咱们来比较一下Batch gradient descent和Stachastic gradient descent的梯度降低曲线。以下图所示,蓝色的线表明Batch gradient descent,紫色的线表明Stachastic gradient descent。Batch gradient descent会比较平稳地接近全局最小值,可是由于使用了全部m个样本,每次前进的速度有些慢。Stachastic gradient descent每次前进速度很快,可是路线曲折,有较大的振荡,最终会在最小值附近来回波动,难以真正达到最小值处。并且在数值处理上就不能使用向量化的方法来提升运算速度。
实际使用中,mini-batch size不能设置得太大(Batch gradient descent),也不能设置得过小(Stachastic gradient descent)。这样,至关于结合了Batch gradient descent和Stachastic gradient descent各自的优势,既能使用向量化优化算法,又能叫快速地找到最小值。mini-batch gradient descent的梯度降低曲线以下图绿色所示,每次前进速度较快,且振荡较小,基本能接近全局最小值。
通常来讲,若是整体样本数量m不太大时,例如 ,建议直接使用Batch gradient descent。若是整体样本数量m很大时,建议将样本分红许多mini-batches。推荐经常使用的mini-batch size为64,128,256,512。这些都是2的幂。之因此这样设置的缘由是计算机存储数据通常是2的幂,这样设置能够提升运算速度。
该部分咱们将介绍指数加权平均(Exponentially weighted averages)的概念。
举个例子,记录半年内伦敦市的气温变化,并在二维平面上绘制出来,以下图所示:
看上去,温度数据彷佛有noise,并且抖动较大。若是咱们但愿看到半年内气温的总体变化趋势,能够经过移动平均(moving average)的方法来对天天气温进行平滑处理。
例如咱们能够设 ,当成第0天的气温值。
第一天的气温与第0天的气温有关:
次日的气温与第一天的气温有关:
第三天的气温与次日的气温有关:
即第t天与第t-1天的气温迭代关系为:
通过移动平均处理获得的气温以下图红色曲线所示:
这种滑动平均算法称为指数加权平均(exponentially weighted average)。根据以前的推导公式,其通常形式为:
上面的例子中, 。 值决定了指数加权平均的天数,近似表示为:
例如,当 ,则 ,表示将前10天进行指数加权平均。当 ,则 ,表示将前50天进行指数加权平均。 值越大,则指数加权平均的天数越多,平均后的趋势线就越平缓,可是同时也会向右平移。下图绿色曲线和黄色曲线分别表示了 和 时,指数加权平均的结果。
这里简单解释一下公式 是怎么来的。准确来讲,指数加权平均算法跟以前全部天的数值都有关系,根据以前的推导公式就能看出。可是指数是衰减的,通常认为衰减到 就能够忽略不计了。所以,根据以前的推导公式,咱们只要证实
就行了。
令 , ,则 , 。即证实转化为:
显然,当 时,上述等式是近似成立的。
至此,简单解释了为何指数加权平均的天数的计算公式为 。
咱们将指数加权平均公式的通常形式写下来:
观察上面这个式子, 是原始数据值, 是相似指数曲线,从右向左,呈指数降低的。 的值就是这两个子式的点乘,将原始数据值与衰减指数点乘,至关于作了指数衰减,离得越近,影响越大,离得越远,影响越小,衰减越厉害。
咱们已经知道了指数加权平均的递推公式。实际应用中,为了减小内存的使用,咱们可使用这样的语句来实现指数加权平均算法:
上文中提到当 时,指数加权平均结果以下图绿色曲线所示。可是实际上,真实曲线如紫色曲线所示。
咱们注意到,紫色曲线与绿色曲线的区别是,紫色曲线开始的时候相对较低一些。这是由于开始时咱们设置 ,因此初始值会相对小一些,直到后面受前面的影响渐渐变小,趋于正常。
修正这种问题的方法是进行偏移校订(bias correction),即在每次计算完 后,对 进行下式处理:
在刚开始的时候,t比较小, ,这样就将 修正得更大一些,效果是把紫色曲线开始部分向上提高一些,与绿色曲线接近重合。随着t增大, , 基本不变,紫色曲线与绿色曲线依然重合。这样就实现了简单的偏移校订,获得咱们但愿的绿色曲线。
值得一提的是,机器学习中,偏移校订并非必须的。由于,在迭代一次次数后(t较大), 受初始值影响微乎其微,紫色曲线与绿色曲线基本重合。因此,通常能够忽略初始迭代过程,等到必定迭代以后再取值,这样就不须要进行偏移校订了。
该部分将介绍动量梯度降低算法,其速度要比传统的梯度降低算法快不少。作法是在每次训练时,对梯度进行指数加权平均处理,而后用获得的梯度值更新权重W和常数项b。下面介绍具体的实现过程。
原始的梯度降低算法如上图蓝色折线所示。在梯度降低过程当中,梯度降低的振荡较大,尤为对于W、b之间数值范围差异较大的状况。此时每一点处的梯度只与当前方向有关,产生相似折线的效果,前进缓慢。而若是对梯度进行指数加权平均,这样使当前梯度不只与当前方向有关,还与以前的方向有关,这样处理让梯度前进方向更加平滑,减小振荡,可以更快地到达最小值处。
权重W和常数项b的指数加权平均表达式以下:
从动量的角度来看,以权重W为例, 能够成速度V, 能够当作是加速度a。指数加权平均其实是计算当前的速度,当前速度由以前的速度和如今的加速度共同影响。而 ,又能限制速度 过大。也就是说,当前的速度是渐变的,而不是瞬变的,是动量的过程。这保证了梯度降低的平稳性和准确性,减小振荡,较快地达到最小值处。
动量梯度降低算法的过程以下:
初始时,令 。通常设置 ,即指数加权平均前10天的数据,实际应用效果较好。
另外,关于偏移校订,能够不使用。由于通过10次迭代后,随着滑动平均的过程,偏移状况会逐渐消失。
补充一下,在其它文献资料中,动量梯度降低还有另一种写法:
即消去了 和 前的系数 。这样简化了表达式,可是学习因子 至关于变成了 ,表示 也受 的影响。从效果上来讲,这种写法也是能够的,可是不够直观,且调参涉及到 ,不够方便。因此,实际应用中,推荐第一种动量梯度降低的表达式。
RMSprop是另一种优化梯度降低速度的算法。每次迭代训练过程当中,其权重W和常数项b的更新表达式为:
下面简单解释一下RMSprop算法的原理,仍然如下图为例,为了便于分析,令水平方向为W的方向,垂直方向为b的方向。
从图中能够看出,梯度降低(蓝色折线)在垂直方向(b)上振荡较大,在水平方向(W)上振荡较小,表示在b方向上梯度较大,即 较大,而在W方向上梯度较小,即 较小。所以,上述表达式中 较大,而 较小。在更新W和b的表达式中,变化值 较大,而 较小。也就使得W变化得多一些,b变化得少一些。即加快了W方向的速度,减少了b方向的速度,减少振荡,实现快速梯度降低算法,其梯度降低过程如绿色折线所示。总得来讲,就是若是哪一个方向振荡大,就减少该方向的更新速度,从而减少振荡。
还有一点须要注意的是为了不RMSprop算法中分母为零,一般能够在分母增长一个极小的常数 :
其中, ,或者其它较小值。
Adam(Adaptive Moment Estimation)算法结合了动量梯度降低算法和RMSprop算法。其算法流程为:
Adam算法包含了几个超参数,分别是: 。其中, 一般设置为0.9, 一般设置为0.999, 一般设置为 。通常只须要对 和 进行调试。
实际应用中,Adam算法结合了动量梯度降低和RMSprop各自的优势,使得神经网络训练速度大大提升。
减少学习因子 也能有效提升神经网络训练速度,这种方法被称为learning rate decay。
Learning rate decay就是随着迭代次数增长,学习因子 逐渐减少。下面用图示的方式来解释这样作的好处。下图中,蓝色折线表示使用恒定的学习因子 ,因为每次训练 相同,步进长度不变,在接近最优值处的振荡也大,在最优值附近较大范围内振荡,与最优值距离就比较远。绿色折线表示使用不断减少的 ,随着训练次数增长, 逐渐减少,步进长度减少,使得可以在最优值处较小范围内微弱振荡,不断逼近最优值。相比较恒定的 来讲,learning rate decay更接近最优值。
Learning rate decay中对 可由下列公式获得:
其中,deacy_rate是参数(可调),epoch是训练完全部样本的次数。随着epoch增长, 会不断变小。
除了上面计算 的公式以外,还有其它可供选择的计算公式:
其中,k为可调参数,t为mini-bach number。
除此以外,还能够设置 为关于t的离散值,随着t增长, 呈阶梯式减少。固然,也能够根据训练状况灵活调整当前的 值,但会比较耗时间。
在使用梯度降低算法不断减少cost function时,可能会获得局部最优解(local optima)而不是全局最优解(global optima)。以前咱们对局部最优解的理解是形如碗状的凹槽,以下图左边所示。可是在神经网络中,local optima的概念发生了变化。准确地来讲,大部分梯度为零的“最优势”并非这些凹槽处,而是形如右边所示的马鞍状,称为saddle point。也就是说,梯度为零并不能保证都是convex(极小值),也有多是concave(极大值)。特别是在神经网络中参数不少的状况下,全部参数梯度为零的点极可能都是右边所示的马鞍状的saddle point,而不是左边那样的local optimum。
相似马鞍状的plateaus会下降神经网络学习速度。Plateaus是梯度接近于零的平缓区域,以下图所示。在plateaus上梯度很小,前进缓慢,到达saddle point须要很长时间。到达saddle point后,因为随机扰动,梯度通常可以沿着图中绿色箭头,离开saddle point,继续前进,只是在plateaus上花费了太多时间。
总的来讲,关于local optima,有两点总结:
只要选择合理的强大的神经网络,通常不太可能陷入local optima
Plateaus可能会使梯度降低变慢,下降学习速度
值得一提的是,上文介绍的动量梯度降低,RMSprop,Adam算法都能有效解决plateaus降低过慢的问题,大大提升神经网络的学习速度。
更多AI资源请关注公众号:红色石头的机器学习之路(ID:redstonewill)