当前位置: 首页 > news >正文

2025算法八股——深度学习——优化器小结

要理解深度学习中的优化器,核心是从 “如何高效更新模型参数以最小化损失” 这一问题出发,按 “基础→改进→融合” 的逻辑梳理。以下从最简单的优化器开始,逐步深入复杂方案,每个优化器均包含核心思想、公式、优缺点、适用场景,帮助清晰理解演进脉络。

一、基础优化器:解决 “如何起步更新参数”

1. 随机梯度下降(SGD):所有优化器的 “基石”

SGD 是最基础的优化器(GD(BGD,全量数据)→ Mini-Batch GD(小批量数据)→ SGD(单个数据)),直接从 “梯度下降” 的数学本质出发,是理解后续所有优化器的前提。

核心思想

模型参数的更新方向与损失函数对该参数的梯度(导数)方向相反(梯度指向损失增大的方向,所以更新时取负),更新步长由 “学习率” 控制。
“随机” 体现在:每次更新仅用一个样本(或一小批样本,即 Mini-batch SGD) 计算梯度,而非全量数据(全量数据计算的是 “批量梯度下降 BGD”,因效率低几乎不用)。

参数更新公式

设参数为 θ,损失函数为 L,学习率为 η,梯度为 g_t = ∇θL (θ_{t-1})(第 t 步的梯度,基于第 t-1 步的参数计算),则:
θ_t = θ_{t-1} - η·g_t

优缺点
优点缺点
1. 原理简单,易实现;
2. 内存占用小(仅需存当前梯度);
3. 适合大数据集(Mini-batch 模式)
1. 学习率固定:需手动调参,过大易震荡不收敛,过小收敛极慢;
2. 对所有参数 “一视同仁”:不同参数的梯度差异大(如稀疏特征参数梯度小,稠密特征梯度大),固定步长无法适配;
3. 易陷入局部最优 / 鞍点:梯度为 0 时直接停止,无法跳出。
适用场景
  • 小规模模型或数据集(手动调参成本低);
  • 作为 “基准” 对比其他优化器的效果;
  • 对内存极其敏感的场景。

2. 动量 SGD(SGD with Momentum):解决 “SGD 收敛慢、易震荡”

SGD 的问题是 “步长独立”—— 每一步只看当前梯度,导致收敛路径曲折(震荡)且慢。动量 SGD 借鉴 “物理动量” 思想,让更新步长 “继承历史趋势”,平滑路径并加速收敛。

核心思想

引入 “动量项” v_t,它是历史梯度的指数加权平均(类似 “惯性”):历史梯度方向一致时,动量项会累积,让步长变大(加速收敛);方向波动时,动量项会抵消部分波动(减少震荡)。

参数更新公式

设动量系数 γ(通常取 0.9,控制历史梯度的权重),则:

  1. 计算动量项(继承历史 + 当前梯度):v_t = γ・v_{t-1} + η・g_t
  2. 更新参数(沿动量方向):θ_t = θ_{t-1} - v_t
关键理解
  • 动量项 v_t 相当于 “平滑后的梯度”:若连续多步梯度方向相同(如沿损失函数斜坡下降),v_t 会越来越大,步长加速;若梯度突然反向(震荡),v_t 因 “惯性” 不会骤变,震荡被缓解。
优缺点
优点缺点
1. 减少收敛路径的震荡;
2. 加速收敛(尤其在损失函数平缓区域)
1. 仍需手动调学习率;
2. 对不同参数的梯度差异无适配(依然 “一视同仁”)。
适用场景
  • 替代基础 SGD 的绝大多数场景,尤其适合损失函数表面 “崎岖”(梯度波动大)的模型(如 CNN)。

二、自适应学习率优化器:解决 “SGD 学习率固定、参数适配差”

基础 SGD 和动量 SGD 的核心痛点是 “学习率全局固定”,无法适配不同参数的梯度特性(如稀疏特征参数梯度小,需要更大学习率;稠密特征参数梯度大,需要更小学习率)。
自适应优化器的核心是:为每个参数单独调整学习率,让梯度小的参数步长大、梯度大的参数步长小。

1. AdaGrad(自适应梯度优化器):首次实现 “参数级学习率”

AdaGrad 是第一个提出 “为每个参数定制学习率” 的优化器,核心是 “用参数的历史梯度平方和来调整步长”。

核心思想

对每个参数 θ_i,维护一个 “梯度平方累积项” G_{t,i}(记录该参数从训练开始到第 t 步的所有梯度平方和):

  • 若参数 θ_i 的历史梯度一直很小(如稀疏特征),G_{t,i} 小,学习率会自动变大(补偿小梯度,加速更新);
  • 若参数 θ_i 的历史梯度一直很大(如稠密特征),G_{t,i} 大,学习率会自动变小(抑制大梯度,避免震荡)。
