江东的笔记

Be overcome difficulties is victory

0%

什么是Warmup

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
# 模拟训练20000步
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 #gradual warmup_lr
learning_rate = warmup_learning_rate
else:
#learning_rate = np.sin(learning_rate) #预热学习率结束后,学习率呈sin衰减
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内学习率较小,在预热的小学习率下,模型可以慢慢趋于稳定,等模型相对稳定后再选择预先设置的学习率进行训练,使得模型收敛速度变得更快,模型效果更佳。