目标:系统掌握深度学习中核心优化器的算法原理、数学推导、收敛特性与适用场景,建立"优化器工具箱"的完整认知。
前置要求:了解基本的神经网络概念(前向传播、反向传播)和微积分基础(偏导数、链式法则)。
优化器是深度学习的"引擎"——它决定了模型参数如何根据梯度信息进行更新。选对优化器和学习率,往往比改模型架构更有效。本文按演进脉络系统梳理各类优化器,给出算法描述、公式推导、代码实现和记忆小贴士。
1. 优化的基础(Why Optimization?)
在深入具体优化器之前,先理解"优化"在深度学习中解决什么问题。
1.1 优化目标
深度学习的训练本质上是一个最小化损失函数的过程:
$$ \theta^* = \arg\min_{\theta} \mathcal{L}(\theta) $$其中 $\theta$ 是模型参数(可能有数十亿个),$\mathcal{L}(\theta)$ 是损失函数。由于 $\mathcal{L}$ 通常是非凸的、高维的、没有解析解的,我们只能用迭代方法逐步逼近最优解。
1.2 梯度的直觉
梯度 $\nabla_\theta \mathcal{L}$ 指向损失函数增长最快的方向。因此,沿梯度的反方向更新参数,就能让损失下降:
$$ \theta_{t+1} = \theta_t - \eta \nabla_\theta \mathcal{L}(\theta_t) $$其中 $\eta$ 是学习率(learning rate)——控制每一步走多远。
类比:下山。你站在一座山上(损失曲面),想走到山谷(最小值)。梯度告诉你"哪个方向最陡",学习率决定你"每步走多远"。步子太大会跨过山谷,步子太小则下山太慢。
1.3 学习率的影响
数值示例:假设当前参数 $\theta = 5$,梯度 $\nabla \mathcal{L} = 2$:
- $\eta = 0.1$:$\theta_{\text{new}} = 5 - 0.1 \times 2 = 4.8$(稳步下降)
- $\eta = 1.0$:$\theta_{\text{new}} = 5 - 1.0 \times 2 = 3.0$(大步下降)
- $\eta = 3.0$:$\theta_{\text{new}} = 5 - 3.0 \times 2 = -1.0$(跨过了最优点!)
1.4 优化的三大挑战
| 挑战 | 描述 | 直觉 |
|---|---|---|
| 鞍点 | 某些维度是极小值,另一些维度是极大值 | 马鞍面的中心点 |
| 局部最小值 | 非全局最优的低洼处 | 山中的小坑 |
| 梯度消失/爆炸 | 深层网络中梯度连乘导致过小或过大 | 下山路上信号丢失或噪音太大 |
2. 梯度下降三兄弟(Gradient Descent Variants)
所有优化器的起点——三种梯度下降变体的区别仅在于每次更新用多少数据。
2.1 批量梯度下降(Batch Gradient Descent, BGD)
简介:每次更新使用全部训练数据计算梯度。梯度最准确,但计算最慢。
$$ \theta_{t+1} = \theta_t - \eta \cdot \frac{1}{N}\sum_{i=1}^{N} \nabla_\theta \mathcal{L}(\theta_t; x_i, y_i) $$优点:梯度方向准确,收敛稳定。
致命缺陷:数据集很大时(如 ImageNet 有 128 万张图),每次更新都要遍历全部数据——计算不可承受。
记忆小贴士:BGD = “Batch Gradient Descent”——每次用整个 batch(全部数据)。准确但慢。
2.2 随机梯度下降(Stochastic Gradient Descent, SGD)
简介:每次更新只用一个样本计算梯度。速度极快,但梯度噪声大。
$$ \theta_{t+1} = \theta_t - \eta \cdot \nabla_\theta \mathcal{L}(\theta_t; x_i, y_i) $$数值示例:假设损失函数 $\mathcal{L} = (θ - 3)^2$,初始 $\theta = 0$,$\eta = 0.1$:
- 第 1 步:$\nabla \mathcal{L} = 2(0 - 3) = -6$,$\theta = 0 - 0.1 \times (-6) = 0.6$
- 第 2 步:$\nabla \mathcal{L} = 2(0.6 - 3) = -4.8$,$\theta = 0.6 - 0.1 \times (-4.8) = 1.08$
- 第 3 步:$\nabla \mathcal{L} = 2(1.08 - 3) = -3.84$,$\theta = 1.08 - 0.1 \times (-3.84) = 1.464$
- 逐步逼近 $\theta^* = 3$
优点:更新频繁,能跳出局部最小值(噪声反而是优势)。
缺点:梯度方向不稳定(噪声大),收敛路径呈锯齿形。
记忆小贴士:SGD = “Stochastic Gradient Descent”——随机选一个样本算梯度。快但吵。
2.3 小批量梯度下降(Mini-batch Gradient Descent)
简介:每次更新用一个小批量(通常 32~512 个样本)计算梯度。兼顾准确性和效率——实际中的默认选择。
$$ \theta_{t+1} = \theta_t - \eta \cdot \frac{1}{m}\sum_{i=1}^{m} \nabla_\theta \mathcal{L}(\theta_t; x_i, y_i) $$其中 $m$ 是 batch size。
类比:投票制度。BGD 是全民公投(所有人投票,最准但最慢);SGD 是一人决定(最快但噪声大);Mini-batch 是小组投票(折中方案,实践中最常用)。
记忆小贴士:Mini-batch = “小批量”——每次用一小批数据。实践中说的"SGD"通常指 Mini-batch GD。
2.4 三者对比
| 变体 | 每次用数据量 | 梯度准确性 | 更新频率 | 内存需求 |
|---|---|---|---|---|
| BGD | 全部 | 最高 | 最低 | 最高 |
| SGD | 1 个 | 最低 | 最高 | 最低 |
| Mini-batch | $m$ 个 | 中等 | 中等 | 中等 |
3. 动量法(Momentum Methods)
朴素梯度下降有两个问题:在峡谷形损失曲面中震荡、在平坦区域收敛慢。动量法通过引入"历史梯度"来平滑更新方向。
3.1 经典动量(SGD with Momentum)
简介:在梯度更新中引入指数移动平均(EMA),让参数更新具有"惯性"——历史梯度方向一致时加速,方向反转时减速。
$$ v_t = \beta v_{t-1} + (1 - \beta) \nabla_\theta \mathcal{L}(\theta_t) $$$$ \theta_{t+1} = \theta_t - \eta v_t $$其中 $v_t$ 是动量(velocity),$\beta$ 是动量系数(通常取 0.9)。
直觉:想象一个球从山上滚下来。纯梯度下降像一个没有质量的点——每一步只看当前坡度。动量法像一个有质量的球——它会积累速度(历史梯度方向一致时加速),遇到小坑时靠惯性冲过去(跳出局部最小值)。
数值示例:假设连续 3 步梯度都为 $g = 2$,$\beta = 0.9$,$\eta = 0.01$:
- 第 1 步:$v_1 = 0.9 \times 0 + 0.1 \times 2 = 0.2$,$\Delta\theta = 0.01 \times 0.2 = 0.002$
- 第 2 步:$v_2 = 0.9 \times 0.2 + 0.1 \times 2 = 0.38$,$\Delta\theta = 0.01 \times 0.38 = 0.0038$
- 第 3 步:$v_3 = 0.9 \times 0.38 + 0.1 \times 2 = 0.542$,$\Delta\theta = 0.01 \times 0.542 = 0.00542$
更新步长从 0.002 逐步增大到 0.00542——梯度方向一致时自动加速。
类比:推购物车。在超市推购物车时,持续向前推(梯度方向一致)会让车越走越快;转弯时(梯度方向改变)车会因为惯性而冲过头,但最终会减速转向。
记忆小贴士:Momentum = “动量”——给梯度加上"惯性"。$\beta = 0.9$ 意味着 90% 的历史信息 + 10% 的当前梯度。
3.2 Nesterov 加速梯度(NAG)
简介:经典动量的改进——先用当前动量"预测"下一步的位置,再在预测位置计算梯度。这给了优化器一个"前瞻性"。
$$ v_t = \beta v_{t-1} + \eta \nabla_\theta \mathcal{L}(\theta_t - \eta \beta v_{t-1}) $$$$ \theta_{t+1} = \theta_t - v_t $$关键区别:经典动量在当前位置 $\theta_t$ 计算梯度,然后加上动量;NAG 先"往前看一步"($\theta_t - \eta \beta v_{t-1}$),在那个位置计算梯度——如果发现"前面是悬崖"(梯度反向),会提前减速。
类比:开车看路。经典动量像只盯着方向盘开车(看当前位置的梯度);NAG 像抬头看前方路况(在预测位置算梯度),发现前方有急弯会提前减速。
记忆小贴士:Nesterov = “先看再走”——先预测下一步位置,再在那个位置算梯度。
3.3 代码实现
import torch.optim as optim
# 经典动量
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
# Nesterov 动量
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9, nesterov=True)
3.4 适用场景
动量法是 SGD 的标准增强版——几乎所有使用 SGD 的场景都会加上动量。在 CV 任务(ResNet、VGG)中,SGD + Momentum($\beta = 0.9$)长期是默认选择。
4. 自适应学习率方法(Adaptive Learning Rate Methods)
动量法解决了"加速"问题,但没有解决"不同参数需要不同学习率"的问题。自适应学习率方法为每个参数自动调整学习率。
4.1 AdaGrad(Adaptive Gradient)
简介:为每个参数维护一个累积梯度平方和,用它来缩放学习率——梯度大的参数学习率自动变小,梯度小的参数学习率自动变大。
$$ G_t = G_{t-1} + g_t^2 $$$$ \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{G_t + \epsilon}} \cdot g_t $$其中 $g_t = \nabla_\theta \mathcal{L}(\theta_t)$,$\epsilon \approx 10^{-8}$ 防止除零。
直觉:对于频繁更新的参数(累积梯度大),学习率衰减快——避免在已经充分探索的方向上浪费步长。对于稀疏特征(累积梯度小),学习率保持较大——鼓励探索。
致命缺陷——学习率单调递减:$G_t$ 只增不减,导致学习率只降不升。训练后期学习率可能趋近于 0,模型停止学习。
记忆小贴士:AdaGrad = “Adaptive Gradient”——自适应调整每个参数的学习率。历史梯度大的参数,学习率自动变小。
4.2 RMSprop(Root Mean Square Propagation)
简介:Hinton 在 Coursera 课程中提出(未正式发表论文),解决 AdaGrad 学习率单调递减的问题——用指数移动平均代替简单累加。
$$ E[g^2]_t = \rho E[g^2]_{t-1} + (1 - \rho) g_t^2 $$$$ \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{E[g^2]_t + \epsilon}} \cdot g_t $$其中 $\rho$ 是衰减率(通常取 0.99)。
关键改进:用 EMA 替代累加,使得"远古"梯度的影响随时间衰减——学习率不再单调递减,而是根据近期梯度动态调整。
数值示例:假设 $\rho = 0.99$,$\epsilon = 10^{-8}$,梯度序列 $g = [1, 1, 1, 10, 1]$:
- AdaGrad 累积:$G = [1, 2, 3, 103, 104]$——第 4 步的大梯度永久拉低学习率
- RMSprop EMA:$E \approx [0.01, 0.02, 0.03, 1.03, 1.03]$——第 4 步的大梯度拉高了 $E$,但后续梯度恢复正常后 $E$ 不会继续飙升(EMA 的"记忆衰减"特性)
类比:AdaGrad 像记日记——所有历史都记录在案,过去的大事件永久影响现在。RMSprop 像金鱼记忆——只记得最近的事,远古事件逐渐被遗忘。
记忆小贴士:RMSprop = “Root Mean Square Propagation”——用梯度平方的 RMS(指数移动平均版)缩放学习率。
4.3 Adam(Adaptive Moment Estimation)
简介:结合 Momentum 和 RMSprop 的优点——同时维护梯度的一阶矩估计(均值,类似动量)和二阶矩估计(方差,类似 RMSprop)。2014 年由 Kingma & Ba 提出,是目前最广泛使用的优化器。
$$ m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t \quad \text{(一阶矩:梯度的 EMA)} $$$$ v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2 \quad \text{(二阶矩:梯度平方的 EMA)} $$偏差修正(关键步骤):
$$ \hat{m}_t = \frac{m_t}{1 - \beta_1^t}, \quad \hat{v}_t = \frac{v_t}{1 - \beta_2^t} $$$$ \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_t $$默认超参数:$\beta_1 = 0.9$,$\beta_2 = 0.999$,$\epsilon = 10^{-8}$。
为什么需要偏差修正:$m_t$ 和 $v_t$ 初始化为 0,前几步的值严重偏小(被零初始化拖累)。偏差修正通过除以 $(1 - \beta^t)$ 来补偿:
- $t = 1$ 时:$\hat{m}_1 = m_1 / (1 - 0.9) = m_1 / 0.1$(放大 10 倍)
- $t = 100$ 时:$\hat{m}_{100} \approx m_{100}$(修正量可忽略)
类比:Adam 像一个有经验的司机。$m_t$(一阶矩)像方向盘——记住"最近在往哪个方向走"(动量)。$v_t$(二阶矩)像油门控制——记住"最近路面有多颠簸"(自适应学习率)。两者结合,方向明确时加速,路面颠簸时减速。
记忆小贴士:Adam = “Adaptive Moment Estimation”——自适应估计梯度的一阶矩(均值)和二阶矩(方差)。
4.4 代码实现
import torch.optim as optim
# Adam(最常用的默认选择)
optimizer = optim.Adam(model.parameters(), lr=1e-3, betas=(0.9, 0.999), eps=1e-8)
# AdaGrad
optimizer = optim.Adagrad(model.parameters(), lr=0.01)
# RMSprop
optimizer = optim.RMSprop(model.parameters(), lr=1e-3, alpha=0.99)
4.5 Adam 的局限性
- 泛化性争议:有研究表明 SGD + Momentum 在某些 CV 任务上泛化性优于 Adam(虽然 Adam 收敛更快)
- 权重衰减不等价:Adam 中的 L2 正则化与权重衰减不等价——需要用 AdamW(见下文)
- 对学习率敏感:虽然自适应,但 $\eta$ 仍然需要调(默认 1e-3 不总是最优)
5. Adam 变体(Adam Variants)
Adam 虽好,但并非完美。以下变体针对 Adam 的不同缺陷进行了改进。
5.1 AdamW(Adam with Decoupled Weight Decay)
简介:Loshchilov & Hutter 2019 提出,将权重衰减从梯度更新中解耦出来。这是 Adam 最重要的修正。
原始 Adam + L2 正则化(有问题):
$$ g_t = \nabla_\theta \mathcal{L}(\theta_t) + \lambda \theta_t $$$$ \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_t $$问题:L2 正则化项 $\lambda \theta_t$ 被自适应学习率缩放,导致权重衰减效果不均匀——梯度大的参数衰减反而弱。
AdamW(正确做法):
$$ g_t = \nabla_\theta \mathcal{L}(\theta_t) \quad \text{(梯度不含正则项)} $$$$ \theta_{t+1} = (1 - \eta\lambda)\theta_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_t \quad \text{(权重衰减独立于自适应缩放)} $$类比:Adam + L2 像在泥地里推购物车——推力(梯度)和阻力(正则化)都被泥地(自适应学习率)影响。AdamW 像在平地上推购物车——推力受路况影响,但摩擦力(权重衰减)是独立的。
记忆小贴士:AdamW = “Adam with Decoupled Weight Decay”——权重衰减与梯度更新解耦。
适用场景:Transformer 训练的标准选择(BERT、GPT、LLaMA 等)。在 Adam 需要正则化时,始终优先选择 AdamW。
5.2 RAdam(Rectified Adam)
简介:Liu et al. 2019 提出,解决 Adam 训练初期的方差估计不稳定问题。在前几步用 SGD(无自适应)过渡,待方差估计稳定后再切换到 Adam。
动机:Adam 的二阶矩 $v_t$ 在训练初期样本量不足,方差估计不可靠——可能导致学习率被错误缩放。
核心公式:计算方差的"置信度" $\rho_t$,当 $\rho_t$ 超过阈值 $\rho_\infty$ 时启用自适应学习率:
$$ \rho_t = \rho_\infty - \frac{2t\beta_2^t}{1 - \beta_2^t} $$- $\rho_t \lt \rho_\infty$:使用 SGD + Momentum(方差估计不可靠)
- $\rho_t \geq \rho_\infty$:使用完整 Adam(方差估计已稳定)
记忆小贴士:RAdam = “Rectified Adam”——修正了 Adam 训练初期的方差不稳定问题。
5.3 LAMB(Layer-wise Adaptive Moments optimizer for Batch training)
简介:You et al. 2019 提出,为大批量训练设计。核心思想是按层缩放更新量,使得不同层的更新比例一致。
$$ r_t = \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} + \lambda \theta_t $$$$ \phi_t = \frac{\|\theta_t\|}{\|r_t\|} $$$$ \theta_{t+1} = \theta_t - \eta \cdot \phi_t \cdot r_t $$其中 $\phi_t$ 是逐层的缩放因子——确保每层的相对更新幅度一致。
适用场景:BERT 等大模型的大批量预训练(batch size 可达 64K+)。LAMB 使得 BERT 预训练从 3 天缩短到 76 分钟。
记忆小贴士:LAMB = “Layer-wise Adaptive Moments optimizer for Batch training”——逐层自适应缩放,专为大批量训练设计。
5.4 代码实现
import torch.optim as optim
# AdamW(Transformer 训练的默认选择)
optimizer = optim.AdamW(model.parameters(), lr=1e-4, weight_decay=0.01)
# RAdam
optimizer = optim.RAdam(model.parameters(), lr=1e-3)
6. 二阶优化方法简介(Second-order Methods)
以上方法都只用梯度(一阶信息)。二阶方法还利用曲率信息(Hessian 矩阵),理论上收敛更快,但计算成本极高。
6.1 牛顿法(Newton’s Method)
简介:利用损失函数的二阶 Taylor 展开,同时考虑梯度和曲率:
$$ \theta_{t+1} = \theta_t - H^{-1} \nabla_\theta \mathcal{L}(\theta_t) $$其中 $H$ 是 Hessian 矩阵(二阶导数矩阵),$H^{-1}$ 是其逆矩阵。
为什么收敛快:一阶方法只知道"哪个方向下坡";牛顿法还知道"坡度变化多快"——在曲率大的方向步子小,曲率小的方向步子大。
致命缺陷:
- 计算量巨大:参数量为 $n$ 时,Hessian 矩阵大小为 $n \times n$。对于百万参数的模型,Hessian 矩阵有 $10^{12}$ 个元素——内存和计算都不可承受
- 非凸问题:深度学习的损失曲面非凸,Hessian 可能不是正定的(牛顿方向可能指向最大值)
记忆小贴士:牛顿法 = “用二阶信息”——$H^{-1}g$ 自动缩放每个方向的步长。准但贵。
6.2 L-BFGS(Limited-memory BFGS)
简介:牛顿法的近似版本——不直接计算 Hessian 矩阵,而是用最近几步的梯度变化来隐式近似 $H^{-1}g$。内存消耗从 $O(n^2)$ 降到 $O(n)$。
适用场景:小规模优化问题(如风格迁移、少量参数的科学计算)。在深度学习中很少用于训练(因为 mini-batch 的噪声使得曲率估计不可靠),但在某些特定场景(如全批量优化、few-shot learning)中偶有使用。
import torch.optim as optim
# L-BFGS(注意:需要全批量数据,不适用于 mini-batch)
optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20)
记忆小贴士:L-BFGS = “Limited-memory BFGS”——内存受限的 BFGS,用历史梯度近似 Hessian 逆。
6.3 为什么深度学习不用二阶方法
| 因素 | 一阶方法(Adam) | 二阶方法(Newton) |
|---|---|---|
| 每步计算量 | $O(n)$ | $O(n^2)$ ~ $O(n^3)$ |
| 内存需求 | $O(n)$ | $O(n^2)$ |
| 对噪声的鲁棒性 | 高(mini-batch 友好) | 低(需要精确梯度) |
| 实际使用 | 几乎所有深度学习 | 几乎不用 |
7. 学习率调度策略(Learning Rate Scheduling)
好的学习率策略与好的优化器同样重要。以下是常用的调度策略。
7.1 学习率预热(Warmup)
简介:训练初期从很小的学习率线性增长到目标学习率。避免训练初期梯度不稳定时用大学习率导致发散。
$$ \eta_t = \eta_{\text{target}} \cdot \frac{t}{T_{\text{warmup}}} \quad (t \leq T_{\text{warmup}}) $$为什么需要预热:训练初期参数是随机初始化的,梯度方向不可靠。用小学习率"试探"几步,等梯度方向稳定后再用大学习率。
适用场景:Transformer 训练的标配(BERT、GPT 的训练方案都包含 warmup)。
7.2 余弦退火(Cosine Annealing)
简介:学习率按余弦函数从初始值衰减到最小值,平滑且有效。
$$ \eta_t = \eta_{\min} + \frac{1}{2}(\eta_{\max} - \eta_{\min})\left(1 + \cos\left(\frac{t}{T}\pi\right)\right) $$类比:日落。学习率像太阳一样,从高点平滑地"落"到地平线——不是突然关灯,而是自然渐暗。
适用场景:现代 LLM 训练的标准衰减策略(余弦退火 + warmup)。
7.3 余弦退火 + Warmup(现代 LLM 标配)
from torch.optim.lr_scheduler import CosineAnnealingLR, LinearLR, SequentialLR
optimizer = optim.AdamW(model.parameters(), lr=1e-4)
warmup = LinearLR(optimizer, start_factor=0.01, total_iters=1000)
cosine = CosineAnnealingLR(optimizer, T_max=9000, eta_min=1e-6)
scheduler = SequentialLR(optimizer, schedulers=[warmup, cosine], milestones=[1000])
7.4 其他调度策略
| 策略 | 公式 / 描述 | 特点 |
|---|---|---|
| Step Decay | 每 $K$ 个 epoch 乘以 $\gamma$(如 0.1) | 简单有效,ResNet 经典方案 |
| Exponential Decay | $\eta_t = \eta_0 \cdot \gamma^t$ | 平滑衰减 |
| ReduceOnPlateau | 验证损失不再下降时衰减 | 自适应,但需要验证集 |
| OneCycleLR | 先升后降,呈单峰形状 | Super-convergence,fast.ai 推荐 |
8. 优化器选择指南
| 场景 | 推荐优化器 | 学习率 | 核心原因 | 记忆关键词 |
|---|---|---|---|---|
| CV(ResNet 等) | SGD + Momentum | 0.1 + Step Decay | 泛化性好,经典方案 | 推购物车 |
| Transformer / NLP | AdamW | 1e-4 ~ 3e-4 + Cosine | 权重衰减解耦,训练稳定 | 解耦权重衰减 |
| 大语言模型预训练 | AdamW + Warmup + Cosine | 1e-4 ~ 3e-4 | 现代 LLM 标配 | 标准方案 |
| GAN | Adam | 1e-4(G 和 D) | 自适应学习率适合对抗训练 | 自适应 |
| 微调(Fine-tuning) | AdamW | 1e-5 ~ 5e-5 | 小学习率,防止灾难性遗忘 | 小步慢走 |
| 大批量训练 | LAMB | 线性缩放 | 逐层自适应,大批量友好 | 逐层缩放 |
| 小规模全批量 | L-BFGS | 1.0 | 二阶信息,收敛快 | 近似 Hessian |
| 不确定时 | Adam | 1e-3 | 万金油,默认选择 | 自适应矩 |
9. 优化器演进脉络
flowchart TD
GD["梯度下降"] --> BGD["BGD"]
GD --> SGD["SGD"]
GD --> MBGD["Mini-batch GD"]
SGD --> Momentum["Momentum"]
Momentum --> NAG["Nesterov"]
GD --> AdaGrad["AdaGrad<br/>2011"]
AdaGrad --> RMSprop["RMSprop<br/>2012"]
Momentum --> Adam["Adam<br/>2014"]
RMSprop --> Adam
Adam --> AdamW["AdamW<br/>2019"]
Adam --> RAdam["RAdam<br/>2019"]
Adam --> LAMB["LAMB<br/>2019"]
从上图可以看出,优化器的发展遵循一条清晰的脉络:
- 朴素梯度下降期:BGD、SGD、Mini-batch GD——只用当前梯度
- 动量法时期:Momentum、Nesterov——引入历史梯度信息,加速收敛
- 自适应学习率时期:AdaGrad、RMSprop、Adam——为每个参数自动调整学习率
- Adam 修正期:AdamW、RAdam、LAMB——修正 Adam 的缺陷(权重衰减、方差不稳定、大批量)
理解了这条演进脉络,就掌握了优化器设计的核心哲学:在更新方向的准确性(用更多历史信息)和步长的自适应性(为每个参数调学习率)之间寻找最佳平衡点。
延伸阅读:关于 Adam 的完整数学推导(含偏差修正的证明),以及 SGD 与 Adam 泛化性差异的深入分析,可参考 大语言模型训练机制全解·第一篇 的相关章节。