欢迎浏览我公司网站!!
公司动态
深度学习随笔——优化算法( SGD、BGD、MBGD、Momentum、NAG、Adagrad、RMSProp、AdaDelta、Adam、NAdam)
时间: 2024-04-15浏览次数:
本节我们将讨论优化与深度学习之间的关系以及在深度学习中使用优化的挑战。对于深度学习问题,我们通常会先定义损失函数。一旦我们有了损失函数,我们就可以使用优化算法来尝试最小化损失。在优化中,损失函数通常被称为优化问题的目标函数。按照传统和惯则,大多数优化算法都关注的是最小化。如果我们需要最大化目标,那么
本节我们将讨论优化与深度学习之间的关系以及在深度学习中使用优化的挑战。对于深度学习问题,我们通常会先定义损失函数。一旦我们有了损失函数,我们就可以使用优化算法来尝试最小化损失。在优化中,损失函数通常被称为优化问题的目标函数。按照传统和惯则,大多数优化算法都关注的是最小化。如果我们需要最大化目标,那么有一个简单的解决方案:在目标函数前加负号即可。

由于大部分的深度学习目标函数组成复杂难以有解析解,因此我们需要使用数值的优化算法来获得其近似解。

这些优化方法获取数值的近似解通常都是需要不断地更新迭代数值。找到一组参数极小化网络的目标函数损失就是深度学习中优化问题的本质。

为了解决网络的优化问题,研究人员提出了诸多优化算法,其中包括动量算法(Momentum)、自适应优化算法(AdaGrad)、RMSProp 算法、随机梯度下降算法(SGD,Stochastic Gradient Descent)、Adam 算法等。

凸性(convexity)在优化算法的设计中起到至关重要的作用, 这主要是由于在这种情况下对算法进行分析和测试要容易得多。 换言之,如果该算法甚至在凸性条件设定下的效果很差, 通常我们很难在其他条件下看到好的结果。 此外,即使深度学习中的优化问题通常是非凸的, 它们也经常在局部极小值附近表现出一些凸性。

对于批量梯度下降算法,其 J(\	heta)是在整个训练集上计算的,如果数据集比较大,可能会面临内存不足问题,而且其收敛速度一般比较慢。

每次经过完整一轮训练后更新一次参数,这使得梯度下降过程变得比较慢,并且需要很大内存保存中间结果。

随机梯度下降算法是另外一个极端, J(\	heta)是针对训练集中的一个训练样本计算的,又称为在线学习,即得到了一个样本,就可以执行一次参数更新。所以其收敛速度会快一些,但是有可能出现目标函数值震荡现象,因为高频率的参数更新导致了高方差。

随机梯度下降是对每个训练样本就更新一次网络参数,这样使得网络更新参数速度很快,但是问题就是由于训练数据多样,容易朝偏离网络最优点方向训练,网络训练不稳定。

小批量梯度下降算法是折中方案,选取训练集中一个小批量样本(一般是2的倍数,如32,64,128等)计算,这样可以保证训练过程更稳定,而且采用批量训练方法也可以利用矩阵计算的优势。这是目前最常用的梯度下降算法。

小批量梯度下降是批量梯度下降与随机梯度下降之间的一个折中,即经过一个小批量的训练数据更新一次参数,可以保证网络训练速度不太慢,也能使训练方向不至于偏离太多,具有一定稳定性。当使用小批量梯度下降时,通常也使用SGD这个术语。

