跳转至

优化方法

本页聚焦训练中最常用的梯度优化算法与实操建议。

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 与归一化。