梯度下降(Gradient Descent)是机器学习中最基础、最核心的优化算法。它是训练几乎所有神经网络和线性模型的基石——从简单的线性回归到拥有数千亿参数的 GPT 模型,其底层驱动的核心思想都是梯度下降。理解梯度下降,是理解 SGD、Adam、Preconditioner 等一切优化方法的前提。
梯度下降的数学直觉非常简单:想象你站在一座山的某个位置,四周一片漆黑,你只能感受到脚下的坡度。你想尽快到达山底,最佳策略就是沿着当前最陡的方向迈出一步 ,然后重新感知方向,继续迈步。
在数学上,这个"最陡的方向"就是目标函数的负梯度方向 。对于可微函数 f ( x ) f(x)f ( x ) ,在点 x 0 x_0x 0 处的梯度 ∇ f ( x 0 ) \nabla f(x_0)∇ f ( x 0 ) 指向函数值增加最快的方向,而 − ∇ f ( x 0 ) -\nabla f(x_0)− ∇ f ( x 0 ) 指向函数值下降最快的方向 。
假设我们要最小化一个简单的一元函数:
f ( x ) = x 2 − 4 x + 5 f(x) = x^2 - 4x + 5
f ( x ) = x 2 − 4 x + 5
这是一个开口向上的抛物线,最小值在 x = 2 x = 2x = 2 处(因为 f ′ ( x ) = 2 x − 4 = 0 f'(x) = 2x - 4 = 0f ′ ( x ) = 2 x − 4 = 0 给出 x = 2 x = 2x = 2 )。梯度就是导数 f ′ ( x ) = 2 x − 4 f'(x) = 2x - 4f ′ ( x ) = 2 x − 4 。
从初始点 x 0 = 0 x_0 = 0x 0 = 0 开始,学习率 η = 0.1 \eta = 0.1η = 0.1 ,我们逐轮演示:
轮次
当前 x xx
梯度 f ′ ( x ) = 2 x − 4 f'(x) = 2x - 4f ′ ( x ) = 2 x − 4
更新: x ← x − η ⋅ ∇ f ( x ) x \leftarrow x - \eta \cdot \nabla f(x)x ← x − η ⋅ ∇ f ( x )
函数值 f ( x ) f(x)f ( x )
0
0
− 4 -4− 4
0 − 0.1 × ( − 4 ) = 0.4 0 - 0.1 \times (-4) = 0.40 − 0.1 × ( − 4 ) = 0.4
5.0
1
0.4
− 3.2 -3.2− 3.2
0.4 − 0.1 × ( − 3.2 ) = 0.72 0.4 - 0.1 \times (-3.2) = 0.720.4 − 0.1 × ( − 3.2 ) = 0.72
3.56
2
0.72
− 2.56 -2.56− 2.56
0.72 − 0.1 × ( − 2.56 ) = 0.976 0.72 - 0.1 \times (-2.56) = 0.9760.72 − 0.1 × ( − 2.56 ) = 0.976
2.88
3
0.976
− 2.048 -2.048− 2.048
0.976 − 0.1 × ( − 2.048 ) = 1.181 0.976 - 0.1 \times (-2.048) = 1.1810.976 − 0.1 × ( − 2.048 ) = 1.181
2.53
… \dots…
… \dots…
… \dots…
… \dots…
… \dots…
10
1.786
− 0.428 -0.428− 0.428
1.786 − 0.1 × ( − 0.428 ) = 1.829 1.786 - 0.1 \times (-0.428) = 1.8291.786 − 0.1 × ( − 0.428 ) = 1.829
2.03
20
1.972
− 0.056 -0.056− 0.056
1.972 − 0.1 × ( − 0.056 ) = 1.978 1.972 - 0.1 \times (-0.056) = 1.9781.972 − 0.1 × ( − 0.056 ) = 1.978
2.0005
可以看到,随着迭代进行,梯度(斜率)越来越接近零,x xx 逐渐逼近最优值 2,函数值趋近于最小值 1(f ( 2 ) = 2 2 − 4 × 2 + 5 = 1 f(2) = 2^2 - 4 \times 2 + 5 = 1f ( 2 ) = 2 2 − 4 × 2 + 5 = 1 )。
对于一般的模型参数优化问题,梯度下降的更新规则可以统一写成:
参数更新公式:
θ t + 1 = θ t − η ⋅ ∇ θ J ( θ t ) \theta_{t+1} = \theta_t - \eta \cdot \nabla_\theta J(\theta_t)
θ t + 1 = θ t − η ⋅ ∇ θ J ( θ t )
其中:
θ t \theta_tθ t 是第 t tt 步的模型参数向量
η \etaη 是学习率(步长),控制每一步的大小
∇ θ J ( θ t ) \nabla_\theta J(\theta_t)∇ θ J ( θ t ) 是损失函数 J JJ 对参数 θ \thetaθ 在 θ t \theta_tθ t 处的梯度
负号表示朝着梯度相反(下降)的方向更新
假设我们要拟合线性回归 y = w 1 x + w 0 y = w_1 x + w_0y = w 1 x + w 0 ,损失函数是均方误差(MSE)。对于两个参数 w 0 , w 1 w_0, w_1w 0 , w 1 ,梯度是两个偏导数的向量:
∇ J = [ ∂ J ∂ w 0 , ∂ J ∂ w 1 ] T \nabla J = \left[ \frac{\partial J}{\partial w_0}, \frac{\partial J}{\partial w_1} \right]^T
∇ J = [ ∂ w 0 ∂ J , ∂ w 1 ∂ J ] T
给出训练数据 ( x , y ) (x, y)( x , y ) 为 ( 1 , 2 ) , ( 2 , 4 ) , ( 3 , 6 ) (1, 2), (2, 4), (3, 6)( 1 , 2 ) , ( 2 , 4 ) , ( 3 , 6 ) (即 y = 2 x y = 2xy = 2 x ,完美线性),初始猜测 w 0 = 0 , w 1 = 0 w_0 = 0, w_1 = 0w 0 = 0 , w 1 = 0 :
J = 1 3 ∑ i = 1 3 ( w 1 x i + w 0 − y i ) 2 J = \frac{1}{3} \sum_{i=1}^3 (w_1 x_i + w_0 - y_i)^2
J = 3 1 i = 1 ∑ 3 ( w 1 x i + w 0 − y i ) 2
计算梯度方向后更新两个参数:
轮次
w 0 w_0w 0
w 1 w_1w 1
MSE
方向
0
0
0
18.67
起始
1
0.53
1.87
2.89
快速下降
5
0.01
1.97
0.008
接近最优
10
≈ 0 \approx 0≈ 0
≈ 2 \approx 2≈ 2
≈ 0 \approx 0≈ 0
收敛
根据每次更新使用的数据量,梯度下降分为三个主要变体:
变体
每次更新使用的数据量
每轮计算量
收敛稳定性
典型应用场景
批量梯度下降(BGD)
全部数据
高
非常稳定
小数据集(< 10k 样本)
随机梯度下降(SGD)
单个样本
低
震荡大
在线学习、大规模数据
小批量梯度下降(Mini-batch GD)
一个小批量(如 32-512)
中
较好
深度学习标准做法
遍历全部训练数据,计算平均梯度后一次更新。
优点 :梯度方向准确,收敛稳定,易于并行化。
缺点 :数据量大时每轮计算极慢,无法用于在线学习。
伪代码:
for epoch in range(max_epochs):
gradient = average_gradient(θ, all_training_data) # 遍历全部数据
θ = θ - η × gradient
每看到一个样本就更新一次参数。
优点 :计算快,适合大数据,引入噪声有助于跳出局部最优。
缺点 :梯度方向噪声大,收敛路径震荡严重,需要逐渐减小学习率。
伪代码:
for epoch in range(max_epochs):
shuffle(training_data)
for (x_i, y_i) in training_data: # 逐个样本
gradient = compute_gradient(θ, x_i, y_i)
θ = θ - η × gradient
深度学习事实上唯一使用的模式。每次使用一个小批量(batch)的样本来计算梯度。
伪代码:
for epoch in range(max_epochs):
shuffle(training_data)
for batch in split(training_data, batch_size=32):
gradient = average_gradient(θ, batch)
θ = θ - η × gradient
小批量大小的选择对训练有重要影响。结合各种主流模型的经验:
批量大小
内存需求
收敛速度
泛化能力
适用模型
1 (SGD)
极低
慢但震荡
通常最好
在线学习
16-64
低
快
好
CNN、小型模型
128-256
中
很快
较好
典型 ResNet/BERT
512-1024
高
非常快
可能变差
分布式大规模训练
4096+
极高
最快(需调整LR)
常需特殊策略
LARS/LAMB优化器
学习率 η \etaη 决定了每步走多远。选择不当会导致严重后果:
现象 :收敛极慢,下图中绿色路径
后果 :可能需要上万轮才能达到最优
诊断 :损失曲线缓慢单调下降
现象 :损失值震荡甚至发散,下图中红色路径
后果 :梯度可能跨过谷底跳上对面的山坡,越跳越高
诊断 :损失曲线上下剧烈震荡或持续增大
现象 :单调下降后收敛,下图中蓝色路径
诊断 :损失值每轮持续下降
以 f ( x ) = x 2 f(x)=x^2f ( x ) = x 2 、初始点 x = 3 x=3x = 3 为例演示不同学习率的效果:
学习率 η \etaη
第1步
第2步
第3步
第5步
第10步
最终状态
0.01
2.94
2.88
2.82
2.66
2.01
缓慢收敛
0.1
2.4
1.92
1.54
0.79
0.10
正常收敛
0.5
0.0
0.0
0.0
0.0
0.0
一步到达最优
1.0
-3.0
3.0
-3.0
3.0
-3.0
两端震荡
1.1
-3.3
3.63
-3.99
5.34
-15.72
发散
可以看到,对于 f ( x ) = x 2 f(x)=x^2f ( x ) = x 2 ,η = 0.5 \eta=0.5η = 0.5 恰好是最优值(直接跳到 x = 0 x=0x = 0 );η ≥ 1 \eta \geq 1η ≥ 1 时出现震荡或发散。
初始值 :通常在 0.01 到 0.001 之间尝试
对数搜索 :尝试 [1, 0.1, 0.01, 0.001, 0.0001],看哪个损失下降最快
学习率范围测试(LR Range Test) :在一轮内从小到大学步率,观察损失变化,选择下降最快的区间
自适应方法 :使用 Adam、RMSprop 等自适应优化器可以大幅降低调参难度
非凸函数(如神经网络的损失曲面)存在大量局部极小值、鞍点和平坦区域。
解决方案 :使用 SGD 的随机性、动量方法、以及 Adam 等自适应优化器。
在高维空间中,鞍点(saddle point)比局部极小值更常见。在鞍点处,梯度为零,但某些方向仍可下降。纯梯度下降会在鞍点停滞,因为它看不到"下降方向"。
特性
局部极小值
鞍点
梯度
零
零
Hessian 特征值
全部为正
有正有负
梯度下降行为
被困但可跳出(加噪声)
容易被困
在深度学习中的频率
较少
非常常见
解决方案 :动量法(Momentum)可以冲出鞍点区域。
深度网络中,链式法则导致梯度逐层相乘。对于 Sigmoid 激活函数,梯度在 0.25 以下,经过多层后会指数级衰减到接近零。
前向传播:a ( l ) = σ ( z ( l ) ) , z ( l ) = W ( l ) a ( l − 1 ) + b ( l ) a^{(l)} = \sigma(z^{(l)}), z^{(l)} = W^{(l)} a^{(l-1)} + b^{(l)}a ( l ) = σ ( z ( l ) ) , z ( l ) = W ( l ) a ( l − 1 ) + b ( l )
反向传播:∂ L ∂ W ( l ) = ∂ L ∂ a ( L ) ⋅ σ ′ ( z ( L ) ) W ( L ) ⋅ ⋯ ⋅ σ ′ ( z ( l ) ) a ( l − 1 ) \frac{\partial L}{\partial W^{(l)}} = \frac{\partial L}{\partial a^{(L)}} \cdot \sigma'(z^{(L)})W^{(L)} \cdot \dots \cdot \sigma'(z^{(l)})a^{(l-1)}∂ W ( l ) ∂ L = ∂ a ( L ) ∂ L ⋅ σ ′ ( z ( L ) ) W ( L ) ⋅ ⋯ ⋅ σ ′ ( z ( l ) ) a ( l − 1 )
假设 σ ′ ( z ) ≈ 0.2 \sigma'(z) \approx 0.2σ ′ ( z ) ≈ 0.2 (Sigmoid 的典型值),W ( l ) ≈ 1 W^{(l)} \approx 1W ( l ) ≈ 1 ,50 层后梯度衰减为 0.2 50 ≈ 10 − 35 0.2^{50} \approx 10^{-35}0. 2 50 ≈ 1 0 − 35 ,完全失效。
解决方案 :ReLU 激活函数、残差连接(ResNet)、批量归一化(Batch Normalization)。
当损失函数在不同方向上的曲率差异很大时(即 Hessian 矩阵的条件数大),梯度下降会在窄谷中来回震荡:
考虑 f ( x , y ) = 0.05 x 2 + y 2 f(x, y) = 0.05 x^2 + y^2f ( x , y ) = 0.05 x 2 + y 2 (x 方向平缓,y 方向陡峭),初始点 (15, 1):
轮次 x y 损失值
0 15.00 1.00 12.25
1 13.50 0.80 9.95
2 12.15 0.64 8.09
3 10.94 0.51 6.66
...
10 5.28 0.11 1.41
20 2.13 0.01 0.23
50 0.42 ~0 0.01
可以看到 x 方向收敛极慢(每次减少 10%),而 y 方向快速收敛。这就是条件数问题 的表现。
解决方案 :动量法(Momentum)、自适应学习率方法(AdaGrad, RMSprop, Adam)、牛顿法(利用二阶信息)。
动量法模拟物理中的惯性:更新方向不仅取决于当前梯度,还累积了历史梯度。
v t + 1 = β v t + ∇ θ J ( θ t ) v_{t+1} = \beta v_t + \nabla_\theta J(\theta_t)
v t + 1 = β v t + ∇ θ J ( θ t )
θ t + 1 = θ t − η v t + 1 \theta_{t+1} = \theta_t - \eta v_{t+1}
θ t + 1 = θ t − η v t + 1
其中 β \betaβ 是动量系数(通常 0.9),v t v_tv t 是速度向量。
Nesterov 动量先"展望"一步,然后在展望点计算梯度:
v t + 1 = β v t + ∇ θ J ( θ t − β η v t ) v_{t+1} = \beta v_t + \nabla_\theta J(\theta_t - \beta \eta v_t)
v t + 1 = β v t + ∇ θ J ( θ t − β η v t )
θ t + 1 = θ t − η v t + 1 \theta_{t+1} = \theta_t - \eta v_{t+1}
θ t + 1 = θ t − η v t + 1
以穿越鞍点场景为例:
方法
到达鞍点位置
通过鞍点所需时间
最终收敛位置
无动量 SGD
(0, 0) — 停滞
无限(无法通过)
困在鞍点
Momentum (β = 0.9 \beta = 0.9β = 0.9 )
(0, 0)
约 100 步
(-0.5, -0.5)
Nesterov (β = 0.9 \beta = 0.9β = 0.9 )
(0, 0)
约 60 步
(-0.5, -0.5)
在实际训练中,动量通常能加速 2-5 倍收敛速度,并在高条件数问题上显著改善稳定性。
为每个参数单独调整学习率,对稀疏特征频繁出现的参数降低学习率,对稀疏特征稀有出现的参数保持高学习率:
θ t + 1 = θ t − η G t + ϵ ⊙ ∇ θ J ( θ t ) \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{G_t + \epsilon}} \odot \nabla_\theta J(\theta_t)
θ t + 1 = θ t − G t + ϵ η ⊙ ∇ θ J ( θ t )
其中 G t = ∑ i = 1 t ( ∇ θ J ( θ i ) ) 2 G_t = \sum_{i=1}^t (\nabla_\theta J(\theta_i))^2G t = ∑ i = 1 t ( ∇ θ J ( θ i ) ) 2 是历史梯度平方和,ϵ \epsilonϵ 是防止除零的小常数。
优点 :无需手动调节学习率,适合稀疏数据(如 NLP、推荐系统)。
缺点 :学习率单调递减,训练后期可能停止学习。
解决 AdaGrad 学习率递减过快问题,使用指数滑动平均而非累加:
E [ g 2 ] t = β E [ g 2 ] t − 1 + ( 1 − β ) ( ∇ θ J ( θ t ) ) 2 E[g^2]_t = \beta E[g^2]_{t-1} + (1 - \beta)(\nabla_\theta J(\theta_t))^2
E [ g 2 ] t = β E [ g 2 ] t − 1 + ( 1 − β ) ( ∇ θ J ( θ t ) ) 2
θ t + 1 = θ t − η E [ g 2 ] t + ϵ ∇ θ J ( θ t ) \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{E[g^2]_t + \epsilon}} \nabla_\theta J(\theta_t)
θ t + 1 = θ t − E [ g 2 ] t + ϵ η ∇ θ J ( θ t )
典型的 β = 0.9 \beta = 0.9β = 0.9 (衰减率),η = 0.001 \eta = 0.001η = 0.001 。RMSprop 在 RNN 等序列模型中表现尤为出色。
结合动量(一阶矩)和 RMSprop(二阶矩),是目前最广泛使用的优化器:
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 2 v_t = \beta_2 v_{t-1} + (1 - \beta_2)g_t^2
v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2
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
θ t + 1 = θ t − η v ^ t + ϵ m ^ t \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_t
θ t + 1 = θ t − v ^ t + ϵ η m ^ t
其中 g t = ∇ θ J ( θ t ) g_t = \nabla_\theta J(\theta_t)g t = ∇ θ J ( θ t ) ,默认参数 β 1 = 0.9 \beta_1 = 0.9β 1 = 0.9 , β 2 = 0.999 \beta_2 = 0.999β 2 = 0.999 , ϵ = 10 − 8 \epsilon = 10^{-8}ϵ = 1 0 − 8 , η = 0.001 \eta = 0.001η = 0.001 。
特性
SGD
SGD+Momentum
AdaGrad
RMSprop
Adam
自适应LR
否
否
是
是
是
动量
否
标准
否
否
自适应
稀疏梯度处理
差
差
好
中
好
鞍点处理
差
好
中
好
好
默认学习率
0.01
0.01
0.01
0.001
0.001
敏感度
高
高
低
中
低
泛化能力
好
好
中
中
较好
训练速度
慢
中
快
快
最快
对于凸函数(严格凸的 L LL -smooth 函数),批量梯度下降可保证:
J ( θ T ) − J ( θ ∗ ) ≤ ∥ θ 0 − θ ∗ ∥ 2 2 η T J(\theta_T) - J(\theta^*) \leq \frac{\|\theta_0 - \theta^*\|^2}{2\eta T}
J ( θ T ) − J ( θ ∗ ) ≤ 2 η T ∥ θ 0 − θ ∗ ∥ 2
其中 θ ∗ \theta^*θ ∗ 是全局最优解,T TT 是迭代步数。这意味着要达到精度 ϵ \epsilonϵ ,需要 O ( 1 / ϵ ) O(1/\epsilon)O ( 1/ ϵ ) 步。
对于强凸函数(μ \muμ -strongly convex),收敛速度更快(线性收敛):
J ( θ T ) − J ( θ ∗ ) ≤ ( 1 − μ L ) T ( J ( θ 0 ) − J ( θ ∗ ) ) J(\theta_T) - J(\theta^*) \leq \left(1 - \frac{\mu}{L}\right)^T (J(\theta_0) - J(\theta^*))
J ( θ T ) − J ( θ ∗ ) ≤ ( 1 − L μ ) T ( J ( θ 0 ) − J ( θ ∗ ))
其中 L LL 是 Lipschitz 常数,μ \muμ 是强凸参数。比值 κ = L / μ \kappa = L/\muκ = L / μ 称为条件数,决定了收敛速度。
深度学习损失函数是非凸的,理论保证较弱。实际经验表明:
神经网络的损失函数中,大部分局部极小值在泛化性能上接近全局最优 (Choromanska et al., 2015)
高维空间中,鞍点而非局部极小值是主要障碍 (Dauphin et al., 2014)
随机梯度下降的噪声有助于逃离鞍点
深度学习中优化找到好的局部极小值 比追求全局最优更实际
SGD 在非凸优化下的标准结论(Ghadimi & Lan, 2013):
1 T ∑ t = 1 T E [ ∥ ∇ J ( θ t ) ∥ 2 ] ≤ O ( 1 T ) \frac{1}{T}\sum_{t=1}^T \mathbb{E}[\|\nabla J(\theta_t)\|^2] \leq O\left(\frac{1}{\sqrt{T}}\right)
T 1 t = 1 ∑ T E [ ∥∇ J ( θ t ) ∥ 2 ] ≤ O ( T 1 )
即经过 T TT 步后,梯度范数的期望以 O ( 1 / T ) O(1/\sqrt{T})O ( 1/ T ) 速率收敛到零。这意味着线性收敛速率 (误差随迭代步数倒数平方根衰减)。
小批量梯度下降的收敛速度与批量大小的关系并非线性:
批量大小
每步时间(假设)
达到精度 ϵ \epsilonϵ 所需的步数
总时间
1 (SGD)
1x
10000
10000x
32
2x
800
1600x
128
3x
400
1200x
512
5x
300
1500x
2048
10x
250
2500x
注意:批量从 1 增加到 128 时,每步时间只增加约 3 倍,但步数减少 25 倍,因此总时间大幅减少 。但继续增大批量的收益递减。
实际训练中很少使用固定学习率。常见调度策略:
策略
更新规则
典型应用
Step Decay
每 N 轮乘以系数 γ \gammaγ (如每 30 轮 × 0.1 \times 0.1× 0.1 )
经典 CNN 训练
Exponential Decay
η t = η 0 ⋅ e − k t \eta_t = \eta_0 \cdot e^{-kt}η t = η 0 ⋅ e − k t
渐进收敛
Cosine Annealing
η t = η min + 1 2 ( η max − η min ) ( 1 + cos ( t T π ) ) \eta_t = \eta_{\min} + \frac{1}{2}(\eta_{\max} - \eta_{\min})(1 + \cos(\frac{t}{T}\pi))η t = η m i n + 2 1 ( η m a x − η m i n ) ( 1 + cos ( T t π ))
现代深度学习(SGD with warm restarts)
Warmup
前 N 步从 0 线性增加到 η 0 \eta_0η 0
Transformer/BERT 训练
Reduce on Plateau
验证损失停止下降时减半
通用策略
具体例子 :Warmup + Cosine Decay 是当前最流行的组合,广泛用于 Transformer 和 LLM 训练:
预热阶段(前 4000 步):η 从 0 线性增加到 η_max
余弦退火阶段(4000-50000 步):η 按余弦曲线从 η_max 下降到 η_min
其中 Transformer 论文中的特殊形式(Noam Scheduler):
η t = η 0 ⋅ min ( t − 0.5 , t ⋅ warmup_steps − 1.5 ) \eta_t = \eta_0 \cdot \min(t^{-0.5}, t \cdot \text{warmup\_steps}^{-1.5})
η t = η 0 ⋅ min ( t − 0.5 , t ⋅ warmup_steps − 1.5 )
这个调度在训练初期线性增长(预热),之后按 1 / t 1/\sqrt{t}1/ t 衰减。
时期
代表性模型
主要优化器
学习率
核心挑战
1980s-2000s
LeNet、浅层网络
SGD (手动调LR)
0.01-0.1
梯度消失、局部极小
2010-2013
AlexNet、小型CNN
SGD + Momentum
0.01
大规模数据训练慢
2014-2016
VGG、GoogLeNet
SGD + Momentum
0.01-0.1
需要精细调参
2015-2017
ResNet、LSTM
Adam/RMSprop
0.001
自适应优化兴起
2017-2020
Transformer、BERT
Adam/AdamW
0.0001(预热)
大规模分布式训练
2020至今
GPT-3/4、LLaMA
AdamW
0.0001-0.001
数十万 GPU 分布式训练
Loshchilov & Hutter (2019) 指出 Adam 的权重衰减实现有误,提出 AdamW:
标准 Adam 的 L2 正则 :J reg ( θ ) = J ( θ ) + λ 2 ∥ θ ∥ 2 J_{\text{reg}}(\theta) = J(\theta) + \frac{\lambda}{2}\|\theta\|^2J reg ( θ ) = J ( θ ) + 2 λ ∥ θ ∥ 2 (与梯度混合)
AdamW :权重衰减与梯度更新解耦,θ t + 1 = θ t − η ( m ^ t / ( v ^ t + ϵ ) + λ θ t ) \theta_{t+1} = \theta_t - \eta(\hat{m}_t/(\sqrt{\hat{v}_t} + \epsilon) + \lambda\theta_t)θ t + 1 = θ t − η ( m ^ t / ( v ^ t + ϵ ) + λ θ t )
这一改进使得 AdamW 在 ImageNet 等基准上的泛化性能显著优于原始 Adam,目前是 LLM 训练的标准选择。
当梯度爆炸时(尤其是 RNN/LSTM 训练),按阈值缩放梯度向量:
g ← g max ( 1 , ∥ g ∥ / clip_threshold ) g \leftarrow \frac{g}{\max(1, \|g\|/\text{clip\_threshold})}
g ← max ( 1 , ∥ g ∥/ clip_threshold ) g
如果 ∥ g ∥ > clip_threshold \|g\| > \text{clip\_threshold}∥ g ∥ > clip_threshold ,则 g ← clip_threshold ⋅ g / ∥ g ∥ g \leftarrow \text{clip\_threshold} \cdot g / \|g\|g ← clip_threshold ⋅ g /∥ g ∥ ,否则不变。
典型阈值 :0.5 到 10.0。这确保了每步更新不会太大,同时保留了梯度方向。
场景
推荐优化器
理由
新手入门、快速迭代
Adam
默认参数即可工作,无需调参
视觉任务(CNN)
SGD + Momentum
更好的泛化性能
序列模型(RNN/LSTM)
RMSprop
梯度裁剪配合良好
Transformer/LLM
AdamW
权重衰减与自适应LR最优组合
推荐系统(稀疏特征)
AdaGrad
处理稀疏梯度最有效
分布式大规模训练
LARS/LAMB
大 batch size 下仍稳定
损失曲线 :不应剧烈震荡或持续上升
梯度范数 :∥ ∇ J ∥ \|\nabla J\|∥∇ J ∥ 通常在 10 − 3 10^{-3}1 0 − 3 到 10 2 10^21 0 2 之间
参数范数 :异常的 ∥ θ t ∥ \|\theta_t\|∥ θ t ∥ 增长可能提示梯度爆炸
学习率 :如果损失突然不再下降,尝试降低学习率
验证集性能 :防止过拟合,决定是否早停
损失不下降 → 学习率太小或梯度消失
损失发散 → 学习率太大或梯度爆炸
损失震荡 → 批量太小或学习率过大
训练准确率高但验证低 → 过拟合
两者都低 → 欠拟合或模型容量不够
Ruder, S. (2016). An overview of gradient descent optimization algorithms. arXiv:1609.04747.
Kingma, D. P., & Ba, J. (2015). Adam: A method for stochastic optimization. ICLR 2015.
Sutskever, I., et al. (2013). On the importance of initialization and momentum in deep learning. ICML 2013.
Loshchilov, I., & Hutter, F. (2019). Decoupled weight decay regularization. ICLR 2019.
Ghadimi, S., & Lan, G. (2013). Stochastic first-and zeroth-order methods for nonconvex stochastic programming. SIAM Journal on Optimization.
Dauphin, Y., et al. (2014). Identifying and attacking the saddle point problem in high-dimensional non-convex optimization. NeurIPS 2014.
Smith, L. N. (2017). Cyclical learning rates for training neural networks. WACV 2017.
Duchi, J., Hazan, E., & Singer, Y. (2011). Adaptive subgradient methods for online learning and stochastic optimization. JMLR.
Tieleman, T., & Hinton, G. (2012). Lecture 6.5—RMSprop. COURSERA: Neural networks for machine learning.
Choromanska, A., et al. (2015). The loss surfaces of multilayer networks. AISTATS 2015.