深度学习基础 【调优方法】——warmup

1. 什么是warmup

  • 定义:warmup是指在训练开始时使用较小的学习率,经过一段时间(如若干个epoch或steps)逐渐增加学习率,直到达到预设的学习率。这种策略可以帮助模型在初期避免大幅度的参数更新。

2. 为什么使用warmup

  • 模型初始化:刚开始时,模型参数通常是随机初始化的,模型对数据的理解几乎为零。较大的学习率会导致模型在未充分理解数据的情况下,迅速做出较大的调整,容易导致“学偏”或发散。
  • 逐步学习:使用小学习率可以让模型逐步适应数据特征,降低初期训练的不稳定性。随着训练的进行,模型对数据的理解加深,使用较大的学习率时更有可能稳定地收敛到有效的解。
  • 局部最优:当接近目标时,使用小学习率能够减少对当前已知特征的“破坏”,从而更有效地找到局部最优解。

3. 

在图中展示了两种学习率warmup策略:线性warmup和指数warmup。

  1. 线性warmup(以虚线表示):

    • 从初始学习率(0.0001)开始,随着步骤的增加,学习率线性上升至目标学习率(0.01)。
    • 在前100个步骤内,学习率逐渐增大,使模型在初期以较小的步伐适应数据,避免过拟合。
  2. 指数warmup(以点划线表示):

    • 学习率同样从初始值开始,但其增长速率是指数级的。
    • 在warmup阶段,学习率迅速提升,初期的学习速度较快,适合在模型已有一定知识的情况下进行快速收敛。

YOLOV8讲解与改进 一勺AI帅汤的个人空间-一勺AI帅汤个人主页-哔哩哔哩视频 

### Warmup 学习率度的作用 Warmup 学习率度是一种在训练初期使学习率从小值逐渐增加至设定较大值的方法。这种方法能够确保模型在训练早期阶段保持稳定,防止因过高的初始学习率而导致梯度爆炸或其他不稳定的状况发生[^1]。 对于图像分类任务而言,采用此策略可提升最终的准确性,在某些特定网络架构下同样验证了其有效性。当与 Cosine 衰减等其他形式的学习率整机制联合应用时,能进一步化整个训练过程中的参数更新效率和效果[^2]。 ### 实现方法 为了更好地理解如何实现 warmup 学习率度器,这里给出一段 Python 代码作为示例: ```python import math from torch.optim.lr_scheduler import _LRScheduler class WarmUpLR(_LRScheduler): """Warm up learning rate scheduler""" def __init__(self, optimizer, total_iters, last_epoch=-1): self.total_iters = total_iters super().__init__(optimizer, last_epoch) def get_lr(self): return [ base_lr * (float(self.last_epoch + 1) / self.total_iters) for base_lr in self.base_lrs ] def adjust_learning_rate(optimizer, epoch, epochs, lr_init, warm_up_epochs=5): """ Adjusts the learning rate during training. Args: optimizer: Optimizer object used by PyTorch model. epoch: Current epoch number. epochs: Total number of epochs planned for training. lr_init: Initial learning rate after warming up phase ends. warm_up_epochs: Number of epochs dedicated to warming up process. Returns: Updated learning rate value based on current epoch and schedule rules. """ if epoch < warm_up_epochs: alpha = float(epoch) / warm_up_epochs warm-up_factor = min(1., (alpha + 1.) / 2.) new_lr = lr_init * warm_up_factor elif isinstance(lr_decay_milestones, list): # MultiStep LR decay policy gamma = 0.1 ** sum([epoch >= m for m in lr_decay_milestones]) new_lr = max(min_lr, lr_init * gamma) else: # Cosine Annealing LR decay policy cos_inner = (math.pi * (epoch - warm_up_epochs)) / \ (epochs - warm_up_epochs) new_lr = lr_init * ((1 + math.cos(cos_inner)) / 2.) for param_group in optimizer.param_groups: param_group['lr'] = new_lr return new_lr ``` 上述 `adjust_learning_rate` 函数展示了两种常见的学习率衰减政策——多步长(MultiStep)和余弦退火(Cosine Annealing),并结合了一个简单的线性 warmup 过程来初始化学习率。通过这种方式可以在不同的训练阶段灵活控制学习率变化规律,从而达到更好的性能表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值