理解学习率调度(余弦退火 + warmup)的原理和作用
1.学习率设置对模型训练的影响
- 学习率设置过大,会导致训练loss振荡,模型训练不稳定
- 学习率设置过小,会导致模型训练缓慢
- 同时,需要注意的是,在模型初期和后期对于学习率的设置是不一样的
2.Warmup阶段
在模型刚刚训练的时候,模型的参数都是随机初始化的,如果使用较大的学习率设置,很容易导致模型跑飞。
Warmup的思想就是一开始从一个min_learning_rate进行线性增长,增长到目标值。1
2if step < warmup_steps:
lr = max_lr * (step / warmup_steps)
3.余弦退火阶段
Warmup 之后,学习率按余弦函数逐渐衰减:
Warmup 之后,学习率按余弦函数逐渐衰减:
其中:
- $\eta_{\max}$:最大学习率
- $\eta_{\min}$:最小学习率
- $t_w$:warmup 步数
- $T$:总训练步数
使用余弦退火,在训练初期学习率缓慢下降,训练后期快速下降至最小学习率,帮助模型后期精细化收敛.1
2
3
4
5
6
7
8
9
10import math
def get_lr(current_step, warmup_steps, max_steps, max_lr, min_lr):
if current_step < warmup_steps: # Warmup阶段
return max_lr * current_step / warmup_steps
if current_step > max_steps: # 后期保持最小学习率
return min_lr
decay_ratio = (current_step - warmup_steps) / (max_steps - warmup_steps)
coeff = 0.5 * (1.0 + math.cos(math.pi * decay_ratio))
return min_lr + coeff * (max_lr - min_lr)

```
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 思想是一个锐化的过程!
评论