理解梯度下降(二)(理论篇)|机器学习你会遇到的“坑”


理解梯度下降(二)(理论篇)|机器学习你会遇到的“坑”



理解梯度下降(二)(理论篇)|机器学习你会遇到的“坑”


数学准备

  • Hadamard product:矩阵的各个元素对应相乘



理解梯度下降(二)(理论篇)|机器学习你会遇到的“坑”


理解梯度下降(二)(理论篇)|机器学习你会遇到的“坑”



一个好的优化算法,一方面要快,即迭代更新的次数越少越好,另一方面计算的代价要小,即利用的信息越少越好。现在我们已经知道这两者是无法兼得的,梯度下降只需要计算梯度,但在每一步下降只局限于大小为

理解梯度下降(二)(理论篇)|机器学习你会遇到的“坑”

的局部方向,迭代更新的次数较多,而牛顿法这样的二阶优化,利用了Hessian矩阵的信息,预设了梯度为零,使得一般情况下的迭代更新次数更少,但是每次迭代时需要计算样本的Hessian的逆。

如果我们想在牛顿法的基础上进一步的减小信息量,就可以考虑BFGS(Broyden-Fletcher-Goldfalb-Shanno)这种著名的拟牛顿法,它并没有直接计算Hessian的逆,而是采取向量的乘积和矩阵的加法来代替了Hessian,使得计算量进一步下降。但即便这样我们在深度学习中仍然很少采用它,主要的因素还是模型参数和数据的庞大,空间复杂度太大,内存消耗严重。

所以,梯度下降似乎是看起来更好的选择, 但仍有提升空间。首先,我们在计算梯度时,用了所有的样本,因为这样的梯度估计才更准确,但是很多样本太相似了,比如其他条件均一样,一个身高为172、体重63kg,另一个身高172.5、体重63.4,这样的样本对Loss function的贡献是相似的,产生的梯度估计也是相似的,我们完全可以采用少且有效的信息去替代冗余的信息;其次,在实践中,小批量的梯度下降即便增加了迭代次数,但计算的代价少了,总体的效率仍然很高;最后,随机的挑选小批量的样本一定程度上增加了梯度估计的方差(噪声项),反而使得梯度下降有机会跳出局部最小值,在保证与全样本梯度下降结果差不多的前提下,有表现更为优异的可能性。

这样的方法我们叫做随机梯度下降(Stochastic Gradient Descent),有的人会按照每次梯度更新使用的样本量,进一步的分为小批量,在线等等,这样的分类是不必要的,现在通常说随机,一般就指小批量梯度下降。因为使用单个样本更新梯度,梯度估计效果会很差,同时无法有效利用多线程操作,我们在此不予讨论。

随机梯度下降参数更新公式就由原来的:


理解梯度下降(二)(理论篇)|机器学习你会遇到的“坑”



变为了:


理解梯度下降(二)(理论篇)|机器学习你会遇到的“坑”



当使用随机梯度下降时,原本梯度为零的点一般不会为零,但也会变得很小,所以我们会看到随机梯度下降并不会停留在极小值(如果存在极小值的话),而是在其附近微小震荡。另外实验表明,随机梯度下降会在迭代初期性能远远超越全部样本的梯度下降。

那么梯度下降能不能更快呢?因为我们可以设想,如果参数的初始值越靠近目标点,那么优化过程肯定越快,每一步的梯度都积累在同一个方向上,那么还可以减少很多无谓的迭代,毕竟梯度下降本质上是贪心的。


理解梯度下降(二)(理论篇)|机器学习你会遇到的“坑”


如图,a和b的参数初始值并不一样,结果a的梯度下降比b的更快,虽然b的每一步的梯度下降都是此时此刻的最佳的方向,但在整体看来,b把步骤浪费在了等高线附近的来回移动。

但是,一般而言,我们并不知道Loss function的性质,我们无法确定出完美的初始值(实际中,一般都是假设一个正态分布,或者随机初始化),换而言之,我们要想方设法将处理更为普遍的情况,尽可能减少在contour附近的来回移动。

动量算法可以缓解这个问题,它引入了一个量叫做速度,用来积累以前的梯度信息:


理解梯度下降(二)(理论篇)|机器学习你会遇到的“坑”



