训练深度学习模型时,我们每天都在用 SGD、Momentum、Adam、AdamW,但很少有人能说清它们之间的数学关系:为什么动量能加速收敛?为什么 Adam 要维护两个矩估计?偏差修正那一项到底在修什么?AdamW 与 Adam 的区别真的只是"先做权重衰减"吗?本文从凸优化的收敛性分析出发,建立梯度下降的理论基线,然后逐步推导动量法、Nesterov 加速、Adagrad、RMSProp、Adam 与 AdamW,把优化器的演进理解为"逐步修补梯度估计的偏差与尺度缺陷",并给出每个关键公式的严格推导与收敛性说明。
第一部分:优化问题与收敛性分析基础
问题定义
深度学习训练可以写成无约束优化问题:
min θ ∈ R d L ( θ ) = 1 N ∑ i = 1 N ℓ ( f θ ( x i ) , y i ) \min_{\theta \in \mathbb{R}^d} \quad L(\theta) = \frac{1}{N} \sum_{i=1}^{N} \ell(f_\theta(x_i), y_i)
θ ∈ R d min L ( θ ) = N 1 i = 1 ∑ N ℓ ( f θ ( x i ) , y i )
其中 ℓ \ell ℓ 是单样本损失,N N N 是训练样本数。我们的目标是设计迭代算法 θ t + 1 = θ t − η t g t \theta_{t+1} = \theta_t - \eta_t g_t θ t + 1 = θ t − η t g t ,使其快速逼近最优解 θ ∗ = arg min L ( θ ) \theta^* = \arg\min L(\theta) θ ∗ = arg min L ( θ ) 。
光滑性与强凸性
收敛性分析依赖对损失函数几何性质的假设。两个核心概念:
L-光滑(L-smooth) :梯度是 L-Lipschitz 连续的:
∥ ∇ L ( θ ) − ∇ L ( θ ′ ) ∥ ≤ L ∥ θ − θ ′ ∥ , ∀ θ , θ ′ \|\nabla L(\theta) - \nabla L(\theta')\| \le L \|\theta - \theta'\|, \quad \forall \theta, \theta'
∥ ∇ L ( θ ) − ∇ L ( θ ′ ) ∥ ≤ L ∥ θ − θ ′ ∥ , ∀ θ , θ ′
等价地,损失函数被二次函数从上下夹逼:
L ( θ ′ ) ≤ L ( θ ) + ∇ L ( θ ) ⊤ ( θ ′ − θ ) + L 2 ∥ θ ′ − θ ∥ 2 L(\theta') \le L(\theta) + \nabla L(\theta)^{\top}(\theta' - \theta) + \frac{L}{2}\|\theta' - \theta\|^2
L ( θ ′ ) ≤ L ( θ ) + ∇ L ( θ ) ⊤ ( θ ′ − θ ) + 2 L ∥ θ ′ − θ ∥ 2
这个不等式是几乎所有收敛性证明的起点,它刻画了"梯度变化不会太快"。
μ \mu μ -强凸(μ \mu μ -strongly convex) :
L ( θ ′ ) ≥ L ( θ ) + ∇ L ( θ ) ⊤ ( θ ′ − θ ) + μ 2 ∥ θ ′ − θ ∥ 2 L(\theta') \ge L(\theta) + \nabla L(\theta)^{\top}(\theta' - \theta) + \frac{\mu}{2}\|\theta' - \theta\|^2
L ( θ ′ ) ≥ L ( θ ) + ∇ L ( θ ) ⊤ ( θ ′ − θ ) + 2 μ ∥ θ ′ − θ ∥ 2
强凸保证最优解唯一且"谷底足够深",是线性收敛的前提。两者的比值 κ = L / μ \kappa = L/\mu κ = L / μ 称为条件数 ,是刻画问题难度的核心指标。
梯度下降的收敛性
对 L-光滑函数,取学习率 η ≤ 1 / L \eta \le 1/L η ≤ 1 / L ,梯度下降满足单调下降 :
L ( θ t + 1 ) ≤ L ( θ t ) − η 2 ∥ ∇ L ( θ t ) ∥ 2 L(\theta_{t+1}) \le L(\theta_t) - \frac{\eta}{2}\|\nabla L(\theta_t)\|^2
L ( θ t + 1 ) ≤ L ( θ t ) − 2 η ∥ ∇ L ( θ t ) ∥ 2
证明:由 L-光滑不等式代入 θ ′ = θ t + 1 \theta' = \theta_{t+1} θ ′ = θ t + 1 、θ = θ t \theta = \theta_t θ = θ t ,并利用 θ t + 1 − θ t = − η ∇ L ( θ t ) \theta_{t+1} - \theta_t = -\eta \nabla L(\theta_t) θ t + 1 − θ t = − η ∇ L ( θ t ) 即可。
对 L-光滑且 μ \mu μ -强凸的函数,取 η = 1 / L \eta = 1/L η = 1 / L ,有线性收敛 :
L ( θ T ) − L ( θ ∗ ) ≤ ( 1 − μ L ) T ( L ( θ 0 ) − L ( θ ∗ ) ) L(\theta_T) - L(\theta^*) \le \left( 1 - \frac{\mu}{L} \right)^T \left( L(\theta_0) - L(\theta^*) \right)
L ( θ T ) − L ( θ ∗ ) ≤ ( 1 − L μ ) T ( L ( θ 0 ) − L ( θ ∗ ) )
推导要点:利用强凸给出 L ( θ t ) − L ( θ ∗ ) ≤ 1 2 μ ∥ ∇ L ( θ t ) ∥ 2 L(\theta_t) - L(\theta^*) \le \frac{1}{2\mu}\|\nabla L(\theta_t)\|^2 L ( θ t ) − L ( θ ∗ ) ≤ 2 μ 1 ∥ ∇ L ( θ t ) ∥ 2 (Polyak-Łojasiewicz 不等式的强凸特例),结合单调下降不等式消去梯度项,得到每步至少按 1 − μ / L 1 - \mu/L 1 − μ / L 的比例缩小误差。
结论 :收敛率由条件数 κ = L / μ \kappa = L/\mu κ = L / μ 决定。κ \kappa κ 大(损失曲面"细长",如狭窄山谷)收敛极慢,这为动量法的引入提供了理论动机:我们需要一种对条件数更不敏感的更新方式。
为什么收敛性分析重要
收敛率 $1 - \mu/L$ 里的条件数 $\kappa$ 解释了"山谷为什么难训练":一个方向曲率大($L$ 大)、另一个方向曲率小($\mu$ 小),梯度在陡峭方向反复震荡、在平缓方向缓慢爬行。后续所有优化器本质上都在做同一件事:降低更新对条件数的敏感度。动量通过累积历史梯度,自适应方法通过逐参数缩放学习率。
第二部分:随机梯度下降(SGD)
为什么需要随机性
全批量梯度 ∇ L ( θ ) = 1 N ∑ i ∇ ℓ i ( θ ) \nabla L(\theta) = \frac{1}{N}\sum_i \nabla \ell_i(\theta) ∇ L ( θ ) = N 1 ∑ i ∇ ℓ i ( θ ) 每步需要遍历全部 N N N 个样本,大数据集(N ∼ 1 0 7 N \sim 10^7 N ∼ 1 0 7 )下不可行。SGD 用随机小批量(mini-batch)梯度代替全梯度:
g t = 1 m ∑ i ∈ B t ∇ ℓ i ( θ t ) g_t = \frac{1}{m} \sum_{i \in \mathcal{B}_t} \nabla \ell_i(\theta_t)
g t = m 1 i ∈ B t ∑ ∇ ℓ i ( θ t )
其中 B t \mathcal{B}_t B t 是第 t t t 步采样的 batch(大小 m m m )。g t g_t g t 是 ∇ L ( θ t ) \nabla L(\theta_t) ∇ L ( θ t ) 的无偏估计 :
E [ g t ] = ∇ L ( θ t ) \mathbb{E}[g_t] = \nabla L(\theta_t)
E [ g t ] = ∇ L ( θ t )
方差与收敛
小批量梯度的方差为 E ∥ g t − ∇ L ( θ t ) ∥ 2 ≈ σ 2 / m \mathbb{E}\|g_t - \nabla L(\theta_t)\|^2 \approx \sigma^2 / m E ∥ g t − ∇ L ( θ t ) ∥ 2 ≈ σ 2 / m ,其中 σ 2 \sigma^2 σ 2 是单样本梯度的方差。方差的存在使 SGD 只能收敛到最优解的邻域(不衰减学习率时),或者以更慢的速度收敛(衰减学习率时)。
对 L-光滑 + 强凸函数,取衰减学习率 η t = Θ ( 1 / t ) \eta_t = \Theta(1/t) η t = Θ ( 1 / t ) ,SGD 的收敛率为:
E [ L ( θ T ) − L ( θ ∗ ) ] = O ( 1 T ) \mathbb{E}[L(\theta_T) - L(\theta^*)] = O\left( \frac{1}{T} \right)
E [ L ( θ T ) − L ( θ ∗ ) ] = O ( T 1 )
对比全批量梯度下降的线性收敛(指数衰减),随机性把收敛率从 O ( ( 1 − μ / L ) T ) O((1-\mu/L)^T) O ( ( 1 − μ / L ) T ) 降到了 O ( 1 / T ) O(1/T) O ( 1 / T ) 。这是随机化的代价 。
批量大小的作用
批量大小 m m m 的影响:方差 ∝ 1 / m \propto 1/m ∝ 1 / m ,所以增大 batch 可以加大学习率而不发散。经验法则:线性缩放规则(linear scaling rule) ,batch 翻倍则学习率翻倍。但 batch 过大(超过某阈值)后,梯度估计进入"精确但过拟合当前 batch"的区域,缩放规则失效,且大 batch 的泛化性通常略差于小 batch,这被称为"泛化差距"(generalization gap)。
实践中的学习率
SGD 对学习率极其敏感,需要精心设计调度:
固定学习率 :只适合凸问题,非凸下难收敛。
步衰减(step decay) :每固定步数乘以衰减因子(如每 30 epoch 乘 0.1),经典 CNN 训练标配。
余弦退火(cosine decay) :η t = η min + 1 2 ( η max − η min ) ( 1 + cos ( π t / T ) ) \eta_t = \eta_{\min} + \frac{1}{2}(\eta_{\max} - \eta_{\min})(1 + \cos(\pi t / T)) η t = η m i n + 2 1 ( η m a x − η m i n ) ( 1 + cos ( π t / T ) ) ,平滑衰减,与 warm restart 结合(SGDR)能进一步改善。
第三部分:动量法(Momentum)
更新规则与物理直觉
动量法维护速度变量 v t v_t v t ,作为历史梯度的指数加权累积:
v t = β v t − 1 + g t , θ t + 1 = θ t − η v t v_t = \beta v_{t-1} + g_t, \quad \theta_{t+1} = \theta_t - \eta v_t
v t = β v t − 1 + g t , θ t + 1 = θ t − η v t
展开 v t v_t v t :
v t = ∑ i = 0 t β t − i g i = g t + β g t − 1 + β 2 g t − 2 + ⋯ v_t = \sum_{i=0}^{t} \beta^{t-i} g_i = g_t + \beta g_{t-1} + \beta^2 g_{t-2} + \cdots
v t = i = 0 ∑ t β t − i g i = g t + β g t − 1 + β 2 g t − 2 + ⋯
权重按 β i \beta^i β i 指数衰减,β = 0.9 \beta = 0.9 β = 0 . 9 时有效记忆约 1 / ( 1 − β ) = 10 1/(1-\beta) = 10 1 / ( 1 − β ) = 1 0 步。物理直觉是小球在损失曲面上滚动,速度是惯性的累积,单步梯度突变不会立刻反转运动方向。
收敛性分析
对 L-光滑 + μ \mu μ -强凸函数,Polyak 重球法(heavy ball)的收敛率改进为:
L ( θ T ) − L ( θ ∗ ) ≤ O ( ( 1 − μ L ) T ) L(\theta_T) - L(\theta^*) \le O\left( \left( 1 - \sqrt{\frac{\mu}{L}} \right)^T \right)
L ( θ T ) − L ( θ ∗ ) ≤ O ( ( 1 − L μ ) T )
关键对比:朴素梯度下降的衰减因子是 1 − μ / L 1 - \mu/L 1 − μ / L ,动量法是 1 − μ / L 1 - \sqrt{\mu/L} 1 − μ / L 。由于 μ / L ≫ μ / L \sqrt{\mu/L} \gg \mu/L μ / L ≫ μ / L (κ > 1 \kappa > 1 κ > 1 时),动量把条件数的影响从 κ \kappa κ 降到了 κ \sqrt{\kappa} κ 。
直观解释:在"山谷"地形中,梯度在陡峭方向(曲率 L L L )分量大、在平缓方向(曲率 μ \mu μ )分量小。朴素梯度下降每步都被陡峭方向主导,来回震荡;动量累积后,震荡方向的历史梯度相互抵消,平缓方向的同向分量持续叠加 ,净速度偏向主方向,等效于"绕过了条件数的平方"。
偏差问题:一个常被忽略的细节
v t v_t v t 从 0 初始化,早期步数的速度被低估(只有 1 − β t 1 - \beta^t 1 − β t 的权重)。与 Adam 不同,经典动量法通常不做偏差修正,实践中用 warmup 学习率间接缓解。这个细节在 Adam 里被显式处理,是理解 Adam 偏差修正的铺垫。
第四部分:Nesterov 加速梯度(NAG)
前瞻更新
Nesterov 加速梯度在动量法基础上加了一个"前瞻"修正:先用当前速度预演一步,在预演位置计算梯度:
v t + 1 = β v t + ∇ L ( θ t − η β v t ) v_{t+1} = \beta v_t + \nabla L(\theta_t - \eta \beta v_t)
v t + 1 = β v t + ∇ L ( θ t − η β v t )
θ t + 1 = θ t − η v t + 1 \theta_{t+1} = \theta_t - \eta v_{t+1}
θ t + 1 = θ t − η v t + 1
与标准动量的唯一区别是梯度计算位置:标准动量在 θ t \theta_t θ t 处计算,NAG 在"速度将要到达的位置" θ t − η β v t \theta_t - \eta \beta v_t θ t − η β v t 处计算。
为什么前瞻有帮助
在接近最优点的下坡路段,标准动量因为惯性容易过冲 (越过最优点后仍沿原方向前进)。NAG 在预演位置看到"前方开始上坡",能提前减小步长。形式化地,NAG 对凸光滑函数达到最优收敛率:
L ( θ T ) − L ( θ ∗ ) ≤ O ( 1 T 2 ) ( 凸情形 ) L(\theta_T) - L(\theta^*) \le O\left( \frac{1}{T^2} \right) \quad (\text{凸情形})
L ( θ T ) − L ( θ ∗ ) ≤ O ( T 2 1 ) ( 凸情形 )
L ( θ T ) − L ( θ ∗ ) ≤ O ( ( 1 − μ L ) T ) ( 强凸情形 ) L(\theta_T) - L(\theta^*) \le O\left( \left( 1 - \sqrt{\frac{\mu}{L}} \right)^T \right) \quad (\text{强凸情形})
L ( θ T ) − L ( θ ∗ ) ≤ O ( ( 1 − L μ ) T ) ( 强凸情形 )
凸情形下的 O ( 1 / T 2 ) O(1/T^2) O ( 1 / T 2 ) 是一阶方法的信息论下界(Nesterov 证明了没有任何一阶方法能超过这个速率),因此 NAG 在凸优化意义下是最优一阶方法 。
动量系优化器解决了"方向",还没解决"尺度"
动量与 NAG 都用历史梯度修正更新方向(抑制震荡、加速主方向),但所有参数仍然共享同一个学习率。实际问题里不同参数的梯度尺度差异巨大:深层网络靠近输入的层梯度小、靠近输出的层梯度大;稀疏特征只被少数样本激活。下一步的自适应方法专门解决"每个参数该有自己的学习率"。
第五部分:自适应学习率
Adagrad:累积梯度平方
Adagrad 为每个参数维护历史梯度平方的累积和,用它的平方根逐参数缩放学习率:
G t = ∑ i = 1 t g i ⊙ g i G_t = \sum_{i=1}^{t} g_i \odot g_i
G t = i = 1 ∑ t g i ⊙ g i
θ t + 1 = θ t − η G t + ϵ ⊙ g t \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{G_t + \epsilon}} \odot g_t
θ t + 1 = θ t − G t + ϵ η ⊙ g t
其中 ⊙ \odot ⊙ 是逐元素乘法,ϵ \epsilon ϵ 防止除零(通常 1 0 − 8 10^{-8} 1 0 − 8 )。频繁更新、梯度大的参数累积 G t G_t G t 大,学习率被缩小;稀疏更新、梯度小的参数学习率保持较大 ,这让 Adagrad 天然适合稀疏特征(如词嵌入、one-hot 编码)。
Regret 分析 :Adagrad 的在线学习 regret 界为:
R ( T ) = ∑ t = 1 T f t ( θ t ) − min θ ∑ t = 1 T f t ( θ ) = O ( ∑ i = 1 d ∥ g 1 : T , i ∥ 2 2 ) R(T) = \sum_{t=1}^{T} f_t(\theta_t) - \min_\theta \sum_{t=1}^{T} f_t(\theta) = O\left( \sqrt{\sum_{i=1}^{d} \|g_{1:T,i}\|_2^2} \right)
R ( T ) = t = 1 ∑ T f t ( θ t ) − θ min t = 1 ∑ T f t ( θ ) = O ⎝ ⎛ i = 1 ∑ d ∥ g 1 : T , i ∥ 2 2 ⎠ ⎞
对比 SGD 的 O ( T ) O(\sqrt{T}) O ( T ) 界,Adagrad 的界与数据本身的结构 (各维度梯度范数)相关,对稀疏数据显著更好。
缺陷 :G t G_t G t 单调不减,学习率 η / G t \eta/\sqrt{G_t} η / G t 单调衰减到零,训练后期几乎无法继续学习。这个缺陷直接催生了 RMSProp。
RMSProp:滑动平均替代累积
RMSProp 把"全历史累积"改为指数加权滑动平均 ,让梯度平方的估计能"遗忘"旧信息:
v t = β 2 v t − 1 + ( 1 − β 2 ) g t ⊙ g t v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t \odot g_t
v t = β 2 v t − 1 + ( 1 − β 2 ) g t ⊙ g t
θ t + 1 = θ t − η v t + ϵ ⊙ g t \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{v_t + \epsilon}} \odot g_t
θ t + 1 = θ t − v t + ϵ η ⊙ g t
β 2 = 0.999 \beta_2 = 0.999 β 2 = 0 . 9 9 9 时有效窗口约 1000 步。v t v_t v t 是对 E [ g 2 ] \mathbb{E}[g^2] E [ g 2 ] 的估计,v t \sqrt{v_t} v t 刻画当前梯度尺度。每个参数的学习率 η / v t \eta/\sqrt{v_t} η / v t 随局部梯度尺度自适应:梯度大的维度被压低,梯度小的维度被放大,等效于白化梯度坐标 。
RMSProp 解决了 Adagrad 学习率单调衰减的问题,但缺少动量项,在高曲率方向仍会震荡。
第六部分:Adam:自适应矩估计
算法定义
Adam(Adaptive Moment Estimation,Kingma & Ba 2015)把动量法与 RMSProp 结合:一阶矩 m t m_t m t 估计梯度均值(动量),二阶矩 v t v_t v t 估计梯度平方均值(自适应尺度):
m t = β 1 m t − 1 + ( 1 − β 1 ) g t m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t
m t = β 1 m t − 1 + ( 1 − β 1 ) g t
v t = β 2 v t − 1 + ( 1 − β 2 ) g t ⊙ g t v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t \odot g_t
v t = β 2 v t − 1 + ( 1 − β 2 ) g t ⊙ g t
默认 β 1 = 0.9 \beta_1 = 0.9 β 1 = 0 . 9 、β 2 = 0.999 \beta_2 = 0.999 β 2 = 0 . 9 9 9 。
偏差修正的严格推导
m t m_t m t 从 0 初始化导致早期估计有偏。展开 m t m_t m t :
m t = ( 1 − β 1 ) ∑ i = 1 t β 1 t − i g i m_t = (1 - \beta_1) \sum_{i=1}^{t} \beta_1^{t-i} g_i
m t = ( 1 − β 1 ) i = 1 ∑ t β 1 t − i g i
若梯度序列平稳(E [ g i ] = g \mathbb{E}[g_i] = g E [ g i ] = g 恒定),则:
E [ m t ] = ( 1 − β 1 ) ∑ i = 1 t β 1 t − i g = g ( 1 − β 1 t ) \mathbb{E}[m_t] = (1 - \beta_1) \sum_{i=1}^{t} \beta_1^{t-i} g = g (1 - \beta_1^t)
E [ m t ] = ( 1 − β 1 ) i = 1 ∑ t β 1 t − i g = g ( 1 − β 1 t )
期望值只有真实梯度 g g g 的 1 − β 1 t 1 - \beta_1^t 1 − β 1 t 倍,系统性低估 。除以 1 − β 1 t 1 - \beta_1^t 1 − β 1 t 恰好补上缺失的权重:
m ^ t = m t 1 − β 1 t , v ^ t = v t 1 − β 2 t \hat{m}_t = \frac{m_t}{1 - \beta_1^t}, \quad \hat{v}_t = \frac{v_t}{1 - \beta_2^t}
m ^ t = 1 − β 1 t m t , v ^ t = 1 − β 2 t v t
使得 E [ m ^ t ] = g \mathbb{E}[\hat{m}_t] = g E [ m ^ t ] = g 、E [ v ^ t ] = E [ g 2 ] \mathbb{E}[\hat{v}_t] = \mathbb{E}[g^2] E [ v ^ t ] = E [ g 2 ] ,无偏。修正在训练早期(t t t 小)尤其关键 :t = 1 t = 1 t = 1 时 1 − β 1 = 0.1 1 - \beta_1 = 0.1 1 − β 1 = 0 . 1 ,不修正的话第一步动量只有真实值的十分之一;t t t 较大时 1 − β 1 t → 1 1 - \beta_1^t \to 1 1 − β 1 t → 1 ,修正项趋于 1,影响渐弱。这也是为什么 Adam 不需要 warmup 就能稳定启动(修正替代了 warmup 的部分作用)。
更新规则
θ t + 1 = θ t − η v ^ t + ϵ ⊙ m ^ t \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \odot \hat{m}_t
θ t + 1 = θ t − v ^ t + ϵ η ⊙ m ^ t
Adam 的收敛性
Kingma & Ba 在凸设定下证明了 regret 界:
R ( T ) ≤ D 2 2 η ( 1 − β 1 ) ∑ i = 1 d T v ^ T , i + η ( 1 + β 1 ) ( 1 − β 1 ) 1 − β 2 ∑ i = 1 d ∥ g 1 : T , i ∥ 2 R(T) \le \frac{D^2}{2\eta(1 - \beta_1)} \sum_{i=1}^{d} \sqrt{T \hat{v}_{T,i}} + \frac{\eta(1 + \beta_1)}{(1 - \beta_1)\sqrt{1 - \beta_2}} \sum_{i=1}^{d} \|g_{1:T,i}\|_2
R ( T ) ≤ 2 η ( 1 − β 1 ) D 2 i = 1 ∑ d T v ^ T , i + ( 1 − β 1 ) 1 − β 2 η ( 1 + β 1 ) i = 1 ∑ d ∥ g 1 : T , i ∥ 2
其中 D D D 是参数空间直径,v ^ T , i \hat{v}_{T,i} v ^ T , i 是二阶矩的修正估计。简化后:
R ( T ) = O ( T ) R(T) = O\left( \sqrt{T} \right)
R ( T ) = O ( T )
与非自适应方法同阶,但对稀疏梯度、非平稳目标(梯度分布随时间变化)显著更稳健,因为每个维度的缩放自适应于该维度的梯度历史。
已知问题:收敛性与泛化
Adam 存在两个被广泛讨论的问题:
收敛性缺陷 :Reddi et al. 指出,Adam 的 v ^ t \hat{v}_t v ^ t 不保证单调不减,可能增大,此时原证明失效,Adam 在某些简单凸问题上不收敛。为此提出 AMSGrad(用 v ^ t \hat{v}_t v ^ t 的历史最大值代替当前值,保证单调)。实践中 AMSGrad 通常与 Adam 表现接近,但理论更干净。
泛化差距 :Adam 在训练集上收敛快,但测试集泛化常略逊于 SGD+Momentum。一种解释是 Adam 的逐参数缩放等效于"改变了正则化几何",另一种观点认为 SGD 的隐式正则(沿着平坦方向)更强。这也推动了 AdamW 与 SGD 融合方向的研究。
优化器的演进脉络:每步都在修补前一步的缺陷
SGD 是基线,方差大、对条件数敏感;动量修补"方向震荡"(条件数 $\kappa \to \sqrt{\kappa}$);NAG 用前瞻达到一阶方法最优速率;Adagrad 修补"尺度不均"但引入学习率单调衰减;RMSProp 用滑动平均修复衰减;Adam 融合动量与自适应尺度并显式做偏差修正;AdamW 修复 Adam 里权重衰减被自适应缩放破坏的问题。每一步都是对前一步缺陷的针对性修补,理解这条线就能理解每个超参数存在的理由。
第七部分:AdamW:解耦权重衰减
权重衰减与 L2 正则的关系
**权重衰减(weight decay)**在每步更新时把参数向零收缩:
θ t + 1 = ( 1 − η λ ) θ t − η g t \theta_{t+1} = (1 - \eta \lambda) \theta_t - \eta g_t
θ t + 1 = ( 1 − η λ ) θ t − η g t
L2 正则 在损失中加入 λ ′ 2 ∥ θ ∥ 2 \frac{\lambda'}{2}\|\theta\|^2 2 λ ′ ∥ θ ∥ 2 ,梯度变为 ∇ L ( θ ) + λ ′ θ \nabla L(\theta) + \lambda' \theta ∇ L ( θ ) + λ ′ θ ,更新为:
θ t + 1 = θ t − η ∇ L ( θ t ) − η λ ′ θ t \theta_{t+1} = \theta_t - \eta \nabla L(\theta_t) - \eta \lambda' \theta_t
θ t + 1 = θ t − η ∇ L ( θ t ) − η λ ′ θ t
对朴素 SGD ,两者数学等价(λ ′ = λ \lambda' = \lambda λ ′ = λ ):权重衰减项要么直接乘在参数上,要么混进梯度里被同一学习率缩放,效果一致。
为什么 Adam 里两者不等价
Adam 的更新用 v ^ t \hat{v}_t v ^ t 归一化梯度。若权重衰减混在梯度里(L2 正则方式),它也会被逐元素归一化:
θ t + 1 = θ t − η v ^ t + ϵ ⊙ ( m ^ t + λ ′ θ t ) \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \odot \left( \hat{m}_t + \lambda' \theta_t \right)
θ t + 1 = θ t − v ^ t + ϵ η ⊙ ( m ^ t + λ ′ θ t )
问题在于权重衰减项被自适应缩放后,每个参数的衰减强度不一致 :频繁更新、梯度大的参数 v ^ t \hat{v}_t v ^ t 大,衰减项 λ ′ θ t / v ^ t \lambda'\theta_t / \sqrt{\hat{v}_t} λ ′ θ t / v ^ t 被削弱;稀疏参数衰减被放大。这破坏了权重衰减"均匀地把参数拉向零"的语义,也破坏了它与 L2 正则的等价性(在归一化坐标系下才等价)。
AdamW:解耦
AdamW(Loshchilov & Hutter 2019)把权重衰减从梯度中解耦,直接作用于参数:
θ t + 1 = θ t − η v ^ t + ϵ ⊙ m ^ t − η λ θ t \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \odot \hat{m}_t - \eta \lambda \theta_t
θ t + 1 = θ t − v ^ t + ϵ η ⊙ m ^ t − η λ θ t
权重衰减项 η λ θ t \eta \lambda \theta_t η λ θ t 不经过 v ^ t \hat{v}_t v ^ t 归一化,对所有参数一视同仁。论文同时给出收敛性论证 :解耦后的权重衰减等价于在归一化坐标系下做 L2 正则,保证与 L2 正则的理论等价性恢复;而耦合版本(Adam-L2)在数学上是不严谨的(Loshchilov & Hutter 用反例说明其收敛性质与 L2 正则不一致)。
实践证据 :AdamW 在 Transformer、BERT、GPT 系列上的一致优于 Adam-L2,且权重衰减的尺度更可解释(不再依赖各参数梯度尺度的耦合)。AdamW 已成为现代大模型训练的事实标准。
第八部分:现代实践配方
标准配置
现代深度学习训练(尤其 Transformer 系)的推荐配置:
优化器 :AdamW,β 1 = 0.9 \beta_1 = 0.9 β 1 = 0 . 9 、β 2 = 0.999 \beta_2 = 0.999 β 2 = 0 . 9 9 9 、ϵ = 1 0 − 8 \epsilon = 10^{-8} ϵ = 1 0 − 8 。
权重衰减 :λ ∈ [ 0.01 , 0.1 ] \lambda \in [0.01, 0.1] λ ∈ [ 0 . 0 1 , 0 . 1 ] ,比 SGD 时代(1 0 − 4 10^{-4} 1 0 − 4 量级)大一两个量级,因为解耦后衰减不经过归一化,作用更强。
预热(warmup) :前 T w T_w T w 步学习率从 0 线性升到峰值,T w T_w T w 通常为总步数的 1% 到 10%。动机:训练初期 Adam 的二阶矩估计不可靠,梯度方差大,直接大学习率会破坏参数初始化附近的良好结构。
余弦退火 :峰值学习率后余弦衰减到接近 0,配合 warmup 构成完整的"升-降"调度。
大 batch 训练
大 batch 下梯度噪声小,SGD + Momentum + 线性缩放规则可以与 AdamW 表现相当,同时省去二阶矩的内存开销(对超大模型重要)。实践对比:
batch 256 以下:AdamW 省心,开箱即用。
batch 1024 以上:SGD + Momentum + warmup + cosine 往往更优或相当,且显存占用更低。
梯度裁剪
当梯度范数过大(如长序列 Transformer、GAN 训练),直接裁剪梯度范数:
g t ← g t ⋅ min ( 1 , c ∥ g t ∥ ) g_t \leftarrow g_t \cdot \min\left( 1, \frac{c}{\|g_t\|} \right)
g t ← g t ⋅ min ( 1 , ∥ g t ∥ c )
裁剪保护 Adam 的矩估计不被少数异常大梯度污染,是稳定训练长程模型的标配。注意裁剪应在动量累积之前 进行,否则异常梯度会通过动量滞后传播。
第九部分:二阶方法对比与展望
牛顿法与拟牛顿
二阶方法利用 Hessian 信息,更新为 θ t + 1 = θ t − η H − 1 g t \theta_{t+1} = \theta_t - \eta H^{-1} g_t θ t + 1 = θ t − η H − 1 g t ,对条件数不敏感,但 H H H 的存储与求逆是 O ( d 2 ) O(d^2) O ( d 2 ) 与 O ( d 3 ) O(d^3) O ( d 3 ) ,深度模型(d ∼ 1 0 8 d \sim 10^8 d ∼ 1 0 8 )完全不可行。拟牛顿法(L-BFGS)用梯度历史近似 Hessian 逆,但随机化后稳定性差,实践中很少用于深度学习。
一阶方法的效率边界
一阶方法的信息论下界(Nesterov):光滑凸问题最优收敛率 O ( 1 / T 2 ) O(1/T^2) O ( 1 / T 2 ) ,NAG 已达到。强凸问题线性收敛的最优常数依赖 κ \sqrt{\kappa} κ 。任何一阶方法都无法超越这个下界 ,这是为什么"更好的优化器"只能从"利用问题结构"(稀疏性、随机性、条件数估计)而非"改进一阶信息的使用"入手。
方向
调度与采样耦合 :学习率、batch 大小、数据采样顺序联合设计(如 batch 从大到小 + 学习率从小到大)。
自适应与 SGD 的融合 :AdamW 的泛化差距催生了"在 Adam 与 SGD 之间插值"的方法(如 AdaBound、SGDP)。
优化器作为超参数 :小规模任务上搜索优化器与调度,迁移到大模型(训练配方自动化)。
总结
本文的完整推导脉络:
收敛性基础 :L-光滑与强凸定义梯度下降的线性收敛,条件数 κ \kappa κ 是核心障碍。
SGD :小批量带来无偏但含噪的梯度,收敛率降至 O ( 1 / T ) O(1/T) O ( 1 / T ) ,批量与学习率耦合。
动量与 NAG :历史梯度累积把条件数影响从 κ \kappa κ 降到 κ \sqrt{\kappa} κ ,NAG 达到一阶最优速率。
自适应家族 :Adagrad 累积平方、RMSProp 滑动平均、Adam 双矩估计加偏差修正,逐参数自适应尺度。
AdamW :权重衰减与自适应归一化解耦,恢复 L2 等价性,成为现代标准。
核心结论:优化器的演进是"修补梯度估计缺陷"的过程 。方向缺陷用动量修,尺度缺陷用自适应修,初始化缺陷用偏差修正修,正则化缺陷用解耦修。理解每个修正在修什么,比记住更新公式更有价值。
参考
[1] Robbins, H., & Monro, S. A Stochastic Approximation Method. Annals of Mathematical Statistics, 22(3):400-407, 1951.
[2] Polyak, B. T. Some Methods of Speeding Up the Convergence of Iteration Methods. USSR Computational Mathematics and Mathematical Physics, 4(5):1-17, 1964.
[3] Nesterov, Y. A Method for Unconstrained Convex Minimization Problem with the Rate of Convergence O ( 1 / k 2 ) O(1/k^2) O ( 1 / k 2 ) . Doklady AN USSR, 269:543-547, 1983.
[4] Duchi, J., Hazan, E., & Singer, Y. Adaptive Subgradient Methods for Online Learning and Stochastic Optimization. JMLR, 12:2121-2159, 2011.
[5] Tieleman, T., & Hinton, G. RMSProp: Divide the Gradient by a Running Average of Its Recent Magnitude. COURSERA Neural Networks Lecture, 2012.
[6] Kingma, D. P., & Ba, J. Adam: A Method for Stochastic Optimization. ICLR 2015.
[7] Reddi, S. J., Kale, S., & Kumar, S. On the Convergence of Adam and Beyond. ICLR 2018.
[8] Loshchilov, I., & Hutter, F. Decoupled Weight Decay Regularization. ICLR 2019.
[9] Sutskever, I., Martens, J., Dahl, G., & Hinton, G. On the Importance of Initialization and Momentum in Deep Learning. ICML 2013.
[10] Goh, G. Why Momentum Really Works. Distill, 2017.
[11] Ruder, S. An Overview of Gradient Descent Optimization Algorithms. arXiv:1609.04747, 2016.
[12] Nesterov, Y. Introductory Lectures on Convex Optimization: A Basic Course. Springer, 2004.
[13] Goyal, P., et al. Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour. arXiv:1706.02677, 2017.
[14] Loshchilov, I., & Hutter, F. SGDR: Stochastic Gradient Descent with Warm Restarts. ICLR 2017.
[15] Zhang, M. R., et al. Fixup Initialization: Residual Learning without Normalization. ICLR 2019.