预训练工程模块四 · 学习率代码约 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,精细收敛)。
独立练习
做到这些,才算完成本节
- 在本地运行代码,打印每个关键张量的 shape。
- 关闭示例后从空文件重写核心部分,并补一个异常或边界测试。
学习记录
记录本节阅读进度
建议先独立回答自测。读完记录不等于已经掌握。