⑦个梯度下降优化器
3️⃣

⑦个梯度下降优化器

notion image
 
基本思想
优缺点
Momentum
利用指数加权平均的方法,使用动量(历史梯度的指数加权平均)来优化参数更新的方向
使得优化过程不那么震荡;同时可以跳出局部极值和鞍点。
NAG(Momentum的扩展)
使用向前一步的动量
具有向前看一步的能力,增加了反应性;减小了Momentum在最小值附近的震荡。
AdaGrad
使用历史梯度平方和来自适应地进行学习率衰减,为不同的参数提供不同的学习率衰减过程
对偏导较大的参数的学习率快速下降,而偏导较小的参数的学习率下降较缓;缺点是随着时间进行,学习率可能下降到0导致参数不再被优化
RMSProp(AdaGrad的优化)
利用指数加权平均的方法,使用最近历史的平方梯度的移动平均值来改进自适应学习率衰减
自适应学习率的同时能有效地克服 AdaGrad 学习率收敛至零的缺点,避免了梯度消失
AdaDelta(AdaGrad和RMSProp的进一步扩展)
使用参数变化平方的衰减移动平均值和梯度平方来共同计算参数的学习率
改变了自定义步长的计算,进而不需要手动设置初始学习率超参数,从而避免了对学习率敏感的问题
Adam(Momentum和RMSProp的结合)
结合RMSProp的过去平方梯度的指数衰减平均值来自适应学习率,利用动量来加速优化
动态自适应学习率的同时减少了梯度震荡。
Nadam
将Nesterovd动量添加到Adam中,使用动量的时候不是使用当前时刻的动量,而是向未来多走一步,取下一时刻的动量。
动态自适应学习率;相比Adam更具有向前看一步的能力,增加反应性,更进一步减少震荡。
 
 

1️⃣Momentum|动量法


基本思想
基本思想
  • 在大规模的训练数据集中,BGD每次梯度下降都会遍历整个训练数据集,会耗费大量计算能力;而SGD和MBGD由于随机性会产生下降过程中左右震荡的现象,导致收敛速度慢;
  • 动量梯度下降法则是通过减小震荡对算法进行优化,其核心是对梯度进行加权平均,使得梯度的变化不那么震荡,从而加速学习过程。
  • 动量算法的思想是将当前梯度与过去梯度加权平均,来获取即将更新的梯度。
动量法执行过程
动量法执行过程
指数加权平均公式
vt=βvt1+(1β)θtv_t=\beta v_{t-1}+(1-\beta) \theta_t
其中,vt1v_{t-1}是上一时刻的局部平均值,θt\theta_t表示通过当前时刻的实际值,vtv_t表示这一时刻的最终的局部平均值。
指数加权平均的偏差修正
当假设v0=0v_0=0时,刚开始几个时间步的vtv_t会非常小,因此需要加入偏差修正项,即每次在计算完vtv_t后,再进行一次修正
vt=vt1βtv_t=\frac{v_t}{1-\beta^t}
对指数加权平均的理解

是一种在线求局部均值的方法,也常用于平滑曲线。
从公式可以看出,利用迭代的算法,通过调节加权值β,可以反映某个区间的均值,且无需存储大量数据;
  • 当β较小时,均值依赖当前值较大,所以只能反映较小区间的均值;
  • 当β较大时,均值依赖历史值较大,所以可以反映较大区间的均值;
可近似看成是过去n=1/(1-β)个值的平均,如当β=0.9时,反映区间长度为1/(1-0.9) = 10的均值。
notion image
物理学上的动量

