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)或具体的使用场景,我可以提供更针对性的示例。

相关推荐
云-缩影几秒前
我用阿里云 AI 动画方案跑通了剧本→视频流水线:ComfyUI + 百炼模型实测
人工智能·阿里云·云计算
Century_Dragon2 分钟前
把一辆智能汽车“搬“进教室—智能网联汽车自动驾驶虚拟教学实训
学习
兔头?5 分钟前
JVM学习文档
jvm·学习
hkNaruto5 分钟前
【AI】深度学习、强化学习、深度强化学习基础概念笔记
人工智能·笔记·深度学习
Leo.yuan12 分钟前
集团司库系统之外还需要什么?2026年资金分析与司库决策平台建设指南
大数据·人工智能·区块链
console.log('npc')18 分钟前
问题跟踪与知识沉淀:从任务到知识的闭环)
前端·javascript·人工智能
程序员清风23 分钟前
从 Issue 到实施计划:让 AI 先理解再动手
人工智能·issue
秦禹辰27 分钟前
ClipSketch AI把视频改造成图文漫画:选关键帧、生成手绘分镜、融合IP形象并自动写小红书文案
人工智能·tcp/ip·音视频
梦想出海-Phoebe27 分钟前
ChatGPT 2026年10月更新汇总:GPT-6.1 Terra、AI短信助手与新功能解析
人工智能·chatgpt