1.学习率设置对模型训练的影响

  • 学习率设置过大,会导致训练loss振荡,模型训练不稳定
  • 学习率设置过小,会导致模型训练缓慢
  • 同时,需要注意的是,在模型初期和后期对于学习率的设置是不一样的

2.Warmup阶段

在模型刚刚训练的时候,模型的参数都是随机初始化的,如果使用较大的学习率设置,很容易导致模型跑飞。
Warmup的思想就是一开始从一个min_learning_rate进行线性增长,增长到目标值。

1
2
if step < warmup_steps:
lr = max_lr * (step / warmup_steps)

3.余弦退火阶段

Warmup 之后,学习率按余弦函数逐渐衰减:

Warmup 之后,学习率按余弦函数逐渐衰减:
$$
\eta_t = \eta_{\min} + \frac{1}{2}(\eta_{\max} - \eta_{\min})\left(1 + \cos\left(\frac{t - t_w}{T - t_w} \pi\right)\right)
$$

其中:

  • $\eta_{\max}$:最大学习率
  • $\eta_{\min}$:最小学习率
  • $t_w$:warmup 步数
  • $T$:总训练步数

使用余弦退火,在训练初期学习率缓慢下降,训练后期快速下降至最小学习率,帮助模型后期精细化收敛.

1
2
3
4
5
6
7
8
9
10
import 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)

学习率变化曲线图