Warmup 原理与实现

背景介绍

在神经网络训练过程中,学习率是一个很重要的超参数,学习率的选择对于网络的训练结果有较大的影响。

理论上,如果学习率设置过小,则会出现收敛速度过慢的情况;如果学习率设置过大,则容易错过局部最优;

实际上,如果学习率设置不合理,很容易出现模型不收敛的情况,

warmup就是一种学习率调整策略。

warmup提出 - constant warmup

warmup 策略由 ResNet 提出。

由于刚开始训练时模型的权重是随机初始化的,此时选择一个较大的学习率,可能会带来模型的不稳定。warmup就是在刚开始训练的时候先使用一个较小的学习率,训练一些epoches,等模型稳定时再修改为预先设置的学习率进行训练。

ResNet中使用一个110层的ResNet在cifar10上训练时,先用0.01的学习率训练直到训练误差低于80%(大概训练了400个iterations),然后使用0.1的学习率进行训练。如果一开始就用大的学习率,虽然最终会收敛,但之后测试准确率还是不会提高。

warmup 改进 - gradual warmup

18年Facebook又针对的warmup进行了改进,因为从一个很小的学习率一下变为比较大的学习率可能会导致训练误差突然增大。文章提出了gradual warmup来解决这个问题,即从最开始的小学习率开始,每个iteration增大一点,直到最初设置的比较大的学习率。然后再开始下降。

warmup作用

  1. 有助于减缓模型在初始阶段的过拟合现象,保持分布的平稳;
  2. 有助于保持模型的稳定性

gradual warmup 实现

warmup前,按epoch次数按比例上升;
warmup后用半周期余弦衰减学习率。

import math

def adjust_learning_rate(optimizer, epoch, args):
    """Decay the learning rate with half-cycle cosine after warmup"""
    if epoch < args.warmup_epochs:
        lr = args.lr * epoch / args.warmup_epochs 
    else:
        lr = args.min_lr + (args.lr - args.min_lr) * 0.5 * \
            (1. + math.cos(math.pi * (epoch - args.warmup_epochs) / (args.epochs - args.warmup_epochs)))
    for param_group in optimizer.param_groups:
        if "lr_scale" in param_group:
            param_group["lr"] = lr * param_group["lr_scale"]
        else:
            param_group["lr"] = lr
    return lr

学习率变化趋势如下:
在这里插入图片描述

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值