FEATURED · 精选文章

深度学习优化算法全解析:从SGD到AdamW的原理与实战指南

发布时间 / 2026/8/14 10:22:43
来源 / 创域科博编辑部
栏目 / 资讯中心
深度学习优化算法全解析:从SGD到AdamW的原理与实战指南 1. 项目概述为什么优化算法是深度学习的“发动机”面试官问“深度学习中经典的优化算法都有哪些”这绝对不是一个让你简单罗列名字的送分题。它背后考察的是你对整个模型训练过程底层逻辑的理解深度。你可以把深度学习模型想象成一辆超级跑车数据是燃料网络架构是车身设计而优化算法就是这辆车的发动机和传动系统。发动机的性能直接决定了这辆车能否从起点随机初始化高效、稳定地跑到终点最优解以及路上会不会熄火陷入局部最优、会不会翻车梯度爆炸。这个问题之所以经典是因为无论你研究的是计算机视觉、自然语言处理还是推荐系统只要你用梯度下降法训练模型就绕不开对优化器的选择与调参。一个合适的优化器能让你的模型训练速度提升数倍收敛更稳定甚至帮你跳出那些糟糕的局部最优点找到更好的解。我记得刚入行时只会无脑用Adam结果在一些任务上效果时好时坏踩了不少坑后才明白没有“银弹”算法只有最适合当前任务和数据特性的工具。所以今天我们不只罗列名字更要拆解每个经典算法背后的设计哲学、数学原理、适用场景以及——最重要的——我这些年实战中总结出来的选择经验和避坑指南。无论你是正在准备面试的求职者还是希望提升模型效果的从业者这篇文章都能帮你建立起关于优化算法的立体认知。2. 优化算法的核心思想与演进脉络在深入每个算法之前我们必须统一思想所有基于梯度的优化算法其核心目标都是利用损失函数关于模型参数的梯度信息来迭代地更新参数从而最小化损失函数。这个看似简单的过程却衍生出了无数精巧的变体。2.1 从最基础的梯度下降说起最原始的版本是批量梯度下降Batch Gradient Descent, BGD。它的更新公式简单粗暴θ θ - η * ∇J(θ)其中θ是参数η是学习率∇J(θ)是整个训练集上的平均梯度。BGD每次更新都要遍历全部数据计算精确的梯度方向。它的优点是更新方向稳定朝向着损失函数下降最快的方向。但缺点也极其明显计算开销巨大无法处理海量数据集无法在线学习即无法在数据流进来时实时更新而且对于非凸函数它很容易陷入局部最优。为了解决效率问题随机梯度下降Stochastic Gradient Descent, SGD被提出。SGD每次只随机抽取一个样本计算梯度并更新参数θ θ - η * ∇J(θ; x_i, y_i)这里的梯度基于单个样本(x_i, y_i)噪声极大。这就像蒙着眼睛下山每一步都基于脚下那一小片区域的感觉方向摇摆不定。但正是这种“噪声”让SGD有机会跳出浅层的局部最优并且更新频率极高训练速度飞快。然而它的波动性导致收敛路径蜿蜒曲折最终会在最优点附近震荡难以稳定收敛。于是折中的方案——小批量梯度下降Mini-batch Gradient Descent, MB-SGD成为了现代深度学习的默认选择。它每次随机抽取一小批比如32、64、128个样本计算平均梯度θ θ - η * (1/m) * Σ ∇J(θ; x_i, y_i)其中m是小批量的大小。MB-SGD兼顾了BGD的梯度估计稳定性和SGD的高效性并且能利用GPU的并行计算能力是实践中的绝对主力。我们平时说的“SGD”通常指的就是MB-SGD。注意学习率η在这里是一个超参数它的选择至关重要。太大容易震荡甚至发散太小则收敛缓慢。为SGD系列算法设置一个合适的学习率往往需要大量的经验或网格搜索。2.2 优化算法要解决的核心挑战原始的SGD包括MB-SGD虽然有效但存在几个公认的痛点后续的经典算法大多是围绕解决这些痛点而设计的学习率选择困难一个固定的学习率难以适应训练全过程。初期参数离最优解远希望步长大一些后期接近最优解希望步长小一些以精细调整。收敛速度慢特别是在损失函数曲面存在“峡谷”地形一个方向陡峭另一个方向平坦时SGD会沿着陡峭方向震荡前进进展缓慢。陷入局部最优和鞍点在高维非凸优化中局部最优其实相对少见更常见的是鞍点某个方向是极小点另一个方向是极大点。在鞍点处梯度为零或接近零SGD会停滞不前。梯度噪声与波动基于小批量的梯度估计本身带有噪声导致更新方向不稳定影响收敛精度。理解了这些挑战我们再看后续的优化器就会明白它们每一项改进的用意所在。3. 动量法与自适应学习率算法详解为了解决SGD的震荡和鞍点停滞问题研究者们从物理学中获得了灵感并开始让优化器具备“记忆”和“自适应”能力。3.1 动量法给优化过程加上“惯性”想象一下滑雪下山你不会因为脚下遇到一个小坑就立刻改变方向而是会依靠之前的动量冲过去。动量法Momentum正是模拟了这一现象。它的核心是引入一个速度变量v用来累积历史的梯度方向。更新公式变为v_t γ * v_{t-1} η * ∇J(θ) θ_t θ_{t-1} - v_t其中γ是动量系数通常设为0.9。v_t是当前时刻的速度它由上一时刻速度的衰减值γ * v_{t-1}和当前梯度共同决定。它的妙处在哪里加速收敛在梯度方向持续一致的维度上速度会不断累积更新幅度越来越大从而快速通过平坦区域。抑制震荡在梯度方向频繁改变的维度上如峡谷的陡峭壁历史动量会抵消一部分相反的梯度使得更新路径更加平滑减少不必要的震荡。帮助逃离鞍点即使在梯度为零的鞍点由于历史动量的存在优化过程仍然可以依靠“惯性”继续前进有机会逃离这个平台区。我个人的经验是在训练深度网络尤其是CV领域的网络时加上动量的SGD通常比纯SGD收敛更快、更稳定。它几乎是一个无脑的增强选项。3.2 Nesterov加速梯度一个有远见的动量Nesterov Accelerated Gradient (NAG) 是对经典动量法的一个精妙改进。经典动量是“先累积梯度再沿累积方向更新”。而NAG是“先沿着累积速度的方向展望一步在那个‘展望点’计算梯度再用这个梯度来修正速度”。公式略有不同v_t γ * v_{t-1} η * ∇J(θ - γ * v_{t-1}) θ_t θ_{t-1} - v_t注意梯度计算的位置是(θ - γ * v_{t-1})这相当于参数先按历史动量走一小步然后在这个“未来”的位置评估梯度。这个梯度更准确地预测了参数下一刻的位置因此对速度的修正更加前瞻和精准。类比一下就像打网球经典动量是朝着球当前的位置跑而NAG是预判球未来的落点朝着那个方向跑。在训练RNN等序列模型时NAG往往能表现出比经典动量更优的性能。3.3 AdaGrad为每个参数定制学习率之前的方法对所有参数都使用同一个全局学习率。AdaGradAdaptive Gradient 的想法很直观对于频繁更新的参数梯度大我们已经学到了很多应该给个小学习率慢点走对于不频繁更新的参数梯度小我们知之甚少应该给个大学习率快点学。它通过累积参数历史梯度的平方和来实现这一点G_t G_{t-1} (∇J(θ))^2 θ_t θ_{t-1} - (η / √(G_t ε)) * ∇J(θ)这里G_t是到当前时刻为止所有历史梯度逐元素平方的累积和。ε是一个极小值如1e-8防止除零。学习率变成了η / √(G_t)对于梯度大的参数G_t大分母大有效学习率就变小了。优点与致命缺点优点特别适合处理稀疏数据如自然语言处理中的词向量。对于稀疏特征梯度不常出现一旦出现G_t小学习率会被放大从而快速更新。缺点由于G_t是单调递增的分母会越来越大导致有效学习率在训练后期急剧衰减最终趋近于零使得训练过早停止。这在训练深度神经网络时是个严重问题。3.4 RMSProp解决AdaGrad的学习率衰减问题RMSPropRoot Mean Square Propagation 是对AdaGrad的改进旨在解决其学习率过早衰减的问题。它的核心思想是我们不应该同等看待所有历史梯度越久远的梯度应该越不重要。它引入了一个衰减系数ρ通常0.9对历史平方梯度进行指数移动平均EMAE[g^2]_t ρ * E[g^2]_{t-1} (1 - ρ) * (∇J(θ))^2 θ_t θ_{t-1} - (η / √(E[g^2]_t ε)) * ∇J(θ)E[g^2]_t是平方梯度的指数衰减平均。这样久远梯度的影响会指数级下降避免了分母无限增长有效学习率可以在整个训练过程中维持在一个更有意义的范围。RMSProp在非凸、循环神经网络等场景下表现非常出色是许多任务上的一个可靠选择。3.5 Adam动量与自适应学习率的集大成者AdamAdaptive Moment Estimation 可以说是当今最流行、最常用的优化器它结合了动量法一阶矩估计和RMSProp二阶矩估计的思想。它维护两个状态变量一阶矩估计 m_t梯度的指数移动平均相当于带偏差修正的动量。二阶矩估计 v_t梯度平方的指数移动平均用于自适应调整每个参数的学习率。具体算法步骤如下计算当前梯度g_t ∇J(θ_{t-1})更新一阶矩估计m_t β1 * m_{t-1} (1 - β1) * g_t更新二阶矩估计v_t β2 * v_{t-1} (1 - β2) * g_t^2偏差修正非常重要由于m_t和v_t初始为0在训练初期会偏向0。Adam进行了修正m̂_t m_t / (1 - β1^t)v̂_t v_t / (1 - β2^t)参数更新θ_t θ_{t-1} - η * m̂_t / (√(v̂_t) ε)Adam为什么这么强大兼具动量的加速效应通过m_t实现能快速通过平坦区域和鞍点。兼具自适应学习率通过v_t实现为每个参数分配不同的学习步长特别适合处理稀疏梯度和非平稳目标。内置偏差修正解决了训练初期估计偏差的问题使得更新更加稳健。超参数鲁棒性好默认参数β10.9, β20.999, ε1e-8在绝大多数任务上都能取得不错的效果降低了调参难度。正因为这些优点Adam成为了许多研究者和工程师的“默认优化器”。它收敛快调参简单在图像分类、机器翻译等众多任务上表现优异。4. 超越Adam新一代优化器的思考与实践尽管Adam非常成功但学术界和工业界并没有停止探索。人们发现Adam在某些情况下尤其是泛化性能上可能不如带动量的SGD。这就引出了对优化器的新一轮思考。4.1 Adam的潜在问题与改进版AdamW研究者发现在使用Adam时如果结合权重衰减L2正则化来防止过拟合标准的实现方式可能会出现问题。传统的SGD中权重衰减是直接加到梯度上的θ θ - η * (∇J(θ) λθ)这等价于在每次更新后对参数进行缩放θ (1 - ηλ)θ - η * ∇J(θ)。但在Adam中由于自适应学习率的存在这种等价关系被破坏了。Adam对梯度进行了缩放除以√(v_t)导致权重衰减项也被缩放了其效果变得不稳定并且与学习率η耦合。AdamWAdam with Weight Decay解决了这个问题。它的思想是将权重衰减与梯度更新解耦。在AdamW中权重衰减被独立地应用于参数更新步骤而不是加在梯度里θ_t θ_{t-1} - η * ( m̂_t / (√(v̂_t) ε) λ * θ_{t-1} )注意这里的λθ_{t-1}是独立项。大量实验表明AdamW通常能带来比Adam更好的泛化性能尤其是在训练Transformer、BERT等大型模型时AdamW几乎是标配。现在PyTorch等框架中的AdamW实现已经是标准做法。4.2 带动量的SGD为何依然强大——关于泛化能力的讨论一个有趣的现象是在许多计算机视觉的顶尖论文和比赛中如ImageNet研究者们最终常常会回归到使用带动量的SGD而不是Adam。为什么一个更“古老”的算法能战胜更“先进”的自适应算法核心原因可能在于泛化能力Generalization。泛化能力指的是模型在未见过的测试数据上的表现。有研究表明自适应优化器如Adam可能收敛到不同的极小点Adam因为其逐参数自适应学习率的特性可能会收敛到损失曲面中“更尖锐”的极小点。而尖锐的极小点对参数扰动更敏感泛化能力往往较差。带动量的SGD倾向于收敛到“更平坦”的极小点SGD的噪声和动量使其具有更强的探索能力更有可能找到宽阔、平坦的极小点区域。平坦的极小点意味着参数的小幅变动不会引起损失的大幅增加因此模型更加鲁棒泛化能力更强。实战选择建议如果你的主要目标是快速收敛、验证想法或者任务梯度非常稀疏如NLPAdam/AdamW是你的首选。如果你在追求极致的最终精度和泛化性能如图像分类SOTA并且有足够的计算资源进行精细调参特别是学习率调度那么带动量的SGD很可能带来惊喜。对于生成对抗网络GAN这种需要精细平衡两个网络的任务RMSProp或SGD有时比Adam更稳定因为Adam的自适应特性可能放大训练的不稳定性。4.3 学习率调度优化器的“最佳拍档”再好的优化器也离不开合理的学习率调度策略。固定学习率很难胜任整个训练过程。常见的调度策略有阶梯下降每训练一定轮数epoch将学习率乘以一个衰减系数如0.1。余弦退火学习率随着训练过程按照余弦函数从初始值衰减到0。这通常能取得非常好的效果。热启动训练过程中周期性地将学习率重置到一个较高值然后再次衰减。这有助于模型跳出当前的局部最优寻找更好的解。One-Cycle策略学习率先线性增大到一个很大的值再线性减小到一个很小的值。配合动量的反向变化被证明能极快地训练模型。在实践中最实用的方法是使用一个验证集来监控性能。当验证集损失在连续几个epoch不再下降时手动或自动地降低学习率。这是一个简单却非常有效的策略。5. 优化器选择与调参实战指南理论说了这么多到底该怎么选、怎么用下面是我结合多年实战总结出的“操作手册”。5.1 不同场景下的优化器选型速查表任务类型推荐优化器关键理由注意事项自然语言处理 (BERT, GPT, Transformer)AdamW几乎是标准答案。能很好地处理稀疏的嵌入层梯度配合权重衰减解耦泛化性好。学习率通常设置较小如3e-5, 5e-5并使用线性预热Warmup。计算机视觉 (CNN图像分类)带动量的SGD或AdamW追求SOTA精度选SGD追求快速开发和稳定收敛选AdamW。SGD需要精心调整学习率如0.1和动量0.9并配合余弦退火等调度。生成对抗网络 (GAN)Adam或RMSProp需要稳定训练动态。Adam的β1可调低如0.5以减少动量影响。生成器和判别器可使用不同的优化器或学习率。学习率通常很低如2e-4。强化学习Adam默认选择能适应非平稳的目标和稀疏奖励信号。学习率敏感需要根据具体算法如PPO, DQN调整。小批量/在线学习Adam/AdaGrad自适应学习率能自动调整每个参数的更新幅度适合数据流。AdaGrad可能更适合极度稀疏的场景。新手入门/基线模型Adam超参数鲁棒性强收敛快几乎不需要调参就能获得不错结果。使用默认参数lr1e-3, betas(0.9,0.999)是一个安全的起点。5.2 超参数设置心得与避坑指南学习率Learning Rate, η这是最重要的超参数。Adam系列可以从3e-4或1e-3开始尝试。这是一个经验性的“神奇数字”在很多任务上都有效。对于大模型或预训练通常更小5e-5。SGD with Momentum范围更广可以从0.1开始配合学习率衰减。如果网络很深如ResNet-50初始学习率可以设为0.01或0.001再逐步增大测试。一个快速测试方法从一个很小的学习率如1e-6开始逐步增大每次乘10观察训练初期几个batch的损失下降情况。选择一个损失能稳定、快速下降的最大学习率。动量Momentum, β1/γSGD的动量系数通常设为0.9。Adam的β1默认0.9一般不需改动。在GAN等不稳定训练中可尝试降低至0.5。二阶矩衰减率β2Adam中的关键参数控制梯度平方的移动平均窗口。默认值0.999在绝大多数情况下是最优的。不要轻易改动它增大它如0.9999会使自适应更平滑但反应迟钝减小它会使自适应更敏感但噪声更大。权重衰减Weight Decay, λ用于AdamW时是一个非常重要的正则化超参数。常用值在0.01到0.1之间需要仔细调整。用于SGD时通常与学习率耦合常用1e-4或5e-4。εEpsilon防止除零的小常数。Adam默认1e-8。除非你有非常充分的理由否则永远不要修改它。将其调大如1e-4会严重破坏自适应学习率的稳定性。5.3 训练过程中的监控与调试优化器选好了参数设好了训练就万事大吉了吗远非如此。你必须像飞行员看仪表盘一样监控训练过程。损失曲线Loss Curve这是最重要的指标。训练损失应平稳下降验证损失在后期可能平稳或缓慢上升过拟合。如果训练损失震荡剧烈可能是学习率太大。如果训练损失几乎不降可能是学习率太小或模型架构/数据有问题。梯度统计定期检查梯度的范数norm和分布。如果梯度范数爆炸式增长可能出现梯度爆炸需要减小学习率、使用梯度裁剪Gradient Clipping或检查网络初始化。如果梯度范数趋近于零可能是梯度消失或陷入了鞍点/局部最优。参数更新比率一个高级技巧是监控参数更新量与其自身值的比率update/parameter。理想情况下这个比率应该在1e-3左右。如果远大于此更新可能不稳定如果远小于此学习可能太慢。6. 面试中如何回答“优化算法”问题回到我们最初的场景——面试。当面试官提出这个问题时他期待的绝不是一个干巴巴的列表。一个糟糕的回答“有SGD、Momentum、AdaGrad、RMSProp、Adam。”面试官内心下一个。一个出色的回答应该展现你的结构化思维和深度理解确立框架“优化算法的演进主要是为了解决SGD在训练深度模型时遇到的几个核心挑战学习率难以设定、收敛速度慢、容易陷入鞍点、以及梯度估计噪声大。”分类阐述“针对这些问题发展出了两大改进方向。一是引入动量Momentum, NAG来加速收敛并抑制震荡二是为每个参数自适应地调整学习率AdaGrad, RMSProp, Adam。”聚焦核心“其中Adam结合了这两者的思想成为了目前最流行的默认选择。但它结合权重衰减时有问题因此有了改进版AdamW。值得注意的是在追求极致泛化性能的CV任务中带动量的SGD经过精细调参后往往能击败Adam。”体现实践“在实际项目中我的选择策略是快速原型用Adam追求精度用SGD并精心调度学习率。对于Transformer类模型固定使用AdamW。调参时我会先用一个小的学习率扫描找到大致范围并始终监控训练损失和验证集的曲线来判断学习率是否合适。”展示思考如果时间允许“此外我也在关注一些更新的进展比如Lookahead、RAdam等它们主要致力于解决Adam在训练初期可能因方差较大而导致的不稳定问题在一些任务上能带来更平滑的收敛。”这样的回答不仅展示了你的知识广度更体现了你的理解深度、实践经验和持续学习的态度足以让你在众多候选人中脱颖而出。优化算法的世界仍在不断发展从二阶优化方法如牛顿法、共轭梯度因计算量太大在DL中不常用到自适应方法的持续改进如AdaBound, AMSGrad再到与分布式训练、大模型训练结合的优化策略。但万变不离其宗理解本文中这些经典算法的核心思想你就掌握了打开深度学习优化之门的钥匙。剩下的就是在不断的项目实战中去感受、去调试、去积累那份属于你的“优化直觉”。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