小批量梯度下降不仅不能保证良好的收敛性,而且也存在一些其他的问题:

  1. 很难选择一个合适的学习率,如果学习率太小,将会导致收敛非常缓慢;如果学习率太大,也会阻碍收敛,导致损失函数值在最小值附近波动甚至发散。
  2. 上述问题可以通过提前定义一个学习速率表,当达到相应轮数或者阈值时根据表改变学习率,但是这样无法适应训练数据本身特征。
  3. 并且,对于所有参数我们使用同一个学习速率,如果我们的数据是稀疏的或者我们特征具有不同的频率,我们可能不希望将它们更新到同样的程度,并且我们希望对那些出现频率低的特征更新更快。
  4. 另外在神经网络中,普遍是具有非凸的误差函数,这使得在优化网络过程中,很容易陷入无数的局部最优点,而且更大困难往往也不是陷入局部最优点,而是来自鞍点(也就是在一个维度上其梯度是递增,另一个维度其梯度是递减,而在鞍点处其梯度为0),这些鞍点附近往往被相同误差点所包围,且在任意维度梯度近似为0,所以随机梯度下降很难从这些鞍点逃出。

随机梯度下降由于更新方向取决于当前的批(batch)大小,导致其更新参数十分不稳定。

动量算法通过效仿物体运动时的惯性,可以在一定程度上保持先前的参数更新方向,同时约束当前的梯度向最终方向更新。如此,参数的更新不仅能够更快更稳定,而且还具有走出局部最优点的能力。该算法通过对梯度的一阶矩进行估计,使得梯度可以在横向上累积,在纵向上相互抵消,从而使更新震荡幅度减小,加快更新的速度。

动量算法可以由如下公式化:

其中, 为权重参数, 为学习率, 为平滑因子, 为目标函数。

SGD-M(动量梯度下降)

SGD 在遇到沟壑时容易陷入震荡。为此,可以为其引入动量 Momentum,加速 SGD 在正确方向的下降并抑制震荡。SGD-M 在原步长之上,增加了与上一时刻步长相关的 \\gamma m_{t-1}\\gamma通常取 0.9 左右。这意味着参数更新方向不仅由当前的梯度决定,也与此前累积的下降方向有关。这使得参数中那些梯度方向变化不大的维度可以加速更新,并减少梯度方向变化较大的维度上的更新幅度。由此产生了加速收敛和减小震荡的效果。

从图中可以看出,引入动量有效的加速了梯度下降收敛过程。

NAG与SGD-M的区别

NAG全称为(Nesterov Accelerated Gradient 牛顿动量梯度下降)是在SGD-Momentum基础进一步优化所得。

前面的文章我们提到过,SGD-M主要是利用历史累积动量来代替当前梯度从而达到减小震荡,加速收敛的目的。而NAG与SGD-M的区别在于,在计算当前梯度的时候,先跟随历史累积动量前进一步,然后再看下一步怎么走

momentum下降法示意图
NAG下降法示意图

如果不懂可以看一下这个解释:

回顾动量的方法,我们发现参数更新是基于两部分组成,一部分为当前位置的梯度,另一部分为前面累计下来的梯度值,参数更新方向就是将两者矢量相加的方向,但是我们会发现一个问题,当刚好下降到山谷附近时,如果这个时候继续以这样的方式更新参数,我们会有一个较大的幅度越过山谷,即:模型遇到山谷不会自动减弱更新的幅度。NAG针对上述问题对动量方法进行了改进,其表达式如下,其中一阶动量项m如下,二阶动量为1。

它是利用当前位置处先前的梯度值先做一个参数更新,然后在更新后的位置再求梯度,将此部分梯度然后跟之前累积下来的梯度值矢量相加,简单的说就是先根据之前累积的梯度方向模拟下一步参数更新后的值,然后将模拟后的位置处梯度替换动量方法中的当前位置梯度。为什么解决了之前说的那个问题呢?因为现在有一个预测后一步位置梯度的步骤,所以当在山谷附近时,预测到会跨过山谷时,该项梯度就会对之前梯度有个修正,相当于阻止了其跨度太大。下面这张图对其有个形象描述,其中蓝色线表示动量方法,蓝色短线表示当前位置梯度更新,蓝色长线表示之前累积的梯度;第一个红色线表示用NAG算法预测下一步位置的梯度更新,第一条棕色线表示先前累积的梯度,其矢量相加结果(绿色线)就是参数更新的方向。

