Warmup可以逐渐地将学习率从一个小的值提升到一个大的值
Warmup
什么是预热学习率(Warmup)?
先来看一下预热的定义:预热指的是为防止急热,焊接前先对材料预热。
而预热学习率指的是对学习率进行控制,使学习率缓慢的变化,而不是直接变为设定值。
下面我们通过一个具体的例子来展示Warmup:
设置初始化lr = 0.1,假设所有步数num_step = 20000,warmup_step = 5000,即当步数达到5000时,达到所设置的学习率
实现代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| import matplotlib.pyplot as plt warmup_steps = 5000 init_lr = 0.1
max_steps = 20000 a = [] for train_steps in range(max_steps): if warmup_steps and train_steps < warmup_steps: warmup_percent_done = train_steps / warmup_steps warmup_learning_rate = init_lr * warmup_percent_done learning_rate = warmup_learning_rate else: learning_rate = learning_rate**1.0001 if (train_steps+1) % 100 == 0: print("train_steps:%.3f--warmup_steps:%.3f--learning_rate:%.3f" % ( train_steps+1,warmup_steps,learning_rate)) a.append(learning_rate) plt.plot(a) plt.show()
|
可得学习率变化如下:
为什么要进行预热学习率
由于刚开始训练时,模型的权重(weights)是随机初始化的,此时若选择一个较大的学习率,可能带来模型的不稳定(振荡),选择Warmup预热学习率的方式,可以使得开始训练的几个epoches或者一些steps内学习率较小,在预热的小学习率下,模型可以慢慢趋于稳定,等模型相对稳定后再选择预先设置的学习率进行训练,使得模型收敛速度变得更快,模型效果更佳。