动量(Momentum)优化的过程:从直觉到公式

副标题 / 摘要 动量通过累积历史梯度“惯性”来加速收敛、减少震荡。本文用 ACERS 框架拆解动量更新过程、公式与工程场景,并提供最小 PyTorch 示例。 预计阅读时长:12~16 分钟 标签:momentum、sgd、optimizer SEO 关键词:动量, Momentum, SGD, 优化器 元描述:系统讲清动量优化的更新过程与工程实践。 目标读者 想理解动量优化机制的入门读者 需要解决训练震荡与收敛慢问题的工程实践者 关注优化器调参的开发者 背景 / 动机 纯 SGD 在陡峭方向上容易震荡、在平缓方向上推进缓慢。 动量引入“速度”概念,让更新方向更稳定、收敛更快。 它是许多优化器(如 Adam)的核心组件之一。 核心概念 速度(Velocity):累计梯度形成的方向与幅度。 动量系数:控制历史梯度影响程度。 平滑更新:减少梯度噪声带来的震荡。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 动量可以理解为: 每一步不仅看当前梯度,还看过去的梯度方向。 像滚小球一样,惯性会让它更容易越过浅坑。 基础示例(1) 在狭长“谷地”里,纯 SGD 左右摆动,而动量能沿谷底快速前进。 基础示例(2) 在噪声梯度场景,动量能平均掉噪声,方向更稳定。 实践指南 / 步骤 选择 momentum(常见 0.9)。 如果震荡明显,适当提高动量或降低学习率。 观察训练/验证曲线,确认收敛速度。 可运行示例(最小 PyTorch 动量更新) import torch torch.manual_seed(42) w = torch.tensor([5.0], requires_grad=True) velocity = torch.zeros_like(w) lr = 0.1 mu = 0.9 for _ in range(5): loss = (w - 1.0).pow(2) loss.backward() with torch.no_grad(): velocity = mu * velocity + w.grad w -= lr * velocity w.grad.zero_() print(w.item()) 解释与原理 速度累积让更新方向“更平滑”。 在弯曲损失面上,动量减少横向摆动。 学习率与动量需要联合调参。 C — Concepts(核心思想) 方法类型 动量属于一阶优化增强策略,通过历史梯度平滑更新。 ...

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

优化器的了解:从 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]

SGD vs Adam:优化器原理与工程取舍

副标题 / 摘要 SGD 简洁稳定,Adam 自适应学习率收敛更快。本文用 ACERS 框架对比两者原理与工程取舍,并给出最小 PyTorch 示例。 预计阅读时长:14~18 分钟 标签:sgd、adam、optimizer SEO 关键词:SGD, Adam, 优化器, 动量 元描述:对比 SGD 与 Adam 的训练特性与使用场景。 目标读者 想理解优化器差异的入门读者 需要做训练稳定性与收敛速度取舍的工程实践者 想掌握常见调参策略的开发者 背景 / 动机 优化器决定训练速度与最终性能。 SGD 以稳定著称,Adam 以快速收敛著称。 理解两者差异有助于在不同任务中做更合理的选择。 核心概念 SGD:基于当前梯度更新参数。 Momentum:引入历史梯度方向,加速收敛。 Adam:结合动量与 RMSProp,自适应学习率。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 SGD:每步朝“当前梯度方向”走。 Adam:用历史梯度估计方向,同时对每个参数自适应调节步长。 基础示例(1) SGD 在噪声大时会“抖动”,收敛慢但稳定。 基础示例(2) Adam 在稀疏梯度场景(NLP)通常收敛更快。 实践指南 / 步骤 快速验证效果 → Adam。 追求最终泛化 → SGD + 动量。 对比验证集曲线,而非只看训练 loss。 可运行示例(最小 PyTorch 对比) import torch import torch.nn as nn torch.manual_seed(42) x = torch.randn(128, 10) y = torch.randn(128, 1) model = nn.Linear(10, 1) loss_fn = nn.MSELoss() 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() adam = torch.optim.Adam(model.parameters(), lr=1e-2) for _ in range(5): pred = model(x) loss = loss_fn(pred, y) adam.zero_grad() loss.backward() adam.step() print("done") 解释与原理 SGD 只依赖当前梯度,步长固定。 Adam 用一阶/二阶动量估计,使得学习率对每个参数自适应。 C — Concepts(核心思想) 方法类型 SGD 是一阶优化基线,Adam 是自适应学习率优化。 ...

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