← 课程库
预训练工程模块四 · 学习率代码12 分钟

学习率:预热、衰减、Cosine

步子大小怎么随训练变化

学完这节你能:
  • 理解学习率的作用
  • 说清 warm-up 为什么必要
  • 认识 cosine 衰减策略

学习率是每步挪多大。太大震荡甚至发散,太小学得慢。大模型训练几乎都用「先预热、再衰减」的调度。

  • 预热(Warm-up):开头几百~几千步,学习率从 0 线性升到峰值。刚开始参数是随机的,直接大步容易崩,先小步稳住。
  • 衰减(退火):升到峰值后逐渐降低,让后期精细收敛。
  • Cosine 衰减:按余弦曲线从峰值平滑降到接近 0,是最常用的调度之一。
warmup + cosine(示意)
def lr_at(step, warmup, total, peak):
    if step < warmup:
        return peak * step / warmup            # 线性预热
    p = (step - warmup) / (total - warmup)
    return 0.5 * peak * (1 + math.cos(math.pi * p))  # 余弦衰减

🔑 为什么要 warm-up:训练初期梯度噪声大、Adam 的二阶动量还没估准,大学习率容易把随机初始化的模型「打飞」。先预热能显著稳住训练早期。

自测学习率预热(warm-up)主要解决:
// 带走一句话

学习率=步长;主流用 warm-up(线性升,稳住早期)+衰减(如 cosine,精细收敛)。

独立练习

做到这些,才算完成本节

  1. 在本地运行代码,打印每个关键张量的 shape。
  2. 关闭示例后从空文件重写核心部分,并补一个异常或边界测试。
学习记录

记录本节阅读进度

建议先独立回答自测。读完记录不等于已经掌握。

继续下一课
← 上一课
epoch 与参数更新步数
下一课 →
优化器:SGD、Adam、AdamW

学完不要急着赶进度:去练习自测,或完成对应的阶段实验