Pytorch 8 :Hyperparameter
每步有效更新率
卡数变多,调整超参,是为了保证每步更新稳定,且避免陷入局部极值。
- Global Batch Size (GBS)=DP×micro_batch×grad_accum (训练动力学只看 GBS,而不是你是用多卡还是累计。)
- 更新步长 = 学习率 乘以 梯度(Δ𝜃=𝐿𝑅⋅𝑔)
变化:
- 卡数增加,想保持训练效果一致,GBS就不变,梯度累计变小;
- GBS增大,梯度会更平滑,grad_norm会变小,clip_norm会更难触发。
1 | for step in range(total_steps): |
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 区域