随机梯度下降法、牛顿法、冲量法、AdaGrad、RMSprop以及Adam优化过程和理解

简介: 笔记

我们都希望在求梯度的时候10.gif ,但这就有个问题了,比如一个像素就有可能有多个通道,那么随着网络的加深,我们一个像素一个像素的求梯度,参数量和计算量也会非常的巨大(不是一般的大),况且我们也不是只对一个数据进行计算,我们的数据集有时候会有上万张,如果靠这种求梯度的方式,我们的计算机是难以做到的,所以这种求梯度的方法还是停留在理论层面。为了解决这种问题,我们训练中常常会碰到一个求梯度的方法“随机梯度下降法”。


我们可以先自己想一下有哪些方法可以优化。比如对于上述过程每次训练计算量都非常的大,那我们能不能将这个计算过程拆分一下呢?另一种思路是看看能不能从优化梯度的下降路径入手,使其下降的快一些。


1.通过减小计算量求梯度-----随机梯度下降法


举个例子,在设计损失函数的时候,比如交叉熵,我们会看到前面有个系数11.gif,这里的N指的是所有的数据样本,除以N其实就是求平均,那么为什么要知道平均呢【可能你觉得我这里再说废话,但希望耐心看下去】,这是因为一个数据样本的平均值往往是可以代表一个数据分布的属性的,这就好比我们上学的时候每个班级都会有平均成绩,平均成绩就代表了这个班整体的学习成绩好坏。在举个例子,中学我们学生物的时候,需要统计一片森林里的鸟,难度我们就要把所有鸟都抓起来去数么?我们的办法是对数据就行抽样,所得到的样本就可以代表这个森林里有多少鸟。只要我们得到这样一个平均值,那么随机抽到的样本也和这个平均值差不了很多(BN层训练和推理也用到这个思想)。那么同理,我们在训练中也不需要把所有数据都挨个训练一遍,我们可以随机挑选出一批数据来训练【这里是不是就感觉熟悉了,也就是我们说的mini batch】,因此就引出了我们的随机梯度下降法,也就是mini batch,通过每次随机提取若干批次进行求梯度,最终我们就可以认为所得到的数据是可以代表整个我们数据集的样本空间的。


2.梯度路径的优化


牛顿法

优化下降路径,就是希望以更快的方向和速度去求梯度方向使损失函数达到极值点。为什么会选择这个方式进行优化呢?因为我们已经知道,求损失函数梯度本身不就是在求它的负梯度方向么?那么现在又说的这个路径优化中的路径是指什么?这是因为我们在随机挑选数据求梯度的时候会和我们真正的梯度方向产生偏差。或者在举个例子,我们从山上某个点下山的时候,也并不一定就只有一条路可以下山吧,说不定另一条路会更快呢。同时这里还牵扯到一个步长问题,也就是我们说的学习率,步长的选择会影响到梯度下降快慢以及路径,这样的话梯度方向就产生了偏差。在来看一张图:

15.png

在上面这张图中,蓝色的曲线就是我们的损失函数,我们定义一点,需求梯度,我们知道曲线上一点的导数就是该点的切线,也就是黄色直线,我们可以每次在直线上选一点到对应的曲线上,如果步长短那么拟合的就好,但速度慢,如果距离大,那么会会蓝色曲线偏差较大,因此我们可以在定义的点上画一条绿色的曲线,可以看到这个曲线和蓝色曲线(损失函数)拟合的是比较好的【这个就是牛顿法】,不过也可以看出,在绿色的这个二次函数曲线中,最低点其实是效果最好的,如果超过了这个最低点,反而拟合效果会差了。则权值更新可表示为:


16.gif

上面的公式可以用泰勒展开公式进行推导(这里就展开了,大家可以试一下,在x0出展开到二阶导即可推出)

对于多维的,表现形式如下:

17.png

通过上面的分析可以看出,通过牛顿法用近似值求最优解确实是可以的,但同样有个问题就是计算量是比较大的。


动量法(冲量法)

在看一下求梯度的过程,如下图:


18.png

从图中可以看出,在每个等高线上求梯度的时候,会不断的在等高线间进行调整(梯度的跨越和步长有关),会通过不停的迭代反复震荡中不断收敛,最后得到我们的最优解。那么我们就可以对这个过程进行优化,我们可以将每个梯度方向进行拆分,水平分量和垂直分量(图中灰色箭头)。这种震荡收敛中的上下震荡是由垂直分量导致的,而控制走向的是水平分量导致的。


分量的优化:


