1.1倍的初始lr, 随着training step 余弦地下降到0.1*lr
def get_lr(current_step, total_steps, lr):
return lr / 10 + 0.5 * lr * (1 + math.cos(math.pi * current_step / total_steps))
平滑:避免震荡;
先大后小:先大跳出局部最优;后小后期精细调整
大厂频繁采用;
初期模型不稳定,应该先用小学习率,线性提高一阵子,再稳定地用余弦退火调整
def get_lr(step, total_steps, lr, warmup_steps=1000):
if step < warmup_steps:
return lr * step / warmup_steps
else:
progress = (step - warmup_steps) / (total_steps - warmup_steps)
return 0.5 * lr * (1 + math.cos(math.pi * progress))
场景类型 | 学习率策略 | 是否需要 warmup | 说明 |
---|---|---|---|
快速实验 / 小模型 | 固定学习率 / OneCycle | ❌ | 模型简单,训练快 |
中等语言模型 | 线性 warmup + 余弦退火 | ✅ | Transformer 标准配置 |
大模型训练(GPT 类) | warmup + 平稳 + 多阶段/余弦退火 | ✅ | 如 DeepSeek-V3,控制更精细 |
微调 / 低资源场景 | 恒定 / 线性下降 | 可选 | 需谨慎调整,不破坏已有知识 |
持续训练 / Checkpoint | 分段线性下降 / 阶梯下降 | 可选 | 支持“恢复式”训练或长期稳定优化 |