优化器的了解:从 SGD 到 Adam 的工程取舍

副标题 / 摘要 优化器决定训练速度、稳定性与最终泛化。本文按 ACERS 框架对比 SGD、Momentum、Adam、AdamW 等主流优化器,并给出最小可运行示例与工程实践建议。 预计阅读时长:15~18 分钟 标签:optimizer、sgd、adam、adamw SEO 关键词:优化器, SGD, Adam, AdamW 元描述:对比主流优化器原理与工程场景,给出可运行示例。 目标读者 刚入门深度学习训练的读者 需要在速度与泛化之间权衡的工程实践者 想系统理解优化器选择的开发者 背景 / 动机 在训练大模型时,损失函数不是唯一关键,优化器同样决定成败。 同一模型下,不同优化器会带来完全不同的收敛曲线与最终效果。 理解优化器差异,是做出稳定工程方案的前提。 核心概念 梯度下降:沿损失函数梯度方向更新参数。 动量(Momentum):引入历史梯度方向,减少震荡。 自适应学习率:为不同参数分配不同步长。 权重衰减(Weight Decay):控制参数规模,提升泛化。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 SGD:每次更新都沿着当前梯度方向。 Momentum:带“惯性”的 SGD,加速收敛。 Adam:对每个参数自适应调整学习率。 AdamW:把权重衰减从 Adam 的梯度中解耦。 基础示例(1) SGD 在陡峭峡谷会来回震荡。 Adam 会自动缩小震荡方向的步长。 基础示例(2) Adam 收敛快但可能泛化弱。 SGD 收敛慢但往往更稳。 实践指南 / 步骤 快速验证模型可行性 → Adam/AdamW。 追求最终泛化性能 → SGD + 动量。 训练大模型时优先 AdamW。 用验证集曲线而非训练 loss 评估。 可运行示例(最小 PyTorch 对比) import torch import torch.nn as nn torch.manual_seed(42) x = torch.randn(256, 10) y = torch.randn(256, 1) model = nn.Linear(10, 1) loss_fn = nn.MSELoss() # SGD sgd = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9) for _ in range(5): pred = model(x) loss = loss_fn(pred, y) sgd.zero_grad() loss.backward() sgd.step() # AdamW adamw = torch.optim.AdamW(model.parameters(), lr=1e-3, weight_decay=0.01) for _ in range(5): pred = model(x) loss = loss_fn(pred, y) adamw.zero_grad() loss.backward() adamw.step() print("done") 解释与原理 Adam 引入一阶与二阶动量,提升收敛速度。 AdamW 通过“解耦权重衰减”更稳定。 SGD 的优势在于更好的泛化表现。 C — Concepts(核心思想) 方法类型 优化器属于数值优化方法,核心目标是稳定、快速、可泛化地找到最优解。 ...

2026年1月24日 · 2 分钟 · map[name:Jeanphilo]