动量是物体质量和速度的乘积。动量是矢量,其方向和物体运动方向相同。
动量法的参数更新公式
vt=γvt1+ηθJ(θ)θθvt\begin{aligned}v_t&=\gamma v_{t-1}+\eta\nabla_\theta J(\theta)\\\theta&\leftarrow\theta-v_t\end{aligned}
其中η\eta 为学习率(一般设为0.1),γ\gamma为动量系数(一般设为0.9),θ\theta 为要更新的参数。当γ=0\gamma=0时,相当于SGD。
vt=γvt1+(1γ)ηθJ(θ)1γv_t=\gamma v_{t-1}+(1-\gamma)\frac{\eta\nabla_\theta J(\theta)}{1-\gamma}
这个梯度(速度变量)vtv_t实际上可以认为是对时间序列ηθJ(θ)1γ\frac{\eta\nabla_\theta J(\theta)}{1-\gamma}的最近n= 1/(1-γ) 项的指数加权移动平均。
动量法更新参数的好处
  • 每次更新更加温和,不至于突变;
    • SGD和MBGD由于随机性会产生下降过程中左右震荡的现象;
    • 另一方面,由于梯度下降法下降的方向是局部最速的方向(最速下降法),它的下降方向在每一个下降点一定与对应等高线的切线垂直,因此这也就导致了 GD 算法的锯齿现象;
    • 显然纵轴的波动对于参数优化是无意义的,我们更希望纵轴的波动减小一点,然后横轴收敛得快一点。
      显然纵轴的波动对于参数优化是无意义的,我们更希望纵轴的波动减小一点,然后横轴收敛得快一点。
  • 梯度下降法可能陷于局部最优,动量法使得在陷入局部极值点或者鞍点时可以及时跳出。
    • 为了解决跳出局部最优,动量梯度下降法为此模仿物体从高处滚到低处的原理,由于物体具有动量,遇到小坑时会由于原有动量而跃出小坑。
      • 动量梯度法可以跳出局部最优
        动量梯度法可以跳出局部最优
 
 

2️⃣NAG|Nesterov加速梯度


NAG的思想
NAG的思想
  • 动量法在知道梯度之后,更新自变量到新的位置,也就是说其实在每一步,是知道下一时刻自变量的位置的。
  • 于是Nesterov提出:直接采用下一时刻的梯度来和上一时刻梯度进行加权平均。
NAG的参数更新公式
vt=γvt1+ηθJ(θγvt1)θθvt\begin{aligned}v_t & =\gamma v_{t-1}+\eta \nabla_\theta J\left(\theta-\gamma v_{t-1}\right) \\\theta & \leftarrow\theta-v_t\end{aligned}
NAG和Momentum的区别
  • 经典的动量算法先计算当前梯度,再转向更新累积梯度。
  • 在 NAG 中,先转向更新累积梯度,再进行校正。
NAG的优点:
  • 防止算法的动量过大(速度过快),且增加了反应性(responsiveness),即NAG具有提前向前看一步的能力。(一个应用场景是,当在上坡的时候,它可以提前感知到上坡,并提前减速。)
  • NAG的收敛性能更好,基于动量的SGD在最小点附近会震荡,而NAG减小了这些震荡。
NAG相比momentum先做了路径的调整
NAG相比momentum先做了路径的调整
 
 

3️⃣AdaGrad|自适应梯度下降


AdaGrad的思想
AdaGrad的思想
  • 在神经网络的学习中,学习率η\eta 的值非常重要,学习率过小,会导致学习花费过多时间,学习率过大,则会导致算法发散不收敛。
  • 在有关学习率的有效技巧中,有一种被称为学习率衰减的方法,即随着学习进行,使学习率逐渐减小。
  • Adagrad会为每个参数适当地调整学习率,对不频繁的参数执行较大的更新,对频繁的参数执行较小的更新,或是具有损失较大偏导的参数相应地有一个快速下降的学习率,而具有小偏导的参数在学习率上有相对较小的下降。
  • 因此,Adagrad非常适合处理稀疏数据(如图像识别、NLP),可大大提高SGD的鲁棒性。
