你在训练一个两层 MLP,mini-batch 大小 64,用纯 SGD,初始学习率 0.1。训练初期 loss 抖动很大,相邻两次迭代的梯度方向经常左右翻转。换成 SGD + Momentum(momentum=0.9) 后,前期 loss 下降变快,但后期在极小值附近持续来回震荡,验证集也没有变好。请问:Momentum 为什么能抑制这种左右翻转并加速?momentum=0.9 时,如果梯度方向长期一致,有效学习率大约是原来的多少倍?后期这种震荡你会先调 momentum 还是先调学习率,为什么?
面试官在考什么
判断是否真理解动量是对历史梯度的指数滑动平均,以及它如何放大有效步长、与学习率调参耦合。
回答框架 · 前两步
- 纯 SGD:θ_{t+1}=θ_t-η g_t;Momentum 通常维护速度 v_t=μ v_{t-1}+g_t,参数更新 θ_{t+1}=θ_t-η v_t(等价写法符号可差)。
- 动量对历史梯度做指数滑动平均,μ=0.9 时等效平均窗口约 1/(1-μ)=10 步;相邻梯度方向相反时,历史速度会抵消部分反向分量,所以抖动减小。
还有 2 条答案要点、 3 层追问、 4 个常见坑, 以及针对你简历的追问路径,在定制报告里。
延伸阅读
想看这个方向的整体准备路线? 进入「机器学习基础」方向页
同一能力域的其他题
- Adam 和 SGD 的区别是什么?为什么很多视觉任务最终还用 SGD + momentum,而 NLP/大模型训练几乎都用 AdamW?
- 你用 mini-batch SGD 训练一个图像分类模型,batch size=256,初始 lr=0.1,momentum=0.9,Nesterov=False。训练日志显示:前几百步 loss 下降,随后在局部来回震荡,验证集不再提升;把 lr 降到 0.01 后震荡消失,但收敛明显变慢。请给出你的诊断顺序:这是 lr 过大、momentum 过大,还是二者耦合?你会做哪两个可复现实验来定位?并说明在什么条件下可以把 SGD+Momentum 的等效步长近似看成 lr/(1-momentum)。
- 你在 8 卡上训练一个带 BatchNorm 的 CNN,基线是 batch size=256、SGD momentum=0.9、lr=0.1,训练 90 epoch。现在为了提吞吐把单卡 batch 从 32 提到 512(总 batch=4096),epoch 数保持不变。请给出你会怎么改 lr 和 momentum,warmup 设多少步,并说明每一步的判断依据。如果按你的方案训到第 5 个 epoch 出现 loss spike,你的排查顺序是什么?
- 你接手一个日更的 CTR 模型训练管线:稠密参数约 3 亿,稀疏 embedding 约 20 亿行;集群固定 512 张 A100,单次训练窗口 8 小时。现状用 Adam,1.2 万步收敛到目标 loss。团队提议换成 SGD+Momentum,理由是线上 AUC 能涨,但实测同样步数下 loss 明显更高、大约要 3 倍步数才能追平。请给出你的决策和落地方案:切不切?切的话 lr、momentum、warmup、batch 怎么定?20 亿行的稀疏 embedding 那一侧要不要开 momentum?在 8 小时预算下你怎么判断这笔账划不划算?
- 你在训练一个带 embedding、LayerNorm 和 bias 的序列模型,优化器从 Adam 换成 AdamW,weight_decay=0.01,lr=3e-4,beta1=0.9,beta2=0.999。训练 10 个 epoch 后训练 loss 继续下降,但验证 loss 开始上升。你怀疑 weight decay 加错了参数。请说明 Adam 中 L2 正则与 AdamW 的 decoupled weight decay 在更新式上的区别;并给出参数分组方案:哪些参数做 weight decay,哪些不做,为什么。
- 你在微调一个 Transformer,用 Adam,lr=1e-5,weight decay=0.01,训练集 200 万条。训了 3 个 epoch 后 train loss 还在降,但 valid loss 连续 2 个 epoch 上升。同事说把 weight decay 提到 0.1 就能压住。请给出你的诊断和具体修改方案:哪些参数加 decay、哪些不加,用 AdamW 还是 Adam+L2,为什么?