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,控制历史梯度的权重),则:
- 计算动量项(继承历史 + 当前梯度):v_t = γ・v_{t-1} + η・g_t
- 更新参数(沿动量方向):θ_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:
- 累积梯度平方:G_{t,i} = G_{t-1,i} + g_{t,i}²(g_{t,i} 是第 t 步参数 θ_i 的梯度)
- 自适应学习率:η_{t,i} = η / (√G_{t,i} + ε)(全局学习率 η 除以累积梯度平方的平方根)
- 更新参数:θ_{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,则对每个参数:
- 近期梯度平方的 EWMA:E [g²]t = γ·E[g²]{t-1} + (1-γ)·g_t²
- 自适应学习率:η_t = η / (√E [g²]_t + ε)
- 更新参数:θ_t = θ_{t-1} - η_t・g_t
关键对比(与 AdaGrad)
特性 | AdaGrad | RMSProp |
---|---|---|
梯度平方累积范围 | 从训练开始到当前(全局) | 近期梯度(指数衰减远期) |
学习率变化趋势 | 单调递减 | 随近期梯度波动(非单调) |
训练后期表现 | 易停滞 | 能持续更新 |
优缺点
优点 | 缺点 |
---|---|
1. 解决了 AdaGrad 的学习率停滞问题; 2. 自适应参数级学习率,对稀疏数据友好; 3. 训练稳定性高(平滑近期梯度) | 1. 仍需手动调全局学习率 η; 2. 仅考虑梯度的 “大小”,未考虑梯度的 “方向趋势”(缺乏动量项的加速效果)。 |
适用场景
- 替代 AdaGrad 的所有场景,尤其适合需要长期训练的模型(如 CNN、RNN);
- 常作为 Adam 的 “简化对比版”,理解自适应学习率的核心逻辑。
3. AdaDelta:进一步摆脱 “对全局学习率的依赖”
RMSProp 解决了学习率停滞,但仍需手动设置全局学习率 η。AdaDelta 的核心改进是:用 “参数更新量的历史平方平均” 替代全局学习率,彻底摆脱对 η 的依赖。
核心思想
引入 “参数更新量的平方累积项” E [Δθ²]_t(记录近期参数更新步长的平方),用它替代 RMSProp 中的全局学习率 η,让学习率完全由数据的梯度特性决定,无需手动调参。
参数更新公式
设衰减系数 γ=0.95,平滑项 ε=10^-8,则:
- 近期梯度平方的 EWMA(同 RMSProp):E [g²]t = γ·E[g²]{t-1} + (1-γ)·g_t²
- 近期参数更新量的 EWMA:E [Δθ²]t = γ·E[Δθ²]{t-1} + (1-γ)·Δθ_{t-1}²
- 自适应学习率(无全局 η):η_t = √(E [Δθ²]_{t-1} + ε) / √(E [g²]_t + ε)
- 更新参数:Δθ_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 能提前修正)。
参数更新公式
- 先按历史动量前瞻一步:θ_{t-1}^(lookahead) = θ_{t-1} - γ・v_{t-1}
- 在前瞻参数上算梯度:g_t = ∇θL (θ_{t-1}^(lookahead))
- 更新动量项:v_t = γ・v_{t-1} + η・g_t
- 更新参数:θ_t = θ_{t-1} - v_t
适用场景
- 对收敛精度要求高的场景,比普通动量更精准,但计算成本略高(多一步前瞻参数的梯度计算)。
2. Adam(自适应动量估计):“RMSProp + Nesterov 动量” 的融合
Adam 是目前最主流的优化器,核心是 “将 RMSProp 的自适应学习率(关注梯度大小)与 Nesterov 动量的平滑加速(关注梯度方向)结合”,同时还解决了 “动量项和梯度平方项的初始偏置问题”。
核心思想
- 一阶矩估计(动量项):用 EWMA 维护梯度的 “方向趋势”(类似 Nesterov 动量),记为 m_t;
- 二阶矩估计(自适应学习率项):用 EWMA 维护梯度的 “大小波动”(类似 RMSProp),记为 v_t;
- 偏差修正:因初始时 m_t 和 v_t 接近 0,会导致前期学习率偏小,Adam 通过 “偏差修正” 让前期更新更稳定。
参数更新公式
设一阶矩衰减系数 β₁=0.9(控制动量项的平滑),二阶矩衰减系数 β₂=0.999(控制自适应学习率的平滑),平滑项 ε=10^-8:
- 一阶矩(动量项):m_t = β₁・m_{t-1} + (1-β₁)・g_t
- 二阶矩(自适应项):v_t = β₂・v_{t-1} + (1-β₂)・g_t²
- 偏差修正(解决初始偏置):
m_t^hat = m_t / (1 - β₁^t)(t 为训练步数,步数越多,修正幅度越小)
v_t^hat = v_t / (1 - β₂^t) - 更新参数:θ_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 成为兼顾各方需求的 “最优解”,也是绝大多数场景的首选