跳转至

Pytorch 8 :Hyperparameter

导言

learning rate、clip_norm、梯度累计、micro bs 这些通用超参,应该如何调整。

每步有效更新率

卡数变多,调整超参,是为了保证每步更新稳定,且避免陷入局部极值。

  • Global Batch Size (GBS)=DP×micro_batch×grad_accum (训练动力学只看 GBS,而不是你是用多卡还是累计。)
  • 更新步长 = 学习率 乘以 梯度(Δ𝜃=𝐿𝑅⋅𝑔)

变化:

  • 卡数增加,想保持训练效果一致,GBS就不变,梯度累计变小;
  • GBS增大,梯度会更平滑,grad_norm会变小,clip_norm会更难触发。
for step in range(total_steps):

    optimizer.zero_grad()

    for i in range(grad_accum):
        x = get_batch(micro_batch)  # 每卡8个样本
        loss = model(x)
        loss = loss / grad_accum    # 防止梯度变大
        loss.backward()

    optimizer.step()

BS

理论基础:为什么 batch 大了 loss 更平滑?

梯度可以写成:

\[ g = \nabla L(\theta) + \epsilon \]

其中 ε 是噪声。

  • 小 batch → ε 大 → 曲线抖动
  • 大 batch → ε 小 → 曲线平滑

但注意:

平滑 ≠ 收敛更快 平滑 ≠ 泛化更好

大 batch 实际上更“确定性”,但可能更容易陷入 sharp minima。


LR

怎么缩放?核心有两种 scaling rule

随GBS线性增大

Linear Scaling Rule(最常用)来自 Goyal et al., 2017 (ResNet-50 1h 训练)

如果:

\[ B_{new} = k \times B_{old} \]

则:

\[ LR_{new} = k \times LR_{old} \]

适用条件:

  • SGD / AdamW
  • 有 warmup
  • batch 不极端大

随GBS开更号增大

有理论分析认为:

梯度方差 ~ 1/B

稳定学习率应满足:

\[ LR \propto \sqrt{B} \]

即:

\[ LR_{new} = LR_{old} \times \sqrt{k} \]

这个更稳,不容易炸。


建议

实践经验:

规模 推荐策略
≤ 8 卡 不调 LR
8 → 64 卡 线性 scaling
64 → 512 卡 先 √ scaling,再试线性

因为:

  • Transformer 对 LR 极度敏感
  • AdamW 的 effective step size 会被 β2 影响
  • 超大 batch 会进入 sharp minima 区域