优化器面试题集
Q1: Adam优化器的核心公式和原理
答:
m_t = β₁ m_{t-1} + (1-β₁) g_t # 一阶矩(动量估计)
v_t = β₂ v_{t-1} + (1-β₂) g_t² # 二阶矩(自适应学习率)
m̂_t = m_t / (1-β₁^t) # 偏差修正
v̂_t = v_t / (1-β₂^t)
θ_t = θ_{t-1} - α * m̂_t / (√v̂_t + ε)关键设计:
- 一阶矩(动量):加速收敛,减少震荡
- 二阶矩(自适应LR):每参数独立调整学习率
- 偏差修正:修正初期m₀=v₀=0带来的偏差
Q2: β₁和β₂的作用?
- β₁(0.9):控制动量的平滑程度。越大,历史梯度影响越久
- β₂(0.999):控制自适应学习率的平滑程度。越大,LR越小越稳定
- β₂更大是因为需要更长的历史来估计梯度的"平均尺度"
Q3: Adam vs SGD vs AdamW
| 方面 | SGD+Momentum | Adam | AdamW |
|---|---|---|---|
| 收敛 | 慢 | 快 | 快 |
| 泛化 | 更好 | 可能略差 | 改善 |
| 权重衰减 | L2 | L2 | 解耦 |
| 显存 | 1x | 3x(m+v) | 3x |
| 适用 | CV | NLP | LLM |
Q4: 为什么需要学习率warmup?
答: 训练初期:
- 模型参数随机,梯度方向不一致
- Adam的m和v还没有充分积累
- 大学习率在早期可能破坏初始化
Warmup逐步增加学习率,让优化器统计量积累、参数找到稳定方向后再用全速学习率。Transformer尤其需要warmup。
Q5: loss不下降如何排查?
- 学习率:太大(震荡)还是太小(不动)?
- 梯度:检查梯度范数,是否消失/爆炸
- 数据:标签是否正确?归一化?
- 模型:初始化是否正确?激活函数是否恰当?
- Batch Norm:小batch时BN不稳定,可试Layer Norm
Q6: CosineAnnealing为什么好?
相比Step的突变,Cosine平滑地将学习率从最大值降到最小值:
- 前期"探索"时LR大
- 后期"微调"时LR小
- 避免了Step的突变带来的loss回升