查看原文
其他

深度学习100问-11:什么是学习率衰减?

louwill 机器学习实验室 2019-12-24

深度学习100问


Author:louwill

Machine Learning Lab

     

     在深度学习炼丹过程中,一项关键的工作就是调参。比如说参数初始化策略、batch size的选择、使用哪种激活函数和优化器等等。其中优化器的学习率的设置是一个重要调参步骤。


     关于优化算法的相关理论,这里不过多展开,笔者在深度学习60讲系列中第6讲中有详细讲解,需要复习的朋友回看深度学习笔记6:神经网络优化算法之从SGD到Adam即可。这里咱们单独把优化器中的学习率拎出来,因为学习率是一个神经网络优化的关键参数。学习率即步长,它控制着算法优化的速度。

对于一个有经验的炼丹师而言,很少会在训练过程中使用一成不变的学习率。使用的学习率过大,虽然在算法优化前期会加速学习,使得损失能够较快的下降,但在优化后期会出现波动现象以至于不能收敛。如果使用的学习率偏小,那么极有可能训练时loss下降得很慢,算法也很难寻优。


     所以,一个很自然的策略就是在训练过程中使用动态的学习率机制。在算法优化的前期,我们使用较大的学习率,使得算法能够以较快的速度下降,而在优化的后期,逐步减小学习率的值,这样算法更容易收敛,得到一个较优的解。


     我们在keras中使用常数学习率:

keras.optimizers.SGD(lr=0.1, momentum=0.0, decay=0.0, nesterov=False)

     使用常数学习率的SGD优化器基于cifar-10训练过程如图1所示。可以看到整个过程出现了较大的波动。


     所谓动态的学习率策略也就是我们所说学习率衰减,常见的衰减策略包括基于时间的衰减、指数衰减、多项式衰减、余弦衰减等方法。


     基于时间的衰减如下式所示。衰减的学习率等于初始化的学习率除以衰减率与迭代次数的乘积。

     同样我们可以在keras中直接设置基于时间的衰减策略:

learning_rate = 0.1decay_rate = learning_rate / epochsmomentum = 0.8sgd = SGD(lr=learning_rate, momentum=momentum, decay=decay_rate, nesterov=False)


     对比图1效果如图2所示:

     相较于图1的常数学习率,基于时间调整的动态学习率机制的训练曲线明显要平缓了许多,不会有太大的波动。


     再来看看指数衰减。指数衰减的更新规则如下式所示:

    我们可以先定义一个指数衰减函数,然后将这个函数传入到keras的LearningRateScheduler回调函数中。使用LearningRateScheduler函数,我们可以自定义指数衰减函数。

def exp_decay(epoch): initial_lrate = 0.1 k = 0.1 lrate = initial_lrate * exp(-k*t) return lrate lrate = LearningRateScheduler(exp_decay)


     基于指数衰减策略的训练过程如图3所示:

     训练过程中学习率的指数衰减过程:



参考资料:

https://towardsdatascience.com/learning-rate-schedules-and-adaptive-learning-rate-methods-for-deep-learning-2c8f433990d1



往期精彩:

深度学习100问-10:如何部署一个轻量级的深度学习项目?

深度学习100问-9:为什么EfficientNet号称是最好的分类网络?

深度学习100问-8:什么是Batch Normalization?

深度学习100问-7:dropout有哪些细节问题?

深度学习100问-6:有哪些经典的卷积类型?

深度学习100问-5:如何阅读一份深度学习项目代码?

深度学习100问-4:深度学习应遵循怎样的论文研读路线?

深度学习100问-3:深度学习应掌握哪些Linux开发技术?

深度学习100问-2:深度学习应掌握哪些Git开发技术?

深度学习100问-1:深度学习环境配置有哪些坑?







一个算法工程师的成长之路

长按二维码.关注机器学习实验室


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存