Geeks_Z の Blog Geeks_Z の Blog
首页
  • 学习笔记

    • 《HTML》
    • 《CSS》
    • 《JavaWeb》
    • 《Vue》
  • 后端文章

    • Linux
    • Maven
    • 汇编语言
    • 软件工程
    • 计算机网络概述
    • Conda
    • Pip
    • Shell
    • SSH
    • Mac快捷键
    • Zotero
  • 学习笔记

    • 《数据结构与算法》
    • 《算法设计与分析》
    • 《Spring》
    • 《SpringMVC》
    • 《SpringBoot》
    • 《SpringCloud》
    • 《Nginx》
  • 深度学习文章
  • 学习笔记

    • 《PyTorch》
    • 《ReinforementLearning》
    • 《MetaLearning》
  • 学习笔记

    • 《高等数学》
    • 《线性代数》
    • 《概率论与数理统计》
  • 增量学习
  • 哈希学习
GitHub (opens new window)

Geeks_Z

AI小学生
首页
  • 学习笔记

    • 《HTML》
    • 《CSS》
    • 《JavaWeb》
    • 《Vue》
  • 后端文章

    • Linux
    • Maven
    • 汇编语言
    • 软件工程
    • 计算机网络概述
    • Conda
    • Pip
    • Shell
    • SSH
    • Mac快捷键
    • Zotero
  • 学习笔记

    • 《数据结构与算法》
    • 《算法设计与分析》
    • 《Spring》
    • 《SpringMVC》
    • 《SpringBoot》
    • 《SpringCloud》
    • 《Nginx》
  • 深度学习文章
  • 学习笔记

    • 《PyTorch》
    • 《ReinforementLearning》
    • 《MetaLearning》
  • 学习笔记

    • 《高等数学》
    • 《线性代数》
    • 《概率论与数理统计》
  • 增量学习
  • 哈希学习
GitHub (opens new window)
  • Python

  • MLTutorials

    • 机器学习基础

    • 模型与算法

    • 模型优化

      • 局部极小值与鞍点
      • 批量和动量
      • 学习率
      • weight_decay
      • 优化器
        • 一个框架回顾优化算法
        • SGD
        • SGD with Momentum
        • SGD with Nesterov Acceleration
        • AdaGrad
        • AdaDelta / RMSProp
        • Adam
        • AdamW
        • Nadam
        • 补充:指数移动平均值的偏差修正
        • References
      • 优化算法
      • 各种Optimizer梯度下降优化算法回顾和总结
      • AI算法工程师必备的深度学习最优化上
      • PyTorch优化神经网络训练的17种方法
      • 机器学习调参自动优化方法
      • Dropout
      • 梯度下降
      • 反向传播
  • 卷积神经网络

  • 循环神经网络

  • Transformer

  • VisionTransformer

  • 扩散模型

  • 计算机视觉

  • PTM

  • MoE

  • LoRAMoE

  • LongTailed

  • 多模态

  • 知识蒸馏

  • PEFT

  • 对比学习

  • 小样本学习

  • 迁移学习

  • 零样本学习

  • 集成学习

  • Mamba

  • PyTorch

  • CL

  • CIL

  • 小样本类增量学习FSCIL

  • UCIL

  • 多模态增量学习MMCL

  • LTCIL

  • DIL

  • 论文阅读与写作

  • 分布外检测

  • GPU

  • 深度学习调参指南

  • AINotes
  • MLTutorials
  • 模型优化
Geeks_Z
2025-07-04
目录

优化器

一个框架回顾优化算法

深度学习优化算法经历了 SGD -> SGDM -> NAG ->AdaGrad -> AdaDelta -> Adam -> Nadam 这样的发展历程。

首先定义:待优化参数: w ,目标函数: f(w) ,初始学习率 α。

而后,开始进行迭代优化。在每个epoch t :

  1. 计算目标函数关于当前参数的梯度: gt=∇f(wt)
  2. 根据历史梯度计算一阶动量和二阶动量:mt=ϕ(g1,g2,⋯,gt);Vt=ψ(g1,g2,⋯,gt),
  3. 计算当前时刻的下降梯度: ηt=α⋅mt/Vt
  4. 根据下降梯度进行更新: wt+1=wt−ηt