这种做法是出于物理上的考虑,Loss function的负梯度就是物理上的势的负梯度,我们把它叫做力,根据矢量加法,或者做正交分解,就可以直观的看出,累加的结果就是把每一次力的相同方向加大,而相反的方向相互抵消,使得速度在每次力的相同方向都越来越大,本质上就是对梯度的方向做了归一化,然后我们选择利用速度去更新参数:


理解梯度下降(二)(理论篇)|机器学习你会遇到的“坑”



让我们来考虑极端的情况,如果每次的梯度的方向一致,那么v就会沿着一个方向越来越大,参数a用来调节过去积累梯度与现在梯度的比重,a越大,那么过去的信息占得比重越大。同时我们也可以在梯度计算之前就在参数中添加速度项:


理解梯度下降(二)(理论篇)|机器学习你会遇到的“坑”



就得到了Nesterov动量算法,简单来看,并没有异样,只是添加的步骤不同,而且在循环中,标准的动量算法迟早都会执行参数更新后的梯度。实际上,如果我们做一个简单的矢量加法:


理解梯度下降(二)(理论篇)|机器学习你会遇到的“坑”


如图,左图为普通的动量算法,遵循着矢量加法,其中梯度步骤gradient step并未利用当前的速度,而在Nesterov却在梯度步骤就利用了速度信息,最终使实际的步骤发生了偏移。

动量算法一定程度上加速了梯度下降,但是却引入了另一个超参数a,更重要的是,实践发现,同样作为超参数,a远远没有学习率

理解梯度下降(二)(理论篇)|机器学习你会遇到的“坑”

重要,我们希望不引入额外参数的情况下加速优化,就不得不考虑学习率。我们希望达到的效果是,学习率在梯度很大的时候,变得小一些,不至于错过极小值,在梯度很小的时候变得大一点,使得在Loss 平坦的地方走的更快。这就是所谓的自适应学习率算法。

梯度越大学习率要越小,一个自然的想法就是用一个量来累计所有的梯度:


理解梯度下降(二)(理论篇)|机器学习你会遇到的“坑”



然后在学习率上乘以梯度的倒数,其中

理解梯度下降(二)(理论篇)|机器学习你会遇到的“坑”

是非常小的常数,避免分母为零:


理解梯度下降(二)(理论篇)|机器学习你会遇到的“坑”



此算法就叫做AdaGrad,简单实现了梯度越大的地方,学习率越小的目标。但它积累了全部的梯度,使得学习率过早的下降,所以我们还可以给不同时期的梯度赋予权重因子,使得较早的梯度不重要,而较近的梯度更重要:


理解梯度下降(二)(理论篇)|机器学习你会遇到的“坑”


这样就得到了RMSProp算法,在此基础上,我们希望在梯度项中也加入一些修正,使得当前所使用的梯度还会受到历史梯度的影响,与动量算法类似:


理解梯度下降(二)(理论篇)|机器学习你会遇到的“坑”


最后更新公式也变为:


理解梯度下降(二)(理论篇)|机器学习你会遇到的“坑”



这就得到了Adam算法的基本形式,里面包含着两个超参数,这也是深度学习中最被经常使用的算法。

理解梯度下降(二)(理论篇)|机器学习你会遇到的“坑”


读芯君开扒

课堂TIPS

• 随着数据的增多,有些情况下我们也不得不用单样本的随机梯度下降,因为照目前的发展来看,数据规模的增长速度已经超越了计算能力的增速,此外,对训练集进行分批训练也变得越来常见。

• 动量算法本质上也在将学习率调节为

理解梯度下降(二)(理论篇)|机器学习你会遇到的“坑”

,a越大,速度也就越快,但动量算法有一个明显的缺点,那就是当速度太快时,无法在极小值附近停下来,这也是制约其发展的因素之一,一般的都是动量算法与其他的自适应算法相结合,可以发挥出最大的效果。

• Adam算法也被人认为是对一阶矩和二阶矩的偏差修正,但对于初学者来说,更好的理解方式是RMSprop+动量算法,需要注意的是,初期的积累梯度和积累动量趋于零,一般的,我们会对其先进行修正,比如:

理解梯度下降(二)(理论篇)|机器学习你会遇到的“坑”


理解梯度下降(二)(理论篇)|机器学习你会遇到的“坑”




分享到:


相關文章: