目标:系统掌握深度学习中核心优化器的算法原理、数学推导、收敛特性与适用场景,建立"优化器工具箱"的完整认知。

前置要求:了解基本的神经网络概念(前向传播、反向传播)和微积分基础(偏导数、链式法则)。

优化器是深度学习的"引擎"——它决定了模型参数如何根据梯度信息进行更新。选对优化器和学习率,往往比改模型架构更有效。本文按演进脉络系统梳理各类优化器,给出算法描述、公式推导、代码实现和记忆小贴士。


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全部最高最低最高
SGD1 个最低最高最低
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 + Momentum0.1 + Step Decay泛化性好,经典方案推购物车
Transformer / NLPAdamW1e-4 ~ 3e-4 + Cosine权重衰减解耦,训练稳定解耦权重衰减
大语言模型预训练AdamW + Warmup + Cosine1e-4 ~ 3e-4现代 LLM 标配标准方案
GANAdam1e-4(G 和 D)自适应学习率适合对抗训练自适应
微调(Fine-tuning)AdamW1e-5 ~ 5e-5小学习率,防止灾难性遗忘小步慢走
大批量训练LAMB线性缩放逐层自适应,大批量友好逐层缩放
小规模全批量L-BFGS1.0二阶信息,收敛快近似 Hessian
不确定时Adam1e-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"]

优化器优化轨迹对比

从上图可以看出,优化器的发展遵循一条清晰的脉络:

  1. 朴素梯度下降期:BGD、SGD、Mini-batch GD——只用当前梯度
  2. 动量法时期:Momentum、Nesterov——引入历史梯度信息,加速收敛
  3. 自适应学习率时期:AdaGrad、RMSprop、Adam——为每个参数自动调整学习率
  4. Adam 修正期:AdamW、RAdam、LAMB——修正 Adam 的缺陷(权重衰减、方差不稳定、大批量)

理解了这条演进脉络,就掌握了优化器设计的核心哲学:在更新方向的准确性(用更多历史信息)和步长的自适应性(为每个参数调学习率)之间寻找最佳平衡点


延伸阅读:关于 Adam 的完整数学推导(含偏差修正的证明),以及 SGD 与 Adam 泛化性差异的深入分析,可参考 大语言模型训练机制全解·第一篇 的相关章节。