SGD、SGD-M 和 NAG 均是以相同的学习率去更新 \	heta 的各个分量,而深度学习模型中往往涉及大量的参数,不同参数的更新频率往往有所区别。Adagrad(Adaptive gradient algorithm 自适学习率应梯度下降)通过对更新频繁的参数使用小步长(使得学习到的参数更稳定,不至于被单个样本影响太多),而更新不频繁的参数使用大步长(多学习一些知识),使得每个参数有不同的学习率。

自适应优化算法可以由如下公式化:

其中 t 表示第 t 次更新, g_{t}^{2} 表示第 t 次更新的梯度平方(向量,由 g_t 各元素自己进行平方运算所得,即 element-wise), 为权重参数, 为目标函数, 为学习率.

该算法与随机梯度下降的区别在于,它的学习率除以一个梯度平方的累积平方根。因此,如果某个参数更新频繁,那么它的真实学习率将变小,而更新不频繁的参数,它的真实学习率就相对较大。在数据分布稀疏的情况下,自适应优化算法能够比随机梯度下降算法更快且有效地收敛。然而,该算法随着更新次数的累积,最终会使学习率变得极小从而无法更新某些参数。

随着迭代的增加,我们的学习率是在逐渐变小的,这在“直观上”是正确的:当我们越接近最优解时,函数的“坡度”会越平缓,我们也必须走的更慢来保证不会穿过最优解。

AdaGrad的效果是:在参数空间中更为平缓的倾斜方向会取得更大的进步(因为平缓,所以历史梯度平方和较小,对应学习下降的幅度较小)。

优点:解决了SGD中学习率不能自适应调整的问题。

缺点:(1)对于训练深度神经网络模型而言,从训练开始时累积平方梯度值会越来越大,会导致学习率过早和过量的减少,从而导致迭代后期收敛及其缓慢。AdaGrad在某些深度学习模型上效果不错,但不是全部。(2)需要手动设置全局学习率

AdaGrad算法

RMSProp 算法解决问题的出发点与动量算法类似。但是,与动量算法从一阶矩估计入手不同,RMSProp 算法对梯度进行二阶矩估计。由于波动幅度大的梯度具有较大的方差, RMSProp 算法将原来的梯度除以方差的平方根来更新参数,同样可以达到纵向上相互抵消,横向上累积的目标。RMSProp 算法可以由如下公式化:

其中 是遗忘因子(或称为指数衰减率),其余参数意义与AdaGrad的公式一样,ε 通常取一个极接近于 0 的值,防止除 0 错误。RMSProp 算法能够有效避免自适应优化算法中真实学习率急剧缩小的问题。在不稳定的目标函数优化问题中,RMSProp 算法表现得比随即梯度下降算法,动量算法,自适应优化算法都为优异。

RMSProp算法是AdaGrad算法的改进,修改AdaGrad以在非凸条件下效果更好,解决了AdaGrad所面临的问题。RMSProp主要思想:使用指数加权移动平均的方法计算累积梯度,以丢弃遥远的梯度历史信息(让距离当前越远的梯度的缩减学习率的权重越小)。

RMSProp算法不是像AdaGrad算法那样暴力直接的累加平方梯度,而是加了一个衰减系数\\rho来控制历史信息的获取多少。

直观理解RMSProp:

1.与adagrad对比

2.简单来讲,设置全局学习率之后,每次通过,全局学习率逐参数的除以经过衰减系数控制的历史梯度平方和的平方根,使得每个参数的学习率不同。

起到的效果是在参数空间更为平缓的方向,会取得更大的进步(因为平缓,所以历史梯度平方和较小,对应学习下降的幅度较小),并且能够使得陡峭的方向变得平缓,从而加快训练速度。

举个例子:

假设现在采用的优化算法是最普通的梯度下降法mini-batch。它的移动方向如下面蓝色所示:

假设我们现在就只有两个参数w,b,我们从图中可以看到在b方向走的比较陡峭,这影响了优化速度。

