Warmup Scheduler深度学习训练中,在训练初期使用较低学习率进行预热(Warmup),然后再按照预定策略(如余弦退火、阶梯下降等)衰减学习率的方法

"Warmup Scheduler"通常是指深度学习训练中,一种在训练初期使用较低学习率进行"预热"(Warmup),然后再按照预定策略(如余弦退火、阶梯下降等)衰减学习率的方法。

这常用于稳定训练初期,尤其是使用大Batch Size、训练Transformer类模型(如BERT、ViT)或进行迁移学习微调时。

核心原理与作用

  1. 稳定训练:模型权重在初始化时是随机的。训练初期直接使用较大的学习率可能导致梯度爆炸或不稳定的剧烈更新。Warmup给模型一个"适应"数据分布和梯度方向的时间。
  2. 防止过拟合:初期的小学习率有助于模型先探索一个平滑的损失区域,找到更优的优化路径。
  3. 对大Batch Size尤其有效:大Batch Size意味着每次更新的梯度估计更准确、噪声更小,理论上可以用更大的学习率。但初始阶段直接用大LR可能不稳定,Warmup提供了一个平滑过渡。

常见Warmup策略

  1. 线性Warmup

最常见的策略。在开始的 N 个Steps或Epochs内,学习率从0(或一个很小的值)线性增加到预设的初始学习率。

• 公式:current_lr = base_lr * (current_step / warmup_steps)

• 示例:base_lr = 5e-4, warmup_steps = 1000,则在第500步时,学习率为 5e-4 * (500/1000) = 2.5e-4。

  1. 指数Warmup

学习率从0开始指数增长到初始学习率,增长较线性更快。

  1. 常数Warmup

在Warmup阶段保持一个固定的较小学习率,Warmup结束后直接跳到设定的初始学习率。

配合后续衰减策略的典型流程

一个完整的学习率调度计划通常是 "Warmup阶段" + "主衰减阶段"。

例如:Warmup + 余弦退火 (Cosine Annealing)

  1. 前 T_{warmup} 步:线性Warmup。
    lr_t = base_lr * (t / T_warmup)
  2. 后续 T_{total} - T_{warmup} 步:余弦退火衰减到最小学习率。
    lr_t = lr_min + 0.5 * (base_lr - lr_min) * (1 + cos(π * (t - T_warmup) / (T_total - T_warmup)))

代码示例(PyTorch)

线性Warmup + 余弦退火

import torch.optim as optim

from torch.optim.lr_scheduler import LambdaLR, CosineAnnealingLR

def get_cosine_schedule_with_warmup(optimizer, num_warmup_steps, num_training_steps, num_cycles=0.5, last_epoch=-1):

"""

创建一个调度器:先线性Warmup,再余弦衰减。

"""

def lr_lambda(current_step):

if current_step < num_warmup_steps:

线性增长

return float(current_step) / float(max(1, num_warmup_steps))

余弦衰减

progress = float(current_step - num_warmup_steps) / float(max(1, num_training_steps - num_warmup_steps))

return max(0.0, 0.5 * (1.0 + math.cos(math.pi * float(num_cycles) * 2.0 * progress)))

复制代码
return LambdaLR(optimizer, lr_lambda, last_epoch)

使用示例

optimizer = optim.AdamW(model.parameters(), lr=5e-4)

scheduler = get_cosine_schedule_with_warmup(optimizer,

num_warmup_steps=500,

num_training_steps=total_training_steps)

每个训练step后调用

for step, batch in enumerate(dataloader):

loss = ...

loss.backward()

optimizer.step()

scheduler.step() # 更新学习率

使用Transformers库

Hugging Face的Transformers库内置了完善的Warmup调度器。

from transformers import get_linear_schedule_with_warmup, get_cosine_schedule_with_warmup

线性Warmup + 线性衰减

scheduler = get_linear_schedule_with_warmup(

optimizer,

num_warmup_steps=500,

num_training_steps=total_training_steps

)

或者,线性Warmup + 余弦衰减

scheduler = get_cosine_schedule_with_warmup(

optimizer,

num_warmup_steps=500,

num_training_steps=total_training_steps,

num_cycles=0.5 # 余弦周期数

)

超参数设置经验

• Warmup Steps/Epochs:通常设置为总训练步数的 5%~10%。例如,训练10000步,Warmup可以设500-1000步。对于大规模预训练(如BERT),比例可能更低(如1%)。

• 起始学习率:Warmup开始的LR通常设为0,或 base_lr * 0.1。

• Base LR:需要根据任务、模型和Batch Size单独调试。

为什么需要Warmup?一个直观比喻

想象一下你要推一个很重的雪球上山(优化过程)。

• 没有Warmup:一开始就用全力猛推,雪球可能碎裂(训练不稳定)或冲错方向(陷入局部最优)。

• 有Warmup:先轻轻推,感受雪球的重量和路况(让模型适应数据和梯度),等它平稳滚动起来后,再逐渐加大力度(提高学习率),最后在接近山顶时收力(学习率衰减)。

希望这个详细的解释对您有帮助!如果您有特定的框架(如TensorFlow、PyTorch Lightning)或具体的使用场景,我可以提供更针对性的示例。

相关推荐
未来之窗软件服务1 分钟前
东方仙盟VOS诸法空相架构思路—未来之窗行业应用跨平台架构
人工智能·架构·仙盟创梦ide·东方仙盟·昭和仙君
西魏陶渊明2 分钟前
Agent 并不是智能体,而是 LLM 参与决策的业务系统
大数据·人工智能
杜子不疼.3 分钟前
高并发场景下 Spring MVC + 虚拟线程 vs WebFlux 选型对比
java·人工智能·spring·mvc
Flying pigs~~3 分钟前
基于Bert的模型迁移文本分类项目
人工智能·深度学习·算法·大模型·nlp·bert
新加坡内哥谈技术6 分钟前
AI代理可能会让自由软件再次变得重要
人工智能·ai编程
少许极端7 分钟前
算法奇妙屋(三十七)-贪心算法学习之路4
学习·算法·贪心算法·田忌赛马
Fleshy数模7 分钟前
从零实现Word2Vec之CBOW模型:理解词向量的核心原理
人工智能·自然语言处理·word2vec
鱼鳞_9 分钟前
Java学习笔记_Day18(数据结构)
java·笔记·学习
JACK的服务器笔记10 分钟前
《服务器测试百日学习计划——Day14:BMC基础与健康状态,为什么服务器排障不能只看OS》
运维·服务器·学习
春日见13 分钟前
深度神经网络的底层数学原理
运维·服务器·windows·深度学习·自动驾驶