【调优方法】——warmup

学习率是模型训练中最重要的超参之一,针对学习率的优化有很多种方法,而warmup是其中重要的一种。

1. 什么是warmup

warmup是一种学习率优化方法(最早出现在ResNet论文中)。在模型训练之初选用较小的学习率,训练一段时间之后(如:10epoches或10000steps)使用预设的学习率进行训练;

2. 为什么使用warmup

2.1 理性分析

  1. 因为模型的weights是随机初始化的,可以理解为训练之初模型对数据的“理解程度”为0(即:没有任何先验知识),在第一个epoches中,每个batch的数据对模型来说都是新的,模型会根据输入的数据进行快速调参,此时如果采用较大的学习率的话,有很大的可能使模型对于数据“过拟合”(“学偏”),后续需要更多的轮次才能“拉回来”;
  2. 当模型训练一段时间之后(如:10epoches或10000steps),模型对数据具有一定的先验知识,此时使用较大的学习率模型就不容易学“偏”,可以使用较大的学习率加速模型收敛
  3. 当模型使用较大的学习率训练一段时间之后,模型的分布相对比较稳定,此时不宜从数据中再学到新特点,如果仍使用较大的学习率会破坏模型的稳定性,而使用小学习率更容易获取local optima

2.2 感性分析

  1. 刚开始模型对数据完全不了解,这个时候步子太大,容易扯着dan,此时需要使用小学习率摸着石头过河
  2. 对数据了解了一段时间之后,可以使用大学习率朝着目标大步向前
  3. 快接近目标时,使用小学习率进行探索,此时步子太大,容易错过最近点

3. 常用的warmup

3.1 Constant Warmup

学习率从非常小的数值线性增加到预设值之后保持不变,其学习率的系数如下图所示:
在这里插入图片描述

3.2 Linner Warmup

学习率从非常小的数值线性增加到预设值之后,然后再线性减小。其学习率的系数如下图所示。
在这里插入图片描述

3.3 Cosine Warmup

学习率先从很小的数值线性增加到预设学习率,然后按照cos函数值进行衰减。其学习率系数如下图所示。
在这里插入图片描述

03-30
### Warmup 在 IT 领域中的含义 在机器学习深度学习领域,Warmup 是一种化策略,用于改进模型训练过程中的收敛速度和稳定性。Warmup 的核心思想是在训练初期逐步增加学习率,而不是一开始就使用较高的学习率[^1]。这种方法可以有效防止由于初始阶段的学习率过高而导致的梯度爆炸或模型不稳定。 Warmup 技术通常应用于大规模神经网络训练过程中,尤其是在涉及 Transformer 架构的情况下(如 DeiT)。这是因为 Transformer 模型具有较大的参数量,在训练初期可能会因为过高的学习率而难以稳定收敛。 --- ### Warmup 的实现方式 以下是几种常见的 Warmup 实现方法: #### 方法 1:线性增长法 在线性增长法中,学习率会从一个较小的初始值逐渐线性增加到预设的最大值。这种技术可以通过以下公式表示: \[ \text{lr} = \min\left(\frac{\text{current\_step}}{\text{warmup\_steps}}, 1\right) \cdot \text{base\_learning\_rate} \] 其中 `current_step` 表示当前迭代步数,`warmup_steps` 表示 Warmup 执行的总步数,`base_learning_rate` 则是最终的目标学习率。 下面是基于 PyTorch 的线性 Warmup 实现代码示例: ```python def get_lr_warmup(optimizer, warmup_steps): def lr_lambda(current_step): if current_step < warmup_steps: return float(current_step) / float(max(1, warmup_steps)) return max( 0.0, float(warmup_steps - current_step) / float(max(1, warmup_steps)) ) return torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda) # 使用示例 optimizer = torch.optim.Adam(model.parameters(), lr=base_lr) scheduler = get_lr_warmup(optimizer, warmup_steps=1000) for epoch in range(num_epochs): for batch in data_loader: optimizer.step() scheduler.step() ``` #### 方法 2:指数衰减法 另一种常见的方式是采用指数形式的增长函数。这种方式允许更灵活地控制学习率的变化曲线。其基本公式如下所示: \[ \text{lr} = \text{initial\_lr} \times e^{k \cdot t} \] 这里 \( k \) 和 \( t \) 分别代表增长率常数以及时间变量。 虽然该种方案较为复杂,但在某些特定情况下能够带来更好的效果。 #### 方法 3:余弦退火结合 Warmup 此组合方式先执行一段时间内的渐进升温操作,之后再切换至周期性的余弦退火模式。这有助于进一步提升泛化能力并减少震荡现象的发生概率。 下面是一个简单的 TensorFlow/Keras 版本实现例子: ```python import tensorflow as tf class WarmUpCosine(tf.keras.optimizers.schedules.LearningRateSchedule): def __init__(self, learning_rate_base, total_steps, warmup_steps): super(WarmUpCosine, self).__init__() self.learning_rate_base = learning_rate_base self.total_steps = total_steps self.warmup_steps = warmup_steps @tf.function def __call__(self, step): global_step_recomp = tf.cast(step, dtype=tf.float32) learning_rate = self.learning_rate_base * (global_step_recomp / self.warmup_steps) cosine_decay = 0.5 * ( 1 + tf.cos(np.pi * (global_step_recomp - self.warmup_steps) / (self.total_steps - self.warmup_steps))) learning_rate *= cosine_decay return tf.where(global_step_recomp >= self.warmup_steps, learning_rate, self.learning_rate_base * (global_step_recomp / self.warmup_steps)) # 用实例 schedule = WarmUpCosine(learning_rate_base=0.01, total_steps=10000, warmup_steps=1000) opt = tf.keras.optimizers.SGD(schedule) model.compile(loss='categorical_crossentropy', optimizer=opt) ``` --- ### 总结 Warmup 主要作用在于缓解大型模型训练早期可能遇到的各种问题,比如数值不稳或者损失发散等状况。通过合理设置相关超参,可显著提高整体效率与质量表现。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值