而我们采取AdaGrad算法/RMSProp算法之后,我们在算法中使用了累积平方梯度。从上图可以看出在b方向上的梯度g要大于在w方向上的梯度。那么在下次计算更新的时候,r是作为分母出现的,越大的反而更新越小,越小的值反而更新越大,那么后面的更新则会像下面绿色线更新一样,明显就会好于蓝色更新曲线。

在参数空间更为平缓的方向,会取得更大的进步(因为平缓,所以历史梯度平方和较小,对应学习下降的幅度较小),并且能够使得陡峭的方向变得平缓,从而加快训练速度。这就是RMSProp优化算法的直观好处。

特点:

  • RMSprop依然依赖于全局学习率
  • RMSprop算是Adagrad的发展和Adadelta的变体,效果趋于二者之间
  • 适合处理非平稳目标 - 对于RNN效果很好
RMSProp算法

RMSprop优化器虽然可以对不同的权重参数自适应的改变学习率,但仍要指定超参数 \\eta,AdaDelta优化器对RMSProp算法进一步优化:AdaDelta算法额外维护一个状态变量 Δx_t,并使用 RMS[Δx]_t代替 RMSprop 中的学习率参数 \\eta,使AdaDelta优化器不需要指定超参数\\eta

特点:

  • 训练初中期,加速效果不错,很快
  • 训练后期,反复在局部最小值附近抖动\\eta
AdaDelta算法

Adam 算法即自适应矩估计(Adaptive Moment Estimation)方法。

Adam算法的本质:其实就是Momentum+RMSProp的结合,然后再修正其偏差。Adam对梯度的一阶和二阶都进行了估计与偏差修正,使用梯度的一阶矩估计和二阶矩估计来动态调整每个参数的学习率(参数更新的幅度)。

Adam对学习率没有那么敏感,建议默认为0.001,实践中,也可以设置为 5\	imes10^{-4}Adam通常被认为对超参数的选择相当鲁棒,同时相比于Adagrad,不用存储全局所有的梯度,适合处理大规模数据

Adam每次迭代参数的学习步长都有一个确定的范围,不会因为很大的梯度导致很大的学习步长,参数的值比较稳定,但是它也并非真的是参数不敏感的,学习率在训练的后期可仍然可能不稳定导致无法收敛到足够好的值,泛化能力较差。

Adam 优化算法应用在非凸优化问题中所获得的优势:

  • 直截了当地实现
  • 高效的计算
  • 所需内存少
  • 梯度对角缩放的不变性(第二部分将给予证明)
  • 适合解决含大规模数据和参数的优化问题
  • 适用于非稳态(non-stationary)目标
  • 适用于解决包含很高噪声或稀疏梯度的问题
  • 超参数可以很直观地解释,并且基本上只需极少量的调参

Adam 算法和传统的随机梯度下降的区别

  • 随机梯度下降保持单一的学习率(即 alpha)更新所有的权重,学习率在训练过程中并不会改变;
  • Adam 通过计算梯度的一阶矩估计和二阶矩估计而为不同的参数设计独立的自适应性学习率。

Adam 算法是AdaGrad和RMSProp两种随机梯度下降扩展式的优点集合

  • 适应性梯度算法(AdaGrad)为每一个参数保留一个学习率以提升在稀疏梯度(即自然语言和计算机视觉问题)上的性能。
  • 均方根传播(RMSProp)基于权重梯度最近量级的均值为每一个参数适应性地保留学习率。这意味着算法在非稳态和在线问题上有很有优秀的性能。

Adam 算法同时获得了 AdaGrad 和 RMSProp 算法的优点。Adam 不仅如 RMSProp 算法那样基于一阶矩均值计算适应性参数学习率,它同时还充分利用了梯度的二阶矩均值(即有偏方差/uncentered variance)。具体来说,算法计算了梯度的指数移动均值(exponential moving average),超参数 beta1 和 beta2 控制了这些移动均值的衰减率。

