SGD、Momentum、RMSprop、Adam区别与联系

本文介绍了几种常见的优化算法,包括SGD及其改进版如带有动量的SGD (SGD with Momentum) 和带有Nesterov加速的SGD (SGD with Nesterov Acceleration),以及自适应学习率算法如AdaGrad、RMSProp和Adam等。这些算法通过引入动量和自适应学习率来提高训练效率,避免局部最小值和鞍点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载地址:https://zhuanlan.zhihu.com/p/32488889

优化算法框架:

  1. 计算目标函数关于当前参数的梯度: g_{t}=\nabla f(w_{t})\\
  2. 根据历史梯度计算一阶动量和二阶动量: m_{t}=\phi(g_{1},g_{2},...,g_{t})\\ V_{t}=\psi(g_{1},g_{2},...,g_{t})
  3. 计算当前时刻的下降梯度: \eta_{t}=\frac{\alpha}{\sqrt{V_{t}}}\cdot m_{t}\\
  4. 根据下降梯度进行更新: w_{t+1}=w_{t}-\eta_{t}\\

最核心的区别就是第三步所执行的下降方向,在这个式子中,前半部分是实际的学习率(也即下降步长),后半部分是实际的下降方向。不同优化算法也就是不断地在这两部分上做文章。


最朴素的优化算法就是SGD了,没有动量和自适应学习率的概念,但还是有很多人在用着。


SGD

梯度更新规则:

SGD的形式最简单

\eta_{t}=\alpha\cdot g_{t}\\

存在问题:

因为更新比较频繁,会造成 cost function 有严重的震荡,最终停留在Local Minima或者Saddle Point处。


为了能够跳出Local Minima和Saddle Point,提出了动量的概念。


SGD with Momentum

梯度更新规则:

Momentum在梯度下降的过程中加入了惯性,使得梯度方向不变的维度上速度变快,梯度方向有所改变的维度上的更新速度变慢,这样就可以加快收敛并减小震荡。

m_{t}=\beta_{1}\cdot m_{t-1}+(1-\beta_{1})\cdot g_{t}\\

一阶动量是移动平均值,这里 \beta_{1} 的经验值为0.9,也就是说时刻t的主要下降方向是由t-1时刻的下降方向再加一点点t时刻的偏向决定的。

存在问题:

  1. 不具备一些先知,例如快要上坡时,就知道需要减速了,适应性会更好;
  2. 不能根据参数的重要性而对不同的参数进行不同程度的更新。


SGD with Nesterov Acceleration

NAG改进了SGDM的第一个存在问题,在计算梯度时,不是在当前位置,而是未来的位置上。因此这里的梯度是跟着累积动量走了一步后的梯度,即 g_{t}=\nabla f(w_{t}-\frac{\alpha}{\sqrt{V_{t-1}}}\cdot m_{t-1})\\


我们希望能够根据参数的重要性而对不同的参数进行不同程度的更新,学习率是自适应的。对于经常更新的参数,我们已经积累了大量关于它的知识,不希望被单个样本影响太大,希望学习速率慢一些;对于偶尔更新的参数,我们了解的信息太少,希望能从每个偶然出现的样本身上多学一些,即学习速率大一些。


AdaGrad

梯度更新规则:

二阶动量为该维度上迄今为止所有梯度值的平方和

V_{t}=\sum_{\tau=1}^{t}{g_{\tau}^{2}}\\

为了避免分母为0,加了一项随机扰动

\eta_{ti}=\frac{\alpha}{\sqrt{V_{ti}+\varepsilon}}\cdot m_{ti}\\


存在问题:

分母会不断积累,这样学习率就会收缩并最终会变得非常小。


RMSProp

梯度更新规则:

解决Adagrad学习率急剧下降的问题,RMSProp改变了二阶动量计算方法,即用窗口滑动加权平均值计算二阶动量。

V_{t}=\beta_{2}\cdot V_{t-1}+(1-\beta_{2})g_{t}^{2}\\

Hinton 建议设定 \beta_{2} 为 0.9, 学习率 \alpha 为 0.001。


集成动量+自适应学习率的优化算法应该是目前最好的。


Adam

梯度更新规则:

Adam = Adaptive + Momentum,顾名思义Adam集成了SGD的一阶动量和RMSProp的二阶动量。

m_{t}=\beta_{1}\cdot m_{t-1}+(1-\beta_{1})\cdot g_{t}\\ V_{t}=\beta_{2}\cdot V_{t-1}+(1-\beta_{2})g_{t}^{2}\\

优化算法里最常见的两个超参数  \beta_1, \beta_2 就都在这里了,前者控制一阶动量,后者控制二阶动量。

若在Adam基础上再加一个Nesterov加速,是不是更牛逼了,这就是Nadam。 5.34c-.314.314-.3.846.03 1.177z” fill-rule=”evenodd”>

### 不同优化算法之间的区别联系 #### 随机梯度下降 (SGD) 随机梯度下降(SGD) 是一种简单有效的最优化方法,在每次迭代过程中只使用单个样本或少量样本来估计整个数据集上的梯度。这种方法减少了计算成本并引入了一定程度的噪声,有助于跳出局部最优解[^1]。 ```python optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9) ``` #### 动量法 (Momentum) 动量法通过累积历史梯度来加速 SGD 收敛过程中的运动趋势,从而减少震荡幅度。具体来说,动量项会考虑之前几次迭代的方向,使得当前更新更加平滑稳定。这可以有效缓解鞍点附近的学习困难问题[^2]。 ```python optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9) ``` #### RMSProp 为了克服传统 SGD 及其变体可能存在的振荡过大以及收敛缓慢等问题,RMSProp 对权重 \(W\) 和偏置 \(b\) 的梯度采用了微分平方加权平均数的方法来进行调整。这种方式能够动态调节各个维度上不同的学习速率,进而提高整体性能表现。 ```python optimizer = torch.optim.RMSprop(model.parameters(), lr=0.01, alpha=0.99) ``` #### 自适应矩估计 (Adam) Adam 结合了 MomentumRMSProp 两种策略的优势:一方面利用指数衰减均值来跟踪全局一阶矩;另一方面则基于二阶矩信息来自适应地改变各参数的学习率大小。这种组合方式不仅继承了前两者快速收敛的特点,还具备更强鲁棒性和泛化能力。 ```python optimizer = torch.optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.999)) ``` 综上所述: - **SGD** 提供了一个基础框架; - **Momentum** 在此基础上增加了惯性效应以帮助更快更平稳地下降; - **RMSProp** 则专注于解决特定情况下(如高维空间内)可能出现的问题; - 而 **Adam** 综合运用多种技术手段实现了更为高效稳定的训练流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值