模型训练技巧——学习率设定与warm up


在模型训练过程中,很重要的一点就是如何调 学习率(lr)这个超参,针对 学习率的优化方法有很多, warmup则是其中比较重要及有效的一个方法。

1. warmup定义

warmup,即预热的意思,是在ResNet论文中提到的一种学习率预热的方法,它在训练开始的时候先选择使用一个较小的学习率,训练了一些epoches或者steps(比如4个epoches,10000steps),再修改为预先设置的学习来进行训练。

2. 学习率相关

- 学习率设定

  学习率的设定, 在理论上来说,通常会出现以下情况:
    学习率过小 → → 收敛过慢,学习率过大 → → 错过局部最优;
  从实际上来看,学习率过小 → → 不收敛,学习率过大 → → 不收敛;但是目前还没有通用理论来解释为什么会造成这种情况。

- 设定学习率的一些方法

  1. 通常情况下,学习率与其他一些参数会起到互相影响的作用,但影响并没有很大,所以一般我们最开始在选择学习率的时候建议选择一个合适的学习率,这里的学习率指的并不是能取得最好精度的学习率,而是精度虽然有些下降,但是达到收敛的速度变快的相对情况下,这样能够省下不少时间去调其他参数。
  2. 样本容量对于学习率的影响还是比较大的,样本容量不变的情况下一般不需要再调整学习率,若是扩充了样本容量,则需要重新考虑学习率。
  3. 在最终阶段降低学习率,后者babysit
  最后比较稳定,降低学习率更容易找到局部最优,可以增加batchsize, 这样更稳定
  babysit:看整个训练过程,当在验证集上精度不再提升时,降低学习率,再跑。细调。
  4. 常见的学习率包括:1e-052e-05,5e-05
  一般从头训练,可以从0.01开始试,出现问题就调整;如果收敛太快,很快就在训练集上过拟合了,可以降低学习率,如果训练过慢或不收敛,则可以增加学习率;

3. warmup作用

-constant warmup

  由于刚开始训练时,模型的权重(weights)是随机初始化的,此时若选择一个较大的学习率,可能带来模型的不稳定(振荡),选择Warmup预热学习率的方式,可以使得开始训练的几个epoches或者一些steps内学习率较小,在预热的小学习率下,模型可以慢慢趋于稳定,等模型相对稳定后再选择预先设置的学习率进行训练,使得模型收敛速度变得更快,模型效果更佳。
  Example:Resnet论文中使用一个110层的ResNet在cifar10上训练时,先用0.01的学习率训练直到训练误差低于80%(大概训练了400个steps),然后使用0.1的学习率进行训练。

-gradual warmup

  constant warmup的不足之处在于从一个很小的学习率一下变为比较大的学习率可能会导致训练误差突然增大。于是18年Facebook提出了gradual warmup来解决这个问题,即从最初的小学习率开始,每个step增大一点点,直到达到最初设置的比较大的学习率时,采用最初设置的学习率进行训练。
  1.gradual warmup的实现模拟代码如下:

"""
Implements gradual warmup, if train_steps < warmup_steps, the
learning rate will be `train_steps/warmup_steps * init_lr`.
Args:
    warmup_steps:warmup步长阈值,即train_steps<warmup_steps,使用预热学习率,否则使用预设值学习率
    train_steps:训练了的步长数
    init_lr:预设置学习率
"""
import numpy as np
warmup_steps = 2500
init_lr = 0.1  
# 模拟训练15000步
max_steps = 15000
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))

  2.上述代码实现的Warmup预热学习率以及学习率预热完成后衰减(sin or exp decay)的曲线图如下:
在这里插入图片描述

4. 常见warmup方法

4.1 constant warmup

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

4.2 Linear warmup

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

4.3 Cosine warmup

学习率先从很小的数值线性增加到预设学习率,然后按照cos函数值进行衰减。其学习率系数如下图所示。
在这里插入图片描述
本文参考了:【调优方法】——warmup以及Warmup预热学习率

扫描二维码关注公众号,回复: 12792830 查看本文章

猜你喜欢

转载自blog.csdn.net/weixin_43624728/article/details/112794849
今日推荐