当前位置:   article > 正文

SGD、Momentum、AdaGrad、RMSProp和Adam的区别_rmsprop和adam哪个好

rmsprop和adam哪个好

一、随机梯度下降法(Stochastic Gradient Descent, SGD

原理

SGD是最基本的优化算法之一。它通过在每次迭代中计算损失函数关于权重的梯度(对一小批量训练样本),然后沿着梯度的反方向来最小化损失。

公式

W t + 1 = W t − α ∇ J ( W t ; X i , y i ) W_{t+1} = W_t - \alpha\nabla J(W_t; X_i , y_i) Wt+1=WtαJ(Wt;Xi,yi)

其中:

  • Wt是第t步的模型权重。
  • α \alpha α是学习率。
  • ∇J(Wt ; Xi , yi)是损失函数J对于权重Wt在一个小批次Xi和对应标签yi上的梯度。

Pytorch中的用法

learning_rate = 0.01
optimizer = optim.SGD(model.parameters(), lr=learning_rate)
  • 1
  • 2

缺点

1、震荡和收敛速度慢:SGD在优化过程中容易受到梯度噪声的影响,导致SGD可能会产生不稳定的训练过程,因为它每次迭代只考虑当前梯度,容易在某些区域中卡住,导致收敛速度较慢。

2、需要手动设置学习率:SGD的性能高度依赖学习率的选择。学习率大了会导致训练不稳定,模型参数发散;小了会使训练收敛得非常慢。因此,需要仔细调整学习率,这需要大量试验。

3、容易陷入局部最小值:SGD只考虑了局部梯度信息,因此容易陷入局部最小值,而忽略全局最小值。

4、对初始只敏感:SGD对初始参数值非常敏感。不同的初始值可能导致不同的收敛结果,这使得模型初始化变得相当复杂。

为了克服SGD的这些不足,研究人员从梯度方向学习率两方面入手,提出了Momentum、Adagrad、RMSProp、Adam等改进算法。

二、动量法(Momentum)

原理

动量法在SGD的基础上引入了过去梯度的移动平均值。它积累了当前梯度和以前梯度的一部分。这有助于平滑优化过程中震荡,加速收敛。

公式

v t + 1 = β v t + ( 1 − β ) ∇ J ( W t ; X i , y i ) W t + 1 = W t − α v t + 1 v_{t+1}=\beta v_t+(1-\beta)\nabla J(W_t;X_i,y_i)\\ W_{t+1}=W_t-\alpha v_{t+1} vt+1=βvt+(1β)J(Wt;Xi,yi)Wt+1=Wtαvt+1

其中: β \beta β是动量超参数,通常在0.8到0.99之间选择。

Pytorch中的用法

learning_rate = 0.01
momentum = 0.9  # 动量参数
optimizer = optim.SGD(model.parameters(), lr=learning_rate, momentum=momentum)
  • 1
  • 2
  • 3

个人理解

动量法是在SGD的基础上从梯度方向方面做了改进。在SGD中,每次都是减去当前小批次的梯度,如果当前批次的梯度方向严重偏离目标方向时,那么本次梯度更新也会导致模型参数发生较大的偏离。而在Momentum中,每次的更新操作中除了有当前小批次的梯度,还包含了以前的梯度的移动平均值(这里可以理解为梯度更新的整体趋势),那么即使本次梯度的方向严重偏离,也会被以前的累积梯度“纠正”一部分偏差。

以下是关于SGD和Momentum梯度下降的对比图。

在这里插入图片描述

从图中可以看出,当本次小批量的梯度方向偏离严重时,SGD就会按照这次的梯度方向进行更新,从而导致模型参数出现较大偏差;而Momentum会将本次的梯度与过去的累积梯度相结合,从而在一定程度上“纠正”本次梯度的偏差。

由此可见,相较于SGD,Momentum能够有效地缓解“震荡”,并加速收敛。

为什么Momentum结合了过去的累积梯度就好使?(或者说,为什么上述Momentum的公式奏效?)

这里可以参考一下吴恩达老师深度学习第63节关于指数加权平均的讲解:https://www.bilibili.com/video/BV1FT4y1E74V?p=63

三、自适应梯度法(Adagrad)

原理

Adagrad是在SGD的基础上从学习率方面做了改进,根据训练过程中每个参数的梯度自适应地调整学习率。它积累了每个参数的过去梯度平方,并使用这些信息来缩放学习率。具有较大梯度的参数接收较小的更新,而具有较小梯度的参数接收较大的更新。

公式

G t + 1 = G t + ( ∇ J ( W t ; X i , y i ) ) 2 W t + 1 = W t − α G t + 1 + ϵ ∇ J ( W t ; X i , y i ) G_{t+1}=G_t+(\nabla J(W_t;X_i,y_i))^2 \\ W_{t+1}=W_t-\frac{\alpha}{\sqrt{G_{t+1}+\epsilon}}\nabla J(W_t;X_i,y_i) Gt+1=Gt+(J(Wt;Xi,yi))2Wt+1=WtGt+1+ϵ αJ(Wt;Xi,yi)

其中:

  • Gt是一个对过去梯度平方的积累,初始值通常为0。
  • ϵ \epsilon ϵ是一个很小的常数,用于防止分母为零。

Pytorch中的用法

learning_rate = 0.01
optimizer = optim.Adagrad(model.parameters(), lr=learning_rate)
  • 1
  • 2

四、自适应平方根梯度法(RMSProp)

原理

RMSProp相对于Adagrad添加了一个衰减系数,它降低了过去梯度平方和的权重。这意味着RMSProp能够在训练过程中逐渐减小学习率,但不会像Adagrad那样迅速降低到几乎为零,因此RMSProp使得学习率下降得更加平稳。

公式

E [ G 2 ] t = β E [ G 2 ] t − 1 + ( 1 − β ) ( ∇ J ( W t ; X i , y i ) ) 2 W t + 1 = W t − α E [ G 2 ] t + ϵ ∇ J ( W t ; X i , y i ) E[G^2]_t=\beta E[G^2]_{t-1}+(1-\beta)(\nabla J(W_t;X_i,y_i))^2\\ W_{t+1}=W_t-\frac{\alpha}{\sqrt{E[G^2]_t+\epsilon}}\nabla J(W_t;X_i,y_i) E[G2]t=βE[G2]t1+(1β)(J(Wt;Xi,yi))2Wt+1=WtE[G2]t+ϵ αJ(Wt;Xi,yi)

其中:E[G2]t是对过去梯度平方的指数移动平均,初始值通常为0。

Pytorch中的用法

learning_rate = 0.001
decay = 0.9  # 衰减参数(通常使用默认值0.9)
optimizer = optim.RMSprop(model.parameters(), lr=learning_rate, alpha=decay)
  • 1
  • 2
  • 3

五、自适应矩估计法(Adam)

原理

Adam从梯度方向学习率两方面入手,结合了momentum和RMSProp的优点。它维护过去梯度的移动平均值(类似于动量)和过去梯度平方的移动平均值。这些移动平均值用于计算每个参数的自适应学习率。

优点

Adam是深度学习中最常用的优化算法之一。它结合了动量和自适应学习率的优点,达到快速收敛、良好的泛化性能和对噪声梯度的鲁棒性。此外,它还具有内置的偏差校正,用于处理初始化问题。

公式

m t + 1 = β 1 m t + ( 1 − β 1 ) ∇ J ( W t ; X i , i i ) v t + 1 = β 2 v t + ( 1 − β 2 ) ( ∇ J ( W t ; X i , y i ) ) 2 m ^ t + 1 = m t + 1 1 − β 1 t + 1 v ^ t + 1 = v t + 1 1 − β 2 t + 1 W t + 1 = W t − α v ^ t + 1 + ϵ m ^ t + 1 m_{t+1}=\beta_1 m_t+(1-\beta_1)\nabla J(W_t;X_i,i_i)\\ v_{t+1}=\beta_2 v_t+(1-\beta_2)(\nabla J(W_t;X_i,y_i))^2\\ \hat{m}_{t+1}=\frac{m_{t+1}}{1-\beta^{t+1}_1}\\ \hat{v}_{t+1}=\frac{v_{t+1}}{1-\beta^{t+1}_2}\\ W_{t+1}=W_t-\frac{\alpha}{\sqrt{\hat{v}_{t+1}+\epsilon}}\hat{m}_{t+1} mt+1=β1mt+(1β1)J(Wt;Xi,ii)vt+1=β2vt+(1β2)(J(Wt;Xi,yi))2m^t+1=1β1t+1mt+1v^t+1=1β2t+1vt+1Wt+1=Wtv^t+1+ϵ αm^t+1

其中:

  • mt和vt是对过去梯度和梯度平方的移动平均值,初始值通常为0。
  • β \beta β1 β \beta β2是动量和梯度平方的超参数,通常分别在0.8到0.99和0.9到0.999之间选择。

公式中第三行和第四行主要是为了校正初始偏差,详细的可参考吴恩达老师深度学习第65节相关内容https://www.bilibili.com/video/BV1FT4y1E74V?p=65

Pytorch中的用法

learning_rate = 0.001
optimizer = optim.Adam(model.parameters(), lr=learning_rate)
  • 1
  • 2

附:GPT的问答

问:Momentum考虑了过去梯度的加权平均,请解释一下加权平均的意思和作用

动量(Momentum)算法中的“过去梯度的加权平均”指的是对过去几个梯度值进行加权平均的操作。这个加权平均的操作的作用是在优化过程中增加了动量,帮助优化算法更好地处理梯度的变化,从而改善训练的速度和稳定性。

这个动量项具有以下作用:

  1. 增加优化算法的速度: 动量项积累了过去梯度的信息,使得梯度更新具有惯性,能够在训练中更快地前进。这有助于加速收敛,尤其是在损失函数曲面存在平坦区域或峡谷时。
  2. 减轻梯度噪声的影响: 动量平均了过去梯度的方向,有助于减轻梯度的随机波动对优化过程的影响,从而使训练更加稳定。
  3. 帮助跳出局部最小值: 动量可以帮助模型跳出局部最小值,因为它具有一定的“动量”,有助于穿越局部最小值附近的平坦区域。

总的来说,加权平均的动量项使得优化算法在训练过程中具有一定的“惯性”,能够更好地应对梯度的变化,从而改善了训练的速度和稳定性。这是Momentum优化算法相对于标准的随机梯度下降算法的主要改进之一。

ps:由于本人学识有限,难免存在不足和错误之处,诚恳希望各位读者能够批评指正,共同学习进步

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/886592
推荐阅读
相关标签
  

闽ICP备14008679号