AdaGrad执行过程
AdaGrad执行过程
➣在时间步t参数θi\theta_i的梯度gt,ig_{t, i}
gt,i=θtJ(θt,i)g_{t, i}=\nabla_{\theta_t} J\left(\theta_{t, i}\right)
➣SGD的参数更新公式为
θt+1,i=θt,iηgt,i\theta_{t+1, i}=\theta_{t, i}-\eta \cdot g_{t, i}
即所有的参数采用同一个学习率。
➣AdaGrad的参数更新公式为
θt+1,i=θt,iηGt,ii+ϵgt,i\theta_{t+1, i}=\theta_{t, i}-\frac{\eta}{\sqrt{G_{t, i i}+\epsilon}} \cdot g_{t, i}
其中GtRd×dG_{t}\in \mathbb{R}^{d\times d}是一个对角矩阵,其中对角元素Gt,iiG_{t,ii}是参数θi\theta_i过去t个时刻的平方和,ϵ\epsilon是防止分母为0的平滑项(通常关于1e^-8的阶)。有趣的是,如果没有平方根的运算,算法的性能将会很差。
➣AdaGrad的参数更新公式的向量化表示
θt+1=θtηGt+ϵgtGt+1Gt+gtgt\theta_{t+1}=\theta_t-\frac{\eta}{\sqrt{G_t+\epsilon}} \odot g_t\\G_{t+1} \leftarrow G_t+g_t\odot g_t
其中GtG_{t}是包含所有参数过去t个时刻梯度的平方和的向量,\odot表示矩阵元素的乘法。
AdaGrad的参数更新路径:函数高效地向最优值移动;由于y方向上的梯度较大,因此刚开始变化较大,但后面会根据这个较大的变动按比例进行调整,减小更新的步伐,因此y方向上的更新程度被减弱。
AdaGrad的参数更新路径:函数高效地向最优值移动;由于y方向上的梯度较大,因此刚开始变化较大,但后面会根据这个较大的变动按比例进行调整,减小更新的步伐,因此y方向上的更新程度被减弱。
AdaGrad的优势与弱点
  • 由于学习率被调整为ηGt,ii+ϵ\frac{\eta}{\sqrt{G_{t, i i}+\epsilon}},这意味着参数的元素变动较大,被大幅度更新的元素的学习将变小,也就是说,按照参数的元素进行学习率衰减,使变动大的参数的学习率逐渐衰减。
  • AdaGrad的主要弱点是它在分母中累积平方梯度,这意味着随着时间的进行,学习越深入,学习幅度越小,学习率将下降到0,导致参数完全不再更新(RMSProp和AdaDelta方法对此进行了改善)。
    • 如果早期梯度很大,导致更新步长迅速减小,很容易出现后期优化不动的情况,因为更新步长会逐渐趋向于0.
      如果早期梯度很大,导致更新步长迅速减小,很容易出现后期优化不动的情况,因为更新步长会逐渐趋向于0.
 
 

4️⃣RMSProp|均方根反向传播法


PMSProp基本思想
PMSProp基本思想
  • RMSprop算法(root mean square prop),其核心就是均方根,与动量下降一样,它存在的意义就是加速梯度下降,其主要工作原理是利用梯度信息来调整梯度下降法的步长和方向。
  • RMSProp算法不是像AdaGrad算法那样暴力直接的累加平方梯度,而是通过计算平方梯度的移动平均值来动态调整学习率,使用一个衰减率γ\gamma来控制历史信息的获取多少,可以有效地克服 AdaGrad 学习率收敛至零的缺点。
RMSProp执行过程
RMSProp执行过程E[g2]t=γE[g2]t1+(1γ)gtgtθt+1=θtηE[g2]t+ϵgt\mathbb{E}[g^2]_{t} =\gamma \mathbb{E}[g^2]_{t-1}+(1-\gamma)g_t\odot g_t\\\theta_{t+1}=\theta_t-\frac{\eta}{\sqrt{\mathbb{E}[g^2]_t+\epsilon}} \odot g_t
notion image
RMSProp方法的好处
  • 收敛速度快:RMSProp算法在参数更新时动态地调整学习率,使得收敛速度更快。由于学习率自适应性较好,因此该算法更容易适用于不同的深度神经网络模型。
  • 鲁棒性强:RMSProp算法使用平方梯度的移动平均值来动态调整学习率,这意味着算法能够自适应地选择合适的步长,从而在参数空间中更稳定地搜索全局最优解。相比于传统的梯度下降法,RMSProp算法更具有鲁棒性。
  • 避免梯度消失问题:在深度神经网络模型中,梯度消失是一个很常见的问题。由于RMSProp算法使用了平方梯度的移动平均值,因此它能够避免梯度消失问题的发生,并且训练出更加稳健的深度神经网络模型。
  • 适用范围广:RMSProp算法能够应用于各种深度学习模型和问题,包括自然语言处理、计算机视觉、强化学习等。
 