参数更新公式

设平滑项 ε(通常取 10^-8,避免分母为 0),则对每个参数 θ_i:

  1. 累积梯度平方:G_{t,i} = G_{t-1,i} + g_{t,i}²(g_{t,i} 是第 t 步参数 θ_i 的梯度)
  2. 自适应学习率:η_{t,i} = η / (√G_{t,i} + ε)(全局学习率 η 除以累积梯度平方的平方根)
  3. 更新参数:θ_{t,i} = θ_{t-1,i} - η_{t,i}・g_{t,i}
优缺点
优点缺点
1. 无需手动精细调学习率;
2. 自动适配不同参数的梯度特性(对稀疏数据友好)
1. 学习率单调递减:G_{t,i} 一直累积变大,导致 η_{t,i} 越来越小,训练后期可能 “停滞”(步长趋近于 0,参数不更新);
2. 对异常值敏感:若某一步梯度骤增,G_{t,i} 会骤大,后续学习率长期偏小。
适用场景
  • 数据稀疏、且训练周期短的场景(如文本分类中的稀疏特征模型);
  • 不适合长期训练的大模型(如 Transformer),因后期学习率会停滞。

2. RMSProp(均方根传播):解决 “AdaGrad 学习率单调递减”

AdaGrad 的问题是 “累积所有历史梯度”,导致学习率一直变小。RMSProp 改进为 “只累积近期的历史梯度”,用 “指数加权移动平均(EWMA)” 替代 “全局累积”,让学习率能根据近期梯度调整,避免后期停滞。

核心思想

将 AdaGrad 的 “全局梯度平方累积” 改为 “近期梯度平方的指数加权平均”(类似动量项的平滑逻辑),记为 E [g²]_t:

  • 近期梯度大,则 E [g²]_t 大,学习率变小;
  • 近期梯度小,则 E [g²]_t 小,学习率变大;
  • 远期梯度的权重随时间指数衰减(默认衰减系数 0.9,即远期梯度权重仅 0.1),不影响当前学习率。
参数更新公式

设衰减系数 γ(通常取 0.9),平滑项 ε=10^-8,则对每个参数:

  1. 近期梯度平方的 EWMA:E [g²]t = γ·E[g²]{t-1} + (1-γ)·g_t²
  2. 自适应学习率:η_t = η / (√E [g²]_t + ε)
  3. 更新参数:θ_t = θ_{t-1} - η_t・g_t
关键对比(与 AdaGrad)
特性AdaGradRMSProp
梯度平方累积范围从训练开始到当前(全局)近期梯度(指数衰减远期)
学习率变化趋势单调递减随近期梯度波动(非单调)
训练后期表现易停滞能持续更新
优缺点
优点缺点
1. 解决了 AdaGrad 的学习率停滞问题;
2. 自适应参数级学习率,对稀疏数据友好;
3. 训练稳定性高(平滑近期梯度)
1. 仍需手动调全局学习率 η;
2. 仅考虑梯度的 “大小”,未考虑梯度的 “方向趋势”(缺乏动量项的加速效果)。
适用场景
  • 替代 AdaGrad 的所有场景,尤其适合需要长期训练的模型(如 CNN、RNN);
  • 常作为 Adam 的 “简化对比版”,理解自适应学习率的核心逻辑。

3. AdaDelta:进一步摆脱 “对全局学习率的依赖”

RMSProp 解决了学习率停滞,但仍需手动设置全局学习率 η。AdaDelta 的核心改进是:用 “参数更新量的历史平方平均” 替代全局学习率,彻底摆脱对 η 的依赖。

核心思想

引入 “参数更新量的平方累积项” E [Δθ²]_t(记录近期参数更新步长的平方),用它替代 RMSProp 中的全局学习率 η,让学习率完全由数据的梯度特性决定,无需手动调参。

参数更新公式

设衰减系数 γ=0.95,平滑项 ε=10^-8,则:

  1. 近期梯度平方的 EWMA(同 RMSProp):E [g²]t = γ·E[g²]{t-1} + (1-γ)·g_t²
  2. 近期参数更新量的 EWMA:E [Δθ²]t = γ·E[Δθ²]{t-1} + (1-γ)·Δθ_{t-1}²
  3. 自适应学习率(无全局 η):η_t = √(E [Δθ²]_{t-1} + ε) / √(E [g²]_t + ε)
  4. 更新参数:Δθ_t = -η_t・g_t,θ_t = θ_{t-1} + Δθ_t
