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 区域