本节我们将讨论优化与深度学习之间的关系以及在深度学习中使用优化的挑战。对于深度学习问题,我们通常会先定义损失函数。一旦我们有了损失函数,我们就可以使用优化算法来尝试最小化损失。在优化中,损失函数通常被称为优化问题的目标函数。按照传统和惯则,大多数优化算法都关注的是最小化。如果我们需要最大化目标,那么有一个简单的解决方案:在目标函数前加负号即可。
由于大部分的深度学习目标函数组成复杂难以有解析解,因此我们需要使用数值的优化算法来获得其近似解。
这些优化方法获取数值的近似解通常都是需要不断地更新迭代数值。找到一组参数极小化网络的目标函数损失就是深度学习中优化问题的本质。
为了解决网络的优化问题,研究人员提出了诸多优化算法,其中包括动量算法(Momentum)、自适应优化算法(AdaGrad)、RMSProp 算法、随机梯度下降算法(SGD,Stochastic Gradient Descent)、Adam 算法等。
凸性(convexity)在优化算法的设计中起到至关重要的作用, 这主要是由于在这种情况下对算法进行分析和测试要容易得多。 换言之,如果该算法甚至在凸性条件设定下的效果很差, 通常我们很难在其他条件下看到好的结果。 此外,即使深度学习中的优化问题通常是非凸的, 它们也经常在局部极小值附近表现出一些凸性。
对于批量梯度下降算法,其 是在整个训练集上计算的,如果数据集比较大,可能会面临内存不足问题,而且其收敛速度一般比较慢。
每次经过完整一轮训练后更新一次参数,这使得梯度下降过程变得比较慢,并且需要很大内存保存中间结果。
随机梯度下降算法是另外一个极端, 是针对训练集中的一个训练样本计算的,又称为在线学习,即得到了一个样本,就可以执行一次参数更新。所以其收敛速度会快一些,但是有可能出现目标函数值震荡现象,因为高频率的参数更新导致了高方差。
随机梯度下降是对每个训练样本就更新一次网络参数,这样使得网络更新参数速度很快,但是问题就是由于训练数据多样,容易朝偏离网络最优点方向训练,网络训练不稳定。
小批量梯度下降算法是折中方案,选取训练集中一个小批量样本(一般是2的倍数,如32,64,128等)计算,这样可以保证训练过程更稳定,而且采用批量训练方法也可以利用矩阵计算的优势。这是目前最常用的梯度下降算法。
小批量梯度下降是批量梯度下降与随机梯度下降之间的一个折中,即经过一个小批量的训练数据更新一次参数,可以保证网络训练速度不太慢,也能使训练方向不至于偏离太多,具有一定稳定性。当使用小批量梯度下降时,通常也使用SGD这个术语。
小批量梯度下降不仅不能保证良好的收敛性,而且也存在一些其他的问题:
随机梯度下降由于更新方向取决于当前的批(batch)大小,导致其更新参数十分不稳定。
动量算法通过效仿物体运动时的惯性,可以在一定程度上保持先前的参数更新方向,同时约束当前的梯度向最终方向更新。如此,参数的更新不仅能够更快更稳定,而且还具有走出局部最优点的能力。该算法通过对梯度的一阶矩进行估计,使得梯度可以在横向上累积,在纵向上相互抵消,从而使更新震荡幅度减小,加快更新的速度。
动量算法可以由如下公式化:
其中, 为权重参数, 为学习率, 为平滑因子, 为目标函数。
SGD-M(动量梯度下降)
SGD 在遇到沟壑时容易陷入震荡。为此,可以为其引入动量 Momentum,加速 SGD 在正确方向的下降并抑制震荡。SGD-M 在原步长之上,增加了与上一时刻步长相关的 ,通常取 0.9 左右。这意味着参数更新方向不仅由当前的梯度决定,也与此前累积的下降方向有关。这使得参数中那些梯度方向变化不大的维度可以加速更新,并减少梯度方向变化较大的维度上的更新幅度。由此产生了加速收敛和减小震荡的效果。
从图中可以看出,引入动量有效的加速了梯度下降收敛过程。
NAG与SGD-M的区别
NAG全称为(Nesterov Accelerated Gradient 牛顿动量梯度下降),是在SGD-Momentum基础进一步优化所得。
前面的文章我们提到过,SGD-M主要是利用历史累积动量来代替当前梯度从而达到减小震荡,加速收敛的目的。而NAG与SGD-M的区别在于,在计算当前梯度的时候,先跟随历史累积动量前进一步,然后再看下一步怎么走。
如果不懂可以看一下这个解释:
回顾动量的方法,我们发现参数更新是基于两部分组成,一部分为当前位置的梯度,另一部分为前面累计下来的梯度值,参数更新方向就是将两者矢量相加的方向,但是我们会发现一个问题,当刚好下降到山谷附近时,如果这个时候继续以这样的方式更新参数,我们会有一个较大的幅度越过山谷,即:模型遇到山谷不会自动减弱更新的幅度。NAG针对上述问题对动量方法进行了改进,其表达式如下,其中一阶动量项m如下,二阶动量为1。
它是利用当前位置处先前的梯度值先做一个参数更新,然后在更新后的位置再求梯度,将此部分梯度然后跟之前累积下来的梯度值矢量相加,简单的说就是先根据之前累积的梯度方向模拟下一步参数更新后的值,然后将模拟后的位置处梯度替换动量方法中的当前位置梯度。为什么解决了之前说的那个问题呢?因为现在有一个预测后一步位置梯度的步骤,所以当在山谷附近时,预测到会跨过山谷时,该项梯度就会对之前梯度有个修正,相当于阻止了其跨度太大。下面这张图对其有个形象描述,其中蓝色线表示动量方法,蓝色短线表示当前位置梯度更新,蓝色长线表示之前累积的梯度;第一个红色线表示用NAG算法预测下一步位置的梯度更新,第一条棕色线表示先前累积的梯度,其矢量相加结果(绿色线)就是参数更新的方向。
SGD、SGD-M 和 NAG 均是以相同的学习率去更新 的各个分量,而深度学习模型中往往涉及大量的参数,不同参数的更新频率往往有所区别。Adagrad(Adaptive gradient algorithm 自适学习率应梯度下降)通过对更新频繁的参数使用小步长(使得学习到的参数更稳定,不至于被单个样本影响太多),而更新不频繁的参数使用大步长(多学习一些知识),使得每个参数有不同的学习率。
自适应优化算法可以由如下公式化:
其中 t 表示第 t 次更新, 表示第 t 次更新的梯度平方(向量,由 各元素自己进行平方运算所得,即 element-wise), 为权重参数, 为目标函数, 为学习率.
该算法与随机梯度下降的区别在于,它的学习率除以一个梯度平方的累积平方根。因此,如果某个参数更新频繁,那么它的真实学习率将变小,而更新不频繁的参数,它的真实学习率就相对较大。在数据分布稀疏的情况下,自适应优化算法能够比随机梯度下降算法更快且有效地收敛。然而,该算法随着更新次数的累积,最终会使学习率变得极小从而无法更新某些参数。
随着迭代的增加,我们的学习率是在逐渐变小的,这在“直观上”是正确的:当我们越接近最优解时,函数的“坡度”会越平缓,我们也必须走的更慢来保证不会穿过最优解。
AdaGrad的效果是:在参数空间中更为平缓的倾斜方向会取得更大的进步(因为平缓,所以历史梯度平方和较小,对应学习下降的幅度较小)。
优点:解决了SGD中学习率不能自适应调整的问题。
缺点:(1)对于训练深度神经网络模型而言,从训练开始时累积平方梯度值会越来越大,会导致学习率过早和过量的减少,从而导致迭代后期收敛及其缓慢。AdaGrad在某些深度学习模型上效果不错,但不是全部。(2)需要手动设置全局学习率
RMSProp 算法解决问题的出发点与动量算法类似。但是,与动量算法从一阶矩估计入手不同,RMSProp 算法对梯度进行二阶矩估计。由于波动幅度大的梯度具有较大的方差, RMSProp 算法将原来的梯度除以方差的平方根来更新参数,同样可以达到纵向上相互抵消,横向上累积的目标。RMSProp 算法可以由如下公式化:
其中 是遗忘因子(或称为指数衰减率),其余参数意义与AdaGrad的公式一样,ε 通常取一个极接近于 0 的值,防止除 0 错误。RMSProp 算法能够有效避免自适应优化算法中真实学习率急剧缩小的问题。在不稳定的目标函数优化问题中,RMSProp 算法表现得比随即梯度下降算法,动量算法,自适应优化算法都为优异。
RMSProp算法是AdaGrad算法的改进,修改AdaGrad以在非凸条件下效果更好,解决了AdaGrad所面临的问题。RMSProp主要思想:使用指数加权移动平均的方法计算累积梯度,以丢弃遥远的梯度历史信息(让距离当前越远的梯度的缩减学习率的权重越小)。
RMSProp算法不是像AdaGrad算法那样暴力直接的累加平方梯度,而是加了一个衰减系数来控制历史信息的获取多少。
直观理解RMSProp:
1.与adagrad对比
2.简单来讲,设置全局学习率之后,每次通过,全局学习率逐参数的除以经过衰减系数控制的历史梯度平方和的平方根,使得每个参数的学习率不同。
起到的效果是在参数空间更为平缓的方向,会取得更大的进步(因为平缓,所以历史梯度平方和较小,对应学习下降的幅度较小),并且能够使得陡峭的方向变得平缓,从而加快训练速度。
举个例子:
假设现在采用的优化算法是最普通的梯度下降法mini-batch。它的移动方向如下面蓝色所示:
假设我们现在就只有两个参数w,b,我们从图中可以看到在b方向走的比较陡峭,这影响了优化速度。
而我们采取AdaGrad算法/RMSProp算法之后,我们在算法中使用了累积平方梯度。从上图可以看出在b方向上的梯度g要大于在w方向上的梯度。那么在下次计算更新的时候,r是作为分母出现的,越大的反而更新越小,越小的值反而更新越大,那么后面的更新则会像下面绿色线更新一样,明显就会好于蓝色更新曲线。
在参数空间更为平缓的方向,会取得更大的进步(因为平缓,所以历史梯度平方和较小,对应学习下降的幅度较小),并且能够使得陡峭的方向变得平缓,从而加快训练速度。这就是RMSProp优化算法的直观好处。
特点:
RMSprop优化器虽然可以对不同的权重参数自适应的改变学习率,但仍要指定超参数 ,AdaDelta优化器对RMSProp算法进一步优化:AdaDelta算法额外维护一个状态变量 ,并使用 代替 RMSprop 中的学习率参数 ,使AdaDelta优化器不需要指定超参数
特点:
Adam 算法即自适应矩估计(Adaptive Moment Estimation)方法。
Adam算法的本质:其实就是Momentum+RMSProp的结合,然后再修正其偏差。Adam对梯度的一阶和二阶都进行了估计与偏差修正,使用梯度的一阶矩估计和二阶矩估计来动态调整每个参数的学习率(参数更新的幅度)。
Adam对学习率没有那么敏感,建议默认为0.001,实践中,也可以设置为 。Adam通常被认为对超参数的选择相当鲁棒,同时相比于Adagrad,不用存储全局所有的梯度,适合处理大规模数据。
Adam每次迭代参数的学习步长都有一个确定的范围,不会因为很大的梯度导致很大的学习步长,参数的值比较稳定,但是它也并非真的是参数不敏感的,学习率在训练的后期可仍然可能不稳定导致无法收敛到足够好的值,泛化能力较差。
Adam 优化算法应用在非凸优化问题中所获得的优势:
Adam 算法和传统的随机梯度下降的区别
Adam 算法是AdaGrad和RMSProp两种随机梯度下降扩展式的优点集合
Adam 算法同时获得了 AdaGrad 和 RMSProp 算法的优点。Adam 不仅如 RMSProp 算法那样基于一阶矩均值计算适应性参数学习率,它同时还充分利用了梯度的二阶矩均值(即有偏方差/uncentered variance)。具体来说,算法计算了梯度的指数移动均值(exponential moving average),超参数 beta1 和 beta2 控制了这些移动均值的衰减率。
移动均值的初始值和 beta1、beta2 值接近于 1(推荐值),因此矩估计的偏差接近于 0。该偏差通过首先计算带偏差的估计而后计算偏差修正后的估计而得到提升。
Adam的参数配置
另外,学习率衰减同样可以应用到 Adam 中。原论文使用衰减率 alpha=alpha/sqrt(t) 在 logistic 回归每个 epoch(t) 中都得到更新。
Adam论文建议的参数设定:alpha=0.001、beta1=0.9、beta2=0.999 和 epsilon=10E?8。
NAdam在 Adam 之上融合了 NAG 的思想。
SGD + 一阶动量 + Nesterov +二阶动量=NAG +二阶动量=Adam + Nesterov=Nadam
其中Nadam,在Adam公式基础上,对步骤1重新计算梯度:
从上图中可以看到不同算法在损失面等高线图中的学习过程,它们均同同一点出发,但沿着不同路径达到最小值点。其中 Adagrad、Adadelta、RMSprop 从最开始就找到了正确的方向并快速收敛;SGD 找到了正确方向但收敛速度很慢;SGD-M 和 NAG 最初都偏离了航道,但也能最终纠正到正确方向,SGD-M 偏离的惯性比 NAG 更大。
从上图展现了不同算法在鞍点处的表现。这里,SGD、SGD-M、NAG 都受到了鞍点的严重影响,尽管后两者最终还是逃离了鞍点;而 Adagrad、RMSprop、Adadelta 都很快找到了正确的方向。
优化算法选择:SGD、SGDM、NAG、Adam、AdaGrad、RMSProp、Nadam_UtopXExistential的博客-CSDN博客_sgdm算法
深度学习优化算法大全系列7:NAdam,算法选择,调参_bitcarmanlee的博客-CSDN博客_nadam
Adam优化算法_小刘鸭19的博客-CSDN博客_adam优化
G-kdom:优化方法——AdaGrad、RMSProp、Adam
https://blog.51cto.com/sddai/3026836
深度学习优化算法大全系列3:NAG(Nesterov Acceleration Gradient)
adam算法介绍和总结_Only_whitecat的博客-CSDN博客_adam算法
优化算法篇(三)--AdaGrad(自适应梯度算法)、RMSProp_龙王.*?的博客-CSDN博客_rmsprop和adagrad
深度学习优化函数详解-- Nesterov accelerated gradient (NAG)
优化算法:AdaGrad | RMSProp | AdaDelta | Adam
energy百分百:深度解析Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam等优化器
Copyright © 2002-2022 盛煌-盛煌娱乐-盛煌全球注册认证站 版权所有