学习率预热(warm up)

学习率预热

学习率是神经网络训练中最重要的超参数之一,针对学习率的技巧有很多。Warm up是在ResNet论文中提到的一种学习率预热的方法。由于刚开始训练时模型的权重(weights)是随机初始化的,此时选择一个较大的学习率,可能会带来模型的不稳定。学习率预热就是在刚开始训练的时候先使用一个较小的学习率,训练一些epoches或iterations,等模型稳定时再修改为预先设置的学习率进行训练。

学习率预热方法的实现

Gradual warmup。它可以逐渐地将学习率从一个小的值提升到一个大的值。这个斜坡避免了学习率的突然增加,允许在训练开始时健康的收敛。
在实践中,有一个很大的minibatch大小kn,我们开始从η的学习速率,增加一个常数数量在每一次迭代,在5个eopch以后,使其达到ηˆ= kη(结果是稳健的在确切时间预热)。热身之后,我们回到原来的学习进度计划。

##warm up
class LearningRateWarmUP(object):
    def __init__(self, optimizer, target_iteration, target_lr, after_scheduler=None):
        self.optimizer = optimizer
        self.target_iteration = target_iteration
        self.target_lr = target_lr
        self.num_iterations = 0
        self.after_scheduler = after_scheduler

    def warmup_learning_rate(self, cur_iteration):
        warmup_lr = self.target_lr*float(cur_iteration)/float(self.target_iteration)
        for param_group in self.optimizer.param_groups:
            param_group['lr'] = warmup_lr

    def step(self, cur_iteration):
        if cur_iteration <= self.target_iteration:
            self.warmup_learning_rate(cur_iteration)
        else:
            self.after_scheduler.step(cur_iteration)

Reference

1.https://blog.csdn.net/sinat_36618660/article/details/99650804
2.https://zhuanlan.zhihu.com/p/66080948
3.https://arxiv.org/pdf/1706.02677.pdf

发布了33 篇原创文章 · 获赞 3 · 访问量 5537

猜你喜欢

转载自blog.csdn.net/weixin_42990464/article/details/104640641