优化方法¶
本页聚焦训练中最常用的梯度优化算法与实操建议。
1. SGD 与小批量梯度下降¶
参数更新:
\[
\theta_{t+1} = \theta_t - \eta \nabla_\theta \mathcal{L}(\theta_t)
\]
其中 \(\eta\) 是学习率。小批量(mini-batch)是工程上最常见折中。
2. Momentum¶
Momentum 通过速度项平滑梯度:
\[
v_t = \beta v_{t-1} + (1-\beta)g_t,
\quad
\theta_{t+1} = \theta_t - \eta v_t
\]
优点:在峡谷型损失面中收敛更稳定。
3. Adam¶
Adam 结合一阶、二阶动量估计:
\[
m_t = \beta_1 m_{t-1} + (1-\beta_1)g_t
\]
\[
v_t = \beta_2 v_{t-1} + (1-\beta_2)g_t^2
\]
再做偏置校正后更新参数。多数任务中是强基线。
4. 学习率策略¶
- StepLR:按固定 epoch 衰减。
- CosineAnnealing:余弦退火,常用于视觉任务。
- Warmup + Decay:大模型训练常见组合。
5. 代码示例:Warmup + Cosine¶
import math
def lr_lambda(step, warmup_steps, total_steps):
if step < warmup_steps:
return step / max(1, warmup_steps)
progress = (step - warmup_steps) / max(1, total_steps - warmup_steps)
return 0.5 * (1.0 + math.cos(math.pi * progress))
在 PyTorch 中接入:
scheduler = torch.optim.lr_scheduler.LambdaLR(
optimizer,
lr_lambda=lambda step: lr_lambda(step, warmup_steps=500, total_steps=10000),
)
6. 实践建议¶
- 从
Adam(lr=1e-3)或AdamW(lr=2e-4)起步。 - 先跑小数据快速验证训练管线,再上全量数据。
- 记录每次实验:数据版本、超参、种子、代码 commit。
- 出现震荡先查学习率,再查 batch size 与归一化。