步骤3、4对于各个算法都是一致的,主要的差别就体现在1和2上。

SGD

SGD没有动量的概念,也就是说:

mt=gt;Vt=I2

代入步骤3,可以看到下降梯度就是最简单的

ηt=α⋅gt

SGD最大的缺点是下降速度慢,而且可能会在沟壑的两边持续震荡,停留在一个局部最优点。

SGD with Momentum

为了抑制SGD的震荡,SGDM认为梯度下降过程可以加入惯性。下坡的时候,如果发现是陡坡,那就利用惯性跑的快一些。SGDM全称是SGD with momentum,在SGD基础上引入了一阶动量:

mt=β1⋅mt−1+(1−β1)⋅gt

一阶动量是各个时刻梯度方向的指数移动平均值,约等于最近 1/(1−β1) 个时刻的梯度向量和的平均值。

也就是说,t 时刻的下降方向,不仅由当前点的梯度方向决定,而且由此前累积的下降方向决定。 β1 的经验值为0.9,这就意味着下降方向主要是此前累积的下降方向,并略微偏向当前时刻的下降方向。想象高速公路上汽车转弯,在高速向前的同时略微偏向,急转弯可是要出事的。

SGD with Nesterov Acceleration

SGD 还有一个问题是困在局部最优的沟壑里面震荡。想象一下你走到一个盆地,四周都是略高的小山,你觉得没有下坡的方向,那就只能待在这里了。可是如果你爬上高地,就会发现外面的世界还很广阔。因此,我们不能停留在当前位置去观察未来的方向,而要向前一步、多看一步、看远一些。

NAG全称Nesterov Accelerated Gradient,是在SGD、SGD-M的基础上的进一步改进,改进点在于步骤1。我们知道在时刻t的主要下降方向是由累积动量决定的,自己的梯度方向说了也不算,那与其看当前梯度方向,不如先看看如果跟着累积动量走了一步,那个时候再怎么走。因此,NAG在步骤1,不计算当前位置的梯度方向,而是计算如果按照累积动量走了一步,那个时候的下降方向:

gt=∇f(wt−α⋅mt−1/Vt−1)

然后用下一个点的梯度方向,与历史累积动量相结合,计算步骤2中当前时刻的累积动量。

AdaGrad

此前我们都没有用到二阶动量。二阶动量的出现,才意味着“自适应学习率”优化算法时代的到来。SGD及其变种以同样的学习率更新每个参数,但深度神经网络往往包含大量的参数,这些参数并不是总会用得到(想想大规模的embedding)。对于经常更新的参数,我们已经积累了大量关于它的知识,不希望被单个样本影响太大,希望学习速率慢一些;对于偶尔更新的参数,我们了解的信息太少,希望能从每个偶然出现的样本身上多学一些,即学习速率大一些。

怎么样去度量历史更新频率呢?那就是二阶动量——该维度上,迄今为止所有梯度值的平方和:

Vt=∑τ=1tgτ2

我们再回顾一下步骤3中的下降梯度:

ηt=α⋅mt/Vt

可以看出,此时实质上的学习率由 $ \alpha$ 变成了 $ \alpha / \sqrt{V_t}$ 。 一般为了避免分母为0,会在分母上加一个小的平滑项。因此Vt 是恒大于0的,而且参数更新越频繁,二阶动量越大,学习率就越小。

这一方法在稀疏数据场景下表现非常好。但也存在一些问题:因为Vt 是单调递增的,会使得学习率单调递减至0,可能会使得训练过程提前结束,即便后续还有数据也无法学到必要的知识。

AdaDelta / RMSProp

由于AdaGrad单调递减的学习率变化过于激进,我们考虑一个改变二阶动量计算方法的策略:不累积全部历史梯度,而只关注过去一段时间窗口的下降梯度。这也就是AdaDelta名称中Delta的来历。

修改的思路很简单。前面我们讲到,指数移动平均值大约就是过去一段时间的平均值,因此我们用这一方法来计算二阶累积动量:

Vt=β2∗Vt−1+(1−β2)gt2

这就避免了二阶动量持续累积、导致训练过程提前结束的问题了。

Adam

谈到这里,Adam和Nadam的出现就很自然而然了——它们是前述方法的集大成者。我们看到,SGD-M在SGD基础上增加了一阶动量,AdaGrad和AdaDelta在SGD基础上增加了二阶动量。把一阶动量和二阶动量都用起来,就是Adam了——Adaptive + Momentum。