移动均值的初始值和 beta1、beta2 值接近于 1(推荐值),因此矩估计的偏差接近于 0。该偏差通过首先计算带偏差的估计而后计算偏差修正后的估计而得到提升。

Adam的参数配置

  • alpha:同样也称为学习率或步长因子,它控制了权重的更新比率(如 0.001)。较大的值(如 0.3)在学习率更新前会有更快的初始学习,而较小的值(如 1.0E-5)会令训练收敛到更好的性能。
  • beta1:一阶矩估计的指数衰减率(如 0.9)。
  • beta2:二阶矩估计的指数衰减率(如 0.999)。该超参数在稀疏梯度(如在 NLP 或计算机视觉任务中)中应该设置为接近 1 的数。
  • epsilon:该参数是非常小的数,其为了防止在实现中除以零(如 10E-8)。

另外,学习率衰减同样可以应用到 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重新计算梯度:

SGD optimization on loss surface contours(损失面轮廓上的SGD优化)

从上图中可以看到不同算法在损失面等高线图中的学习过程,它们均同同一点出发,但沿着不同路径达到最小值点。其中 Adagrad、Adadelta、RMSprop 从最开始就找到了正确的方向并快速收敛;SGD 找到了正确方向但收敛速度很慢;SGD-M 和 NAG 最初都偏离了航道,但也能最终纠正到正确方向,SGD-M 偏离的惯性比 NAG 更大。

SGD optimization on saddle point(鞍点上的SGD优化)

从上图展现了不同算法在鞍点处的表现。这里,SGD、SGD-M、NAG 都受到了鞍点的严重影响,尽管后两者最终还是逃离了鞍点;而 Adagrad、RMSprop、Adadelta 都很快找到了正确的方向。

  • 刚入门,优先考虑:SGD+Nesterov Momentum或者Adam。
  • 选择熟悉的算法。
  • 充分了解数据。---模型非常稀疏,则优先考虑自适应学习率算法Adam等。
  • 根据需求选择。--快速验证,Adam,模型上线或者结果发布前,精调的SGD进行模型的极致优化。
  • 先用小数据集实验。有论文研究指出,随机梯度下降算法的收敛速度和数据集的大小的关系不大。因此可以先用一个具有代表性的小数据集进行实验,测试一下最好的优化算法,并通过参数搜索来寻找最优的训练参数。
  • 考虑不同算法的组合。先用Adam进行快速下降,而后再换到SGD进行充分的调优。切换策略可以参考本文介绍的方法。
  • 数据集一定要充分的打散(shuffle)。这样在使用自适应学习率算法的时候,可以避免某些特征集中出现,而导致的有时学习过度、有时学习不足,使得下降方向出现偏差的问题。
  • 训练过程中持续监控训练数据和验证数据上的目标函数值以及精度或者AUC等指标的变化情况。对训练数据的监控是要保证模型进行了充分的训练——下降方向正确,且学习率足够高;对验证数据的监控是为了避免出现过拟合。
  • 制定一个合适的学习率衰减策略。可以使用定期衰减策略,比如每过多少个epoch就衰减一次;或者利用精度或者AUC等性能指标来监控,当测试集上的指标不变或者下跌时,就降低学习率。

优化算法选择:SGD、SGDM、NAG、Adam、AdaGrad、RMSProp、Nadam_UtopXExistential的博客-CSDN博客_sgdm算法

深度学习优化算法大全系列7:NAdam,算法选择,调参_bitcarmanlee的博客-CSDN博客_nadam

Adam优化算法_小刘鸭19的博客-CSDN博客_adam优化

G-kdom:优化方法——AdaGrad、RMSProp、Adam

blog.51cto.com/sddai/30

深度学习优化算法大全系列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等优化器

骆梁宸:从 SGD 到 Adam —— 深度学习优化算法概览(一)


Copyright © 2002-2022 盛煌-盛煌娱乐-盛煌全球注册认证站 版权所有

粤IP*******

平台注册入口