深度学习100问-11:什么是学习率衰减?
深度学习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.1
decay_rate = learning_rate / epochs
momentum = 0.8
sgd = 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