跳到主要内容

反向传播与梯度下降

问题

反向传播算法的原理是什么?常用的优化器(SGD、Adam 等)有什么区别?学习率调度策略有哪些?

答案

一、反向传播算法

反向传播(Backpropagation) 是计算神经网络中损失函数对每个参数梯度的算法,基于链式法则(Chain Rule)

链式法则

假设一个简单的两层网络:y^=f(W2g(W1x+b1)+b2)\hat{y} = f(W_2 \cdot g(W_1 \cdot x + b_1) + b_2)

损失 LLW1W_1 的梯度需要通过链式法则逐层传递:

LW1=Ly^y^hhW1\frac{\partial L}{\partial W_1} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial h} \cdot \frac{\partial h}{\partial W_1}

梯度从输出层反向传播到输入层,每层的梯度是后续层梯度的累乘——这就是"反向传播"名字的由来。

梯度消失/爆炸

由于梯度是逐层累乘的:

  • 如果每层梯度 < 1(如 Sigmoid 的梯度最大 0.25),经过多层后梯度趋近于 0 → 梯度消失
  • 如果每层梯度 > 1,经过多层后梯度会指数增长 → 梯度爆炸

这是深层网络难以训练的核心挑战,也是 ReLU、残差连接等技术的动机。

二、优化器

SGD(随机梯度下降)

θt+1=θtηgt\theta_{t+1} = \theta_t - \eta \cdot g_t

最基础的优化器。加入动量(Momentum) 可以加速收敛、减少震荡:

vt=βvt1+gt;θt+1=θtηvtv_t = \beta v_{t-1} + g_t \quad ; \quad \theta_{t+1} = \theta_t - \eta \cdot v_t

动量 β\beta 通常取 0.9,让参数更新有"惯性",不会因单次梯度噪声大幅偏向。

Adam(Adaptive Moment Estimation)

Adam 结合了动量自适应学习率

mt=β1mt1+(1β1)gt(一阶矩/均值)m_t = \beta_1 m_{t-1} + (1-\beta_1)g_t \quad \text{(一阶矩/均值)} vt=β2vt1+(1β2)gt2(二阶矩/方差)v_t = \beta_2 v_{t-1} + (1-\beta_2)g_t^2 \quad \text{(二阶矩/方差)} θt+1=θtηm^tv^t+ϵ\theta_{t+1} = \theta_t - \eta \cdot \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon}
优化器特点适用场景
SGD收敛慢,但泛化好训练成熟的 CV 模型
SGD + Momentum加速收敛,减少震荡通用
Adam自适应学习率,收敛快大多数深度学习任务
AdamWAdam + 解耦权重衰减Transformer 训练首选
LAMB大 batch 训练分布式训练
实践建议
  • NLP / Transformer:AdamW(β1=0.9,β2=0.999\beta_1=0.9, \beta_2=0.999)是默认选择
  • CV / CNN:SGD + Momentum 有时泛化更好
  • LLM 预训练:AdamW + Warmup + 余弦退火

三、学习率调度

学习率在训练过程中通常不是固定的——前期需要较大学习率快速收敛,后期需要较小学习率精细调整。

调度策略说明
Step Decay每隔 N 个 epoch 乘以 0.1
Cosine Annealing余弦函数从高到低平滑衰减
Warmup前 N 步从 0 线性增长到目标学习率
Warmup + Cosine先 Warmup 再余弦退火,LLM 训练标配
OneCycleLR先升后降,单周期内完成训练
ReduceOnPlateau验证 Loss 不降时自动降低学习率

四、梯度裁剪

防止梯度爆炸的常用方法——限制梯度的最大范数:

if g>max_norm:g=max_normgg\text{if } \|\mathbf{g}\| > \text{max\_norm}: \quad \mathbf{g} = \frac{\text{max\_norm}}{\|\mathbf{g}\|} \cdot \mathbf{g}

LLM 训练中,梯度裁剪的 max_norm 通常设为 1.0。


常见面试问题

Q1: 为什么 Adam 比 SGD 收敛更快?

答案

Adam 有两个优势:

  1. 动量(一阶矩):利用历史梯度方向,减少震荡
  2. 自适应学习率(二阶矩):对每个参数维护独立的学习率——梯度大的参数用小学习率,梯度小的参数用大学习率

但 Adam 有时泛化不如 SGD,因为自适应学习率可能导致模型收敛到较"尖锐"的极小值(泛化不好),而 SGD 更倾向于找到"平坦"的极小值。

Q2: 什么是 Warmup?为什么需要?

答案

Warmup 是在训练最初几步使用很小的学习率,然后逐步增大到目标值。原因:

  • 训练初期模型参数是随机的,梯度方向不可靠
  • 如果一开始就用大学习率,可能导致参数大幅偏移,训练不稳定
  • Adam 的二阶矩估计在初期不准确,需要积累

LLM 训练通常 warmup 前 1-5% 的训练步数。

Q3: 局部最优和鞍点有什么区别?在高维空间中哪个更常见?

答案

  • 局部最优:所有方向上都是极小值
  • 鞍点:某些方向是极小值,某些方向是极大值

在高维空间中,鞍点远比局部最优常见——因为要在所有维度上同时是极小值的概率极低。现代研究认为,深度学习训练中的主要挑战不是局部最优,而是鞍点和平坦区域(梯度接近零)。

动量和自适应学习率可以帮助逃离鞍点。

Q4: AdamW 和 Adam 的区别是什么?

答案

Adam 中的权重衰减(L2 正则化)与自适应学习率耦合在一起——梯度大的参数权重衰减弱,梯度小的参数权重衰减强。这不符合正则化的初衷。

AdamW 将权重衰减从梯度更新中解耦:

θt+1=θtη(m^tv^t+ϵ+λθt)\theta_{t+1} = \theta_t - \eta \left(\frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} + \lambda \theta_t\right)

AdamW 让权重衰减独立于梯度自适应,正则化效果更好,是 Transformer/LLM 训练的标准优化器。


相关链接