#一、高频问题速览
SGD、Momentum、Adam、AdamW的核心区别是什么?- 为什么
Adam往往前期收敛更快,但泛化未必最好? AdamW为什么要把 weight decay 从梯度更新里解耦?RMSProp、Adafactor、LAMB、Lion各自更适合解决什么问题?- 优化器状态为什么会吃掉这么多显存?怎么快速估算?
- 为什么大模型预训练里最常见的是
AdamW,而不是纯SGD? - 什么时候会考虑
Adafactor、8-bit optimizer 或其他省状态优化器? - mixed precision 训练里,master weights、loss scaling 和 optimizer 有什么关系?
- 如果训练不收敛,怎么判断是优化器问题,还是学习率、batch size、数据或实现问题?
- 手写一个 optimizer step 时,最容易写错哪些细节?
#就地速答
- 问:
SGD、Momentum、Adam、AdamW的核心区别是什么?答:
SGD直接沿当前梯度更新;Momentum在梯度上做速度累积以减少震荡;Adam同时维护一阶和二阶矩做自适应步长;AdamW则在Adam基础上把 weight decay 从梯度项里解耦,训练行为更稳定。 - 问:为什么
Adam往往前期收敛更快,但泛化未必最好?答:因为
Adam会对每个参数做自适应缩放,早期在尺度不均、梯度噪声大的任务上更容易快速下降;但这种“坐标级自适应”有时也会把模型推向更依赖局部统计的解,泛化不一定优于调得很好的SGD/Momentum。 - 问:
AdamW为什么要把 weight decay 从梯度更新里解耦?答:因为在
Adam里直接把L2正则加进梯度,会和自适应学习率纠缠在一起,不同参数实际承受的衰减强度会失真;AdamW把衰减单独做一次参数收缩,语义和调参都更清楚。 - 问:
RMSProp、Adafactor、LAMB、Lion各自更适合解决什么问题?答:
RMSProp主要解决非平稳梯度下的步长适配,Adafactor重点是省二阶矩显存,LAMB更偏大 batch 训练稳定性,Lion则想用更轻的状态和 sign 更新换更低开销。 - 问:优化器状态为什么会吃掉这么多显存?怎么快速估算?
答:因为像
Adam这类优化器通常要为每个参数额外维护一阶矩、二阶矩,mixed precision 下还常带一份FP32master weights;粗看显存会到参数本体的数倍。 - 问:为什么大模型预训练里最常见的是
AdamW,而不是纯SGD?答:因为大模型训练通常梯度尺度复杂、训练周期长、调参成本高,
AdamW在收敛速度、稳定性和工程成熟度之间提供了目前最稳的折中。 - 问:什么时候会考虑
Adafactor、8-bit optimizer 或其他省状态优化器?答:当模型太大、优化器状态显存明显成为瓶颈,或者训练资源很紧时,会优先考虑这些“少状态/压状态”的方案,但通常要接受一定的稳定性和调参代价。
- 问:mixed precision 训练里,master weights、loss scaling 和 optimizer 有什么关系?
答:因为低精度参数和梯度容易下溢或积累误差,所以很多实现会保留
FP32master weights 做更新,并通过 loss scaling 先放大梯度、再在 optimizer step 前反缩放,保证数值稳定。 - 问:如果训练不收敛,怎么判断是优化器问题,还是学习率、batch size、数据或实现问题?
答:最稳的做法不是直接换优化器,而是做最小隔离:先固定数据和模型,逐项排查学习率、warmup、梯度裁剪、batch size、数值溢出和实现 bug;只有这些都排除后,才更像优化器选择或超参本身有问题。
- 问:手写一个 optimizer step 时,最容易写错哪些细节?
答:最常见错误包括:把
AdamW写成Adam + L2、漏掉 bias correction、epsilon加错位置、先后更新顺序写反、梯度裁剪和zero_grad时机不对,以及 mixed precision 下忘记 unscale。