优缺点
优点缺点
1. 完全无需手动调全局学习率;
2. 解决 AdaGrad 停滞问题,适合长期训练
1. 公式稍复杂,理解成本高于 RMSProp;
2. 实际效果与 RMSProp 接近,且不如后续的 Adam 全面(缺乏动量项)。
适用场景
  • 对 “手动调学习率” 极度敏感或厌烦调参的场景;
  • 实际应用中,因 Adam 的优势更明显,AdaDelta 使用频率较低。

三、融合优化器:兼顾 “自适应学习率” 与 “动量加速”

前面的优化器要么只有 “自适应学习率”(AdaGrad、RMSProp、AdaDelta),要么只有 “动量加速”(动量 SGD)。而Adam(自适应动量估计) 是两者的融合 —— 同时具备 “参数级自适应学习率” 和 “梯度方向的动量平滑”,是目前深度学习中最常用的优化器。

1. Nesterov 动量(SGD Nesterov):动量 SGD 的 “前瞻版”

在讲 Adam 前,先补充 Nesterov 动量 —— 它是动量 SGD 的改进,核心是 “先按历史动量走一步,再计算梯度”,相当于 “前瞻梯度方向”,让更新更精准。

核心思想(与普通动量对比)
  • 普通动量:先算当前参数的梯度,再按动量更新(“看当前,再走”);
  • Nesterov 动量:先按历史动量 “往前走一步”(得到 “前瞻参数”),再在 “前瞻参数” 上算梯度,最后更新(“先预判走,再看方向,修正步长”)。
    这种 “前瞻” 能减少 “过冲”(比如普通动量可能冲过最优解,Nesterov 能提前修正)。
参数更新公式
  1. 先按历史动量前瞻一步:θ_{t-1}^(lookahead) = θ_{t-1} - γ・v_{t-1}
  2. 在前瞻参数上算梯度:g_t = ∇θL (θ_{t-1}^(lookahead))
  3. 更新动量项:v_t = γ・v_{t-1} + η・g_t
  4. 更新参数:θ_t = θ_{t-1} - v_t
适用场景
  • 对收敛精度要求高的场景,比普通动量更精准,但计算成本略高(多一步前瞻参数的梯度计算)。

2. Adam(自适应动量估计):“RMSProp + Nesterov 动量” 的融合

Adam 是目前最主流的优化器,核心是 “将 RMSProp 的自适应学习率(关注梯度大小)与 Nesterov 动量的平滑加速(关注梯度方向)结合”,同时还解决了 “动量项和梯度平方项的初始偏置问题”。

核心思想
  1. 一阶矩估计(动量项):用 EWMA 维护梯度的 “方向趋势”(类似 Nesterov 动量),记为 m_t;
  2. 二阶矩估计(自适应学习率项):用 EWMA 维护梯度的 “大小波动”(类似 RMSProp),记为 v_t;
  3. 偏差修正:因初始时 m_t 和 v_t 接近 0,会导致前期学习率偏小,Adam 通过 “偏差修正” 让前期更新更稳定。
参数更新公式

设一阶矩衰减系数 β₁=0.9(控制动量项的平滑),二阶矩衰减系数 β₂=0.999(控制自适应学习率的平滑),平滑项 ε=10^-8:

  1. 一阶矩(动量项):m_t = β₁・m_{t-1} + (1-β₁)・g_t
  2. 二阶矩(自适应项):v_t = β₂・v_{t-1} + (1-β₂)・g_t²
  3. 偏差修正(解决初始偏置):
    m_t^hat = m_t / (1 - β₁^t)(t 为训练步数,步数越多,修正幅度越小)
    v_t^hat = v_t / (1 - β₂^t)
  4. 更新参数:θ_t = θ_{t-1} - (η / (√v_t^hat + ε))・m_t^hat
优缺点
优点缺点
1. 兼顾 “动量加速” 和 “自适应学习率”,收敛快且稳定;
2. 偏差修正让前期训练更可靠;
3. 无需手动精细调参(默认 β₁=0.9, β₂=0.999, ε=1e-8 即可用);
4. 适用于绝大多数模型(CNN、RNN、Transformer)和数据集
1. 内存占用比 SGD 高(需存 m_t 和 v_t 两个参数级变量);
2. 极端场景(如生成模型 GAN)可能不如 SGD + 动量稳定(因自适应学习率可能导致后期波动)。
适用场景
  • 深度学习的 “默认优化器”:除非有特殊需求(如 GAN、超大规模模型),否则优先用 Adam;
  • 尤其适合大模型(如 BERT、GPT)和复杂数据集(如 ImageNet),能平衡收敛速度和稳定性。

四、优化器演进脉络与选择建议

1. 演进逻辑:从 “单一功能” 到 “多功能融合”

SGD(基础更新,固定学习率)→ 动量 SGD(+ 动量加速,减少震荡)→ Nesterov 动量(+ 前瞻梯度,更精准)
SGD → AdaGrad(+ 参数级自适应学习率,适配稀疏数据)→ RMSProp(+ 近期梯度平滑,解决学习率停滞)→ AdaDelta(+ 更新量替代学习率,无需调 η)
Nesterov 动量 + AdaDelta/RMSProp → Adam(融合动量 + 自适应,默认首选)

2. 实际选择建议

场景推荐优化器理由
快速验证模型、小数据Adam无需调参,收敛快
大模型(CNN/Transformer)Adam / AdamW(Adam 改进版)平衡速度与稳定性,AdamW 解决 Adam 对权重衰减的偏差问题
稀疏数据(文本分类)RMSProp / Adam自适应学习率对稀疏参数友好
GAN、强化学习(RL)SGD + 动量收敛更稳定,避免 Adam 的后期波动导致生成器 / 策略网络崩溃
内存受限场景SGD + 动量仅需存梯度,内存占用远低于 Adam(无需存 m_t 和 v_t)

通过以上梳理可见,优化器的演进始终围绕 “更高效、更省心”:从手动调学习率到自适应,从单一梯度更新到融合动量平滑,最终 Adam 成为兼顾各方需求的 “最优解”,也是绝大多数场景的首选


文章转载自:

http://H8nsj3rn.rtkgc.cn
http://JMkddsEJ.rtkgc.cn
http://iRxPf86x.rtkgc.cn
http://UGp3TsmZ.rtkgc.cn
http://dgfY1kSL.rtkgc.cn
http://WG5JuoYz.rtkgc.cn
http://pe6EHcJu.rtkgc.cn
http://4G9qeNwy.rtkgc.cn
http://wauLseX3.rtkgc.cn
http://pFGQkTyc.rtkgc.cn
http://o9vichga.rtkgc.cn
http://zRyJKiEc.rtkgc.cn
http://p0mBGS9I.rtkgc.cn
http://Trlb1WWG.rtkgc.cn
http://4coB2wIh.rtkgc.cn
http://rQRzUtZT.rtkgc.cn
http://yujH0jTg.rtkgc.cn
http://azbxnCcL.rtkgc.cn
http://l6pRBvQI.rtkgc.cn
http://axXfYR9v.rtkgc.cn
http://2rk0NySp.rtkgc.cn
http://y5627qDU.rtkgc.cn
http://5DX3nqXm.rtkgc.cn
http://xOrGA7RL.rtkgc.cn
http://O16syrMH.rtkgc.cn
http://43zcD997.rtkgc.cn
http://uH0jLRRF.rtkgc.cn
http://VFZ5yfuP.rtkgc.cn
http://hgemJVnm.rtkgc.cn
http://ulCrp2BP.rtkgc.cn
http://www.dtcms.com/a/372429.html

相关文章:

  • Hash桶的讲解
  • [SWERC 2020] Safe Distance题解
  • 【.Net技术栈梳理】01-核心框架与运行时(CLR)
  • 《十字军东征》游戏出现0xc0000022报错的解决办法
  • 个人博客系统_测试报告
  • 第四项修炼:多元权衡——告别“单点最优”,在矛盾中编织和谐
  • Claude 4深度解析:AI编程新王者,双模型重塑行业标杆
  • 个人pytorch安装配置:cuda12.6 python3.13
  • 全栈经验之谈系列:(阶段一)架构思维与全局观
  • 【CMake】变量作用域3——目录作用域
  • 【系统分析师】第10章-关键技术:系统规划与分析(核心总结)
  • PINN驱动的高阶偏微分方程求解MATLAB代码
  • synchronized同步机制
  • 前端实现埋点的方式
  • 免费的GB28181平台,EasyNVR和EasyGBS应该怎么选?
  • ubuntu 24.10 忘记密码进入恢复模式重置密码
  • 缓存无处不在
  • 工具读取分析bmp文件
  • 多线程之HardCodedTarget(type=OssFileClient, name=file, url=http://file)异常
  • HTTP协议​​和​​API设计规范​​
  • 三种傍路设备配置实验
  • 踏脚迈入奇幻乐园
  • torch.dot()向量点乘,向量点乘计算方法, torch.dot如何计算的
  • Java 模块系统深度解析:从 Jigsaw 到现代模块化开发
  • 九联UNT403G/UN413G-内存大小区分参考指南
  • 基于HanLP的地址信息识别:识别出人名、地址和电话号码
  • 【java执行python】
  • 【数据结构】强化训练:从基础到入门到进阶(1)
  • 三.动态规划算法
  • Maya绑定:驱动关键帧动画案例,小球穿过自动门