SGD的一阶动量:

mt=β1⋅mt−1+(1−β1)⋅gt

加上AdaDelta的二阶动量:

Vt=β2∗Vt−1+(1−β2)gt2

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

AdamW

AdamW与Adam的比较,可能AdamW依然是最好的优化器 (opens new window)

  1. AdamW 的实现方法与传统的 L2 正则化不同,它直接对权重进行衰减,而不是将其加到损失函数上。
  2. 实验结果显示,适当调整的 Adam 优化器可以达到或超过 SGD 加 momentum 的准确率,并且通常训练速度更快。
  3. 在使用 Adam 优化器时,需要适当调整正则化超参数,以确保模型的泛化能力。
    • 初始学习率(lr):通常从较大的学习率开始,例如0.001到0.01,然后根据需要进行调整。对于AdamW,可以使用学习率预热(gradual warm-up)策略,逐渐增加学习率,以避免初始训练阶段的不稳定。
    • 权重衰减(wd): 权重衰减通常设置得较小,例如1e-2到1e-5。在使用AdamW时,wd的值可能需要比在SGD中使用L2正则化时大得多。
    • 动量参数(beta1): beta1的常用值在0.9到0.99之间。有时候,可以在训练过程中根据学习率调整beta1,例如使用1cycle策略,在学习率增加时降低beta1,学习率减少时恢复高值。
    • 二次动量参数(beta2): beta2通常被设置得较高,如0.999,以便更好地平滑梯度的估计。对于非常长的训练,有时会选择更接近1的值。
    • epsilon(ε): 通常设置为一个非常小的值,如1e-8,以确保数值稳定性。
    • 学习率衰减(lr decay): 可以使用步进衰减、余弦衰减或余弦余弦衰减等策略,以逐渐降低学习率,有助于模型收敛。
    • 批量大小(batch size): 选择合适的批量大小对于训练稳定性和计算效率很重要。批量大小通常受到硬件(尤其是GPU内存)的限制。
    • 训练周期(epochs): 确保模型有足够的训练周期来收敛。对于使用AdamW的超级收敛(super-convergence),可能需要的周期比使用SGD时少得多。
    • 权重初始化: 使用合适的权重初始化方法,如He初始化或Xavier初始化,可以帮助模型更快地收敛。

Nadam

最后是Nadam。我们说Adam是集大成者,但它居然遗漏了Nesterov,这还能忍?必须给它加上,按照NAG的步骤1:

gt=∇f(wt−α⋅mt−1/Vt)

这就是Nesterov + Adam = Nadam了。

说到这里,大概可以理解为什么经常有人说 Adam / Nadam 目前最主流、最好用的优化算法了。新手上路,先拿来一试,收敛速度嗖嗖滴,效果也是杠杠滴。

那为什么Adam还老招人黑,被学术界一顿鄙夷?难道只是为了发paper灌水吗?

请继续阅读:

https://zhuanlan.zhihu.com/p/32262540 (opens new window)

https://zhuanlan.zhihu.com/p/32338983 (opens new window)


补充:指数移动平均值的偏差修正

前面我们讲到,一阶动量和二阶动量都是按照指数移动平均值进行计算的:

mt=β1⋅mt−1+(1−β1)⋅gt

Vt=β2⋅Vt−1+(1−β2)⋅gt2

实际使用过程中,参数的经验值是

β1=0.9,β2=0.999

初始化:

m0=0,V0=0

这个时候我们看到,在初期, mt,Vt 都会接近于0,这个估计是有问题的。因此我们常常根据下式进行误差修正:

m~t=mt/(1−β1t)

V~t=Vt/(1−β2t)

References

  • 一个框架看懂优化算法之异同 SGD/AdaGrad/Adam (opens new window)
上次更新: 2025/07/06, 13:25:25
weight_decay
优化算法

← weight_decay 优化算法→

最近更新
01
weight_decay
07-03
02
帮助信息查看
06-08
03
常用命令
06-08
更多文章>
Theme by Vdoing | Copyright © 2022-2025 Geeks_Z | MIT License
京公网安备 11010802040735号 | 京ICP备2022029989号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式