反向传播与梯度下降
问题
反向传播算法的原理是什么?常用的优化器(SGD、Adam 等)有什么区别?学习率调度策略有哪些?
答案
一、反向传播算法
反向传播(Backpropagation) 是计算神经网络中损失函数对每个参数梯度的算法,基于链式法则(Chain Rule)。
链式法则
假设一个简单的两层网络:
损失 对 的梯度需要通过链式法则逐层传递:
梯度从输出层反向传播到输入层,每层的梯度是后续层梯度的累乘——这就是"反向传播"名字的由来。
由于梯度是逐层累乘的:
- 如果每层梯度 < 1(如 Sigmoid 的梯度最大 0.25),经过多层后梯度趋近于 0 → 梯度消失
- 如果每层梯度 > 1,经过多层后梯度会指数增长 → 梯度爆炸
这是深层网络难以训练的核心挑战,也是 ReLU、残差连接等技术的动机。
二、优化器
SGD(随机梯度下降)
最基础的优化器。加入动量(Momentum) 可以加速收敛、减少震荡:
动量 通常取 0.9,让参数更新有"惯性",不会因单次梯度噪声大幅偏向。
Adam(Adaptive Moment Estimation)
Adam 结合了动量和自适应学习率:
| 优化器 | 特点 | 适用场景 |
|---|---|---|
| SGD | 收敛慢,但泛化好 | 训练成熟的 CV 模型 |
| SGD + Momentum | 加速收敛,减少震荡 | 通用 |
| Adam | 自适应学习率,收敛快 | 大多数深度学习任务 |
| AdamW | Adam + 解耦权重衰减 | Transformer 训练首选 |
| LAMB | 大 batch 训练 | 分布式训练 |
- NLP / Transformer:AdamW()是默认选择
- 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 不降时自动降低学习率 |
四、梯度裁剪
防止梯度爆炸的常用方法——限制梯度的最大范数:
LLM 训练中,梯度裁剪的 max_norm 通常设为 1.0。
常见面试问题
Q1: 为什么 Adam 比 SGD 收敛更快?
答案:
Adam 有两个优势:
- 动量(一阶矩):利用历史梯度方向,减少震荡
- 自适应学习率(二阶矩):对每个参数维护独立的学习率——梯度大的参数用小学习率,梯度小的参数用大学习率
但 Adam 有时泛化不如 SGD,因为自适应学习率可能导致模型收敛到较"尖锐"的极小值(泛化不好),而 SGD 更倾向于找到"平坦"的极小值。
Q2: 什么是 Warmup?为什么需要?
答案:
Warmup 是在训练最初几步使用很小的学习率,然后逐步增大到目标值。原因:
- 训练初期模型参数是随机的,梯度方向不可靠
- 如果一开始就用大学习率,可能导致参数大幅偏移,训练不稳定
- Adam 的二阶矩估计在初期不准确,需要积累
LLM 训练通常 warmup 前 1-5% 的训练步数。
Q3: 局部最优和鞍点有什么区别?在高维空间中哪个更常见?
答案:
- 局部最优:所有方向上都是极小值
- 鞍点:某些方向是极小值,某些方向是极大值
在高维空间中,鞍点远比局部最优常见——因为要在所有维度上同时是极小值的概率极低。现代研究认为,深度学习训练中的主要挑战不是局部最优,而是鞍点和平坦区域(梯度接近零)。
动量和自适应学习率可以帮助逃离鞍点。
Q4: AdamW 和 Adam 的区别是什么?
答案:
Adam 中的权重衰减(L2 正则化)与自适应学习率耦合在一起——梯度大的参数权重衰减弱,梯度小的参数权重衰减强。这不符合正则化的初衷。
AdamW 将权重衰减从梯度更新中解耦:
AdamW 让权重衰减独立于梯度自适应,正则化效果更好,是 Transformer/LLM 训练的标准优化器。