这个的思想是考虑了历史数据,怎么个考虑呢?如下图,在第二个点处求梯度时候,会考虑前一个值的垂直分量,发现前面值的垂直分量是向下(红色箭头)的与当前值的梯度垂直分量(蓝色箭头)相反,那么就可以将蓝色箭头这个部分方向上的长度缩短(震荡就减弱了),同理,前面值的水平方向是向右的,与当前值的反向一致,那么两个分量相加,这样就可以加快水平方向的速度。


19.png

但这也会有一个新的问题,通过记录历史数据来进行优化,如果这个过程是很长,意思就是中间产生非常非常多的历史数据,那么我得到的最新的这个点的梯度和我最原始或者是很考前的一些历史数据,关系可能就不大了,言外之意就是早期的点就失去了参考意义,所以在实际的求解过程中会引入一个权重系数,这个系数是给前面的历史数据的一个权重,让当前梯度值考虑比较近的历史数据 ,这个系数一般会被设置0.9【是不是又眼熟了?是不是在优化器中进程看到这个值】。因此这个方法也被称为动量法。以前在看吴恩达的课时,也听到过这个概念,他当时举了另一个例子,时从求最优解角度思考的,比如有一个小球它从某点沿着损失函数下滑,当他陷入到了一个局部最优解的时候,由于步长问题,他可能很难跳出来,因此可以给它一个动量【用手指拨他一下】让它跳出来继续下降,相当于给了一个惯性。


AdaGrad


在训练过程中,我们常常会设定学习率来得到我们最终的结果,而且我们也发现这个学习率在训练中是变化的(因为不变化可能会导致无法收敛),并且也是随着训练加深学习率逐渐减少,但如果是人为自己去设定应该每次学习率衰减多少,这个是很难控制的。所以另一个优化思路就是,能不能去自动优化学习率,让学习率自动衰减呢?


AdaGrad方法就是让学习率自适应的调节,这个方法和冲量法有类似,也是需要参考历史数据。公式如下:


20.gif

公式中S是历史上所有梯度数据的平方再开方。当历史数据越多的时候,那么学习率修改的也会多,值会逐渐减小,所以是实现了自适应。AdaGrad是比较适合于稀疏数据的训练,比如特征差异较大,猫狗分类,不适合于类似于长毛猫和短毛猫的训练(这个是特征程度上的不同)。


RMSprop与Adam


但是AdaGrad也是有缺点,由于将历史数据都考虑进来,因此如果在求解过程正好陷入了一个类似“平台”的地方,那么这个求解过程会很慢,即便跳出了这个平台,由于考虑了全部历史,也会导致梯度更新很慢。因此也让它去考虑部分数据,这就是RMSprop方法。而如果将RMSprop和动量法结合就变成了我们经常知道也经常用的的另一个优化算法Adam。


目录
相关文章
|
14天前
|
算法 vr&ar Python
R语言用极大似然和梯度下降算法估计GARCH(p)过程
R语言用极大似然和梯度下降算法估计GARCH(p)过程
14 0
|
2月前
|
机器学习/深度学习 算法 大数据
基于PyTorch对凸函数采用SGD算法优化实例(附源码)
基于PyTorch对凸函数采用SGD算法优化实例(附源码)
31 3
|
2月前
|
机器学习/深度学习 算法
反向传播原理的梯度下降算法
反向传播原理的梯度下降算法
|
10月前
|
机器学习/深度学习 算法 数据挖掘
最优化--梯度下降法--牛顿法(详解)
最优化--梯度下降法--牛顿法(详解)
|
机器学习/深度学习 自然语言处理 算法
深度学习基础入门篇[三]:优化策略梯度下降算法:SGD、MBGD、Momentum、Adam、AdamW
深度学习基础入门篇[三]:优化策略梯度下降算法:SGD、MBGD、Momentum、Adam、AdamW
深度学习基础入门篇[三]:优化策略梯度下降算法:SGD、MBGD、Momentum、Adam、AdamW
|
机器学习/深度学习 Python
【机器学习】numpy实现Momentum动量优化器
【机器学习】numpy实现Momentum动量优化器
256 0
【机器学习】numpy实现Momentum动量优化器
梯度下降算法过程以及感知机算法与梯度下降算法区别
梯度下降算法过程以及感知机算法与梯度下降算法区别
|
机器学习/深度学习
机器学习:随机梯度下降(SGD)与梯度下降(GD)的区别与代码实现。
机器学习:随机梯度下降(SGD)与梯度下降(GD)的区别与代码实现。
250 0