5️⃣AdaDelta


AdaDelta执行过程
AdaDelta执行过程
AdaDelta是AdaGrad和RMSProp的扩展,回顾SGD,AdaGrad,RMSProp的参数更新量的公式:
SGDΔθt=ηgt,iSGD:\Delta \theta_t=-\eta g_{t,i}
AdaGrad:Δθt=ηGt+ϵgtAdaGrad:\Delta \theta_t=-\frac{\eta}{\sqrt{G_t+\epsilon}} \odot g_t
RMSProp:Δθt=ηE[g2]t+ϵgt简记为Δθt=ηRMS[g]tgtRMSProp:\Delta \theta_t=-\frac{\eta}{\sqrt{\mathbb{E}\left[g^2\right]_t+\epsilon}} \odot g_t\overset{简记为}{\longrightarrow}\Delta \theta_t=-\frac{\eta}{RMS[g]_t} \odot g_t
AdaDelta是RMSProp的进一步扩展,它基于的直觉是之前这些优化器参数与参数更新量的单位是不一致的(包括SGD、Momentum、AdaGrad、RMSProp等),为了保持单位的一致,AdaDelta定义了另一个指数衰减平均值,这次不是梯度的平方,而是参数更新量的平方
E[Δθ2]t=γE[Δθ2]t1+(1γ)Δθt2\mathbb{E}\left[\Delta \theta^2\right]_t=\gamma \mathbb{E}\left[\Delta \theta^2\right]_{t-1}+(1-\gamma) \Delta \theta_t^2
故参数更新的均方根为
RMS[Δθ]t=E[Δθ2]t+ϵR M S[\Delta \theta]_t=\sqrt{\mathbb{E}\left[\Delta \theta^2\right]_t+\epsilon}
由于时间步t的RMS[Δθ]tR M S[\Delta \theta]_t是未知的(由于Δθt\Delta \theta_t未知),我们用前一个时间步t-1参数更新的RMS值RMS[Δθ]t1R M S[\Delta \theta]_{t-1}去近似,将该值替换学习率η\eta,得到AdaDelta的参数更新公式。
AdaDelta参数更新公式
Δθt=RMS[Δθ]t1RMS[g]tgtθt+1=θt+ΔθtE[Δθ2]t=γE[Δθ2]t1+(1γ)Δθt2RMS[Δθ]t=E[Δθ2]t+ϵ\begin{aligned}\Delta \theta_t & =-\frac{R M S[\Delta \theta]_{t-1}}{R M S[g]_t} \odot g_t \\\theta_{t+1} & =\theta_t+\Delta \theta_t\end{aligned}\\\mathbb{E}\left[\Delta \theta^2\right]_t=\gamma \mathbb{E}\left[\Delta \theta^2\right]_{t-1}+(1-\gamma) \Delta \theta_t^2\\R M S[\Delta \theta]_t=\sqrt{\mathbb{E}\left[\Delta \theta^2\right]_t+\epsilon}
可以看到参数θ\theta和其变化量Δθ\Delta\theta的单位已经一致了。对于Adadelta,我们甚至不需要设置默认学习率η\eta,因为它已经从更新规则中消除了。
AdaDelta的特点
  • AdaDelta是梯度下降法的进一步扩展,旨在加速优化过程,例如减少达到最优值的迭代次数,或提高优化算法的能力,获得更好的最终结果;
  • AdaDelta建立在AdaGrad和RMSProp的基础上,提高了算法的收敛性能,并改变了自定义步长的计算,进而不需要手动设置初始学习率超参数,从而避免了对学习率敏感的问题;
  • 与RMSProp一样,AdaDelta为每个参数计算偏导数平方的衰减移动平均值,关键区别在于AdaDelta使用参数变化平方的衰减移动平均值来计算参数的学习率。
 
 

6️⃣Adam优化器


Adam 相当于是RMSProp的动量版,既要RMSProp自适应学习率,又要加入动量加快优化。RMSProp贡献了过去平方梯度的指数衰减平均值,而动量则贡献了过去梯度的指数衰减平均值。
Adam 相当于是RMSProp的动量版,既要RMSProp自适应学习率,又要加入动量加快优化。RMSProp贡献了过去平方梯度的指数衰减平均值,而动量则贡献了过去梯度的指数衰减平均值。
➣Adam参数更新公式
一阶矩: mt=β1mt1+(1β1)gt二阶矩: vt=β2vt1+(1β2)gt2参数更新:θt=θt1ηvt+ϵmt\begin{gathered}一阶矩:\ m_{t} =\beta_1 m_{t-1}+\left(1-\beta_1\right) g_t \\二阶矩:\ v_t = \beta_2 v_{t-1}+\left(1-\beta_2\right) g_t^2 \\参数更新:\theta_t = \theta_{t-1}- \frac{\eta}{\sqrt{v_t+\epsilon}}m_t\end{gathered}
➣Adam偏差修正下的参数更新公式
Adam认为在训练初期v0G0v_0,G_0初始为0,这样更新会存在偏差,因此采取矫正方
一阶矩的偏差修正:m^t=mt1β1t二阶矩的偏差修正:v^t=vt1β2t偏差修正下的参数更新:θt=θt1ηv^t+ϵm^t\begin{gathered}一阶矩的偏差修正: \hat{m}_t=\frac{m_t}{1-\beta_1^t}\\二阶矩的偏差修正: \hat{v}_t=\frac{v_t}{1-\beta_2^t}\\偏差修正下的参数更新:\theta_t = \theta_{t-1}- \frac{\eta}{\sqrt{\hat{v}_t+\epsilon}}\hat{m}_t\end{gathered}
如果改变计算顺序会提升算法效率,迭代公式等价于
偏差修正下的学习率:ηt=η01β2t1β1t偏差修正下的参数更新:θt=θt1ηtmtvt+ϵ\begin{gathered}偏差修正下的学习率:\eta_t=\eta_0\cdot\frac{\sqrt{1-\beta_2^t}}{1-\beta_1^t}\\偏差修正下的参数更新:\theta_t = \theta_{t-1}- \eta_t\frac{m_t}{\sqrt{v_t+\epsilon}}\end{gathered}
Adam优化器的优势
  • 梯度修正
    Adam使用梯度的一阶矩估计和二阶矩估计来修正梯度,这种修正可以减少梯度震荡,从而提高梯度在参数空间内的稳定性。
  • 学习率自适应
    Adam使用动态学习率。在训练开始时,学习率较大,可以快速收敛。随着训练的进行,学习率逐渐减小,以避免在极值处震荡。
  • 均值修正
    Adam对平均梯度和平均平方梯度进行了指数加权平均。由于训练开始时平均梯度和平均平方梯度值都较小,进行指数加权平均后,得到的修正值也相对较小。在训练后期,由于平均梯度和平均平方梯度值都较大,修正值也更大,这种修正保证了梯度下降过程的稳定性。
 
 

7️⃣Nadam


Nadam 是 NAG 和 Adam 优化器的结合,使用动量的时候不是使用当前时刻的动量,而是向未来多走一步,取下一时刻的动量。
Nadam 是 NAG 和 Adam 优化器的结合,使用动量的时候不是使用当前时刻的动量,而是向未来多走一步,取下一时刻的动量。
Nadam公式的由来
Nadam公式的由来
记过往历史平方梯度的指数衰减平均值为vtv_t,过往历史梯度的指数衰减平均值为mtm_t
  1. 经典动量更新规则如下:
    1. gt=θtJ(θt)mt=γmt1+ηgtθt+1=θtmt=θt(γmt1+ηgt)g_t=\nabla_{\theta_t} J(\theta_t)\\m_t=\gamma m_{t-1}+\eta g_t\\\theta_{t+1}=\theta_{t}-m_t=\theta_{t}-(\gamma m_{t-1}+\eta g_t)
  1. NAG在计算梯度之前用动量去先更新了参数,从而在梯度方向的计算更为精确:
    1. gt=θtJ(θtγmt1)mt=γmt1+ηgtθt+1=θtmt=θt(γmt1+ηgt)g_t=\nabla_{\theta_t} J(\theta_t-\gamma m_{t-1})\\m_t=\gamma m_{t-1}+\eta g_t\\\theta_{t+1}=\theta_{t}-m_t=\theta_{t}-(\gamma m_{t-1}+\eta g_t)
      上面的公式中,mt1m_{t-1}被应用了两次,一次是计算梯度gtg_t,一次是计算θt+1\theta_{t+1}.
  1. Dozat建议对NAG的公式进行修改,不再应用两次mt1m_{t-1},而是使用一个前瞻动量向量(look-ahead momentum vector)去更新当前参数:
    1. gt=θtJ(θt)mt=γmt1+ηgtθt+1=θt(γmt+ηgt)\begin{aligned}g_t & =\nabla_{\theta_t} J\left(\theta_t\right) \\m_t & =\gamma m_{t-1}+\eta g_t \\\theta_{t+1} & =\theta_t-\left(\gamma m_t+\eta g_t\right)\end{aligned}
      注意到,这样的更新规则下NAG相比Momentum的区别只在于参数θt+1\theta_{t+1}的更新公式中将mt1m_{t-1}替换成了mtm_t。同样,将Nesterovd动量添加到Adam得到Nadam也可以使用同样逻辑。
  1. Adam更新规则为:
    1. gt=θtJ(θt)mt=β1mt1+(1β1)gtm^t=mt1β1tθt=θt1ηv^t+ϵm^t=θtηv^t+ϵ(β1mt11β1t+(1β1)gt1β1t)\begin{aligned}g_t&=\nabla_{\theta_t}J(\theta_t) \\m_t&=\beta_1 m_{t-1}+\left(1-\beta_1\right) g_t\\\hat{m}_t&=\frac{m_t}{1-\beta_1^t}\\\theta_t &= \theta_{t-1}- \frac{\eta}{\sqrt{\hat{v}_t+\epsilon}}\cdot\hat{m}_t\\&=\theta_t-\frac{\eta}{\sqrt{\hat{v}_t+\epsilon}}\left(\frac{\beta_1m_{t-1}}{1-\beta_1^t}+\frac{(1-\beta_1)g_t}{1-\beta_1^t}\right)\end{aligned}
      注意到,mt11β1t\frac{m_{t-1}}{1-\beta_1^t}可视为前一个时间步动量的偏差修正,因此公式可改写为:
      θt=θtηv^t+ϵ(β1m^t1+(1β1)gt1β1t)\theta_t=\theta_t-\frac{\eta}{\sqrt{\hat{v}_t+\epsilon}}\left(\beta_1\hat{m}_{t-1}+\frac{(1-\beta_1)g_t}{1-\beta_1^t}\right)
  1. 将Nesterovd动量添加到Adam中,即用当前时间步t的动量m^t\hat{m}_t来替换公式中的m^t1\hat{m}_{t-1},得到Nadam的更新规则:
    1. θt+1=θtηv^t+ϵ(β1m^t+(1β1)gt1β1t)\theta_{t+1}=\theta_t-\frac{\eta}{\sqrt{\hat{v}_t+\epsilon}}\left(\beta_1\hat{m}_{t}+\frac{(1-\beta_1)g_t}{1-\beta_1^t}\right)
 
 
 
 
参考链接: