0 前言
学习率(learning rate)是网络训练中最重要的超参数之一, 学习率可以控制模型的训练速度, 甚至影响模型的收敛性。 因此一个好的学习率设置是非常重要的。 深度学习炼丹师们日常工作的一部分就包含调试一个好的超参数。
实践中, lr一般很少是固定的,因为在模型训练的不同阶段,对学习率的敏感性不同, 设置一个固定的并不太科学。 比如, 一般开始阶段lr可以稍大一些, 让模型快速学习, 到后面阶段, lr要小一些, 避免振荡。 也有些场景, 一开始需要做一些warmup, 等等。 总之, lr的改变可以有很多策略, 不同场景下需要的最优策略也不同。
这些设置一般也很难有理论的保障,一般都是根据实际经验进行设置。
1 恒定lr
这是最简单的一种形式了, 也就是学习率从始至终始终保持不变。
2 分段lr
顾名思义,就是学习率是一个分段函数, 在不同阶段采用不同的学习率。
常用的有2种, StepLR 和MutiStepLR。 StepLR只能均匀的变化, 也就是固定的step(或epoch)后学习率固定变化。 MutiStepLR则灵活一些,可以在指定的步长的位置改变学习率。 但是控制参数也更多一些。
实际上, StepLR可以看做MutiStepLR的一种特殊形式。
比如, 下图中StepLR策略为每30个epoch, 学习率降低10倍。
下图中的MutiStepLR策略为在30和80个 epoch的位置, 学习率降低10倍。
3 指数lr
学习率以指数规律变化(一般是降低)。
4 CosineAnnealingLR
学习率以正弦规律变化。一般情况下, 只取半个或一个周期。 半个周期一般都是从最大到最小, 一个周期一般都是从最小到最大, 再到最小。
5 CyclicLR
顾名思义, 就是学习率以某种规律循环变化, 变化的规律可以有很多(如下图中就是一种线性变化)。 其实上面的CosineAnnealingLR在取多个周期的时候也是一种CyclicLR。
6 OneCycleLR
其实有了上面的CycleLR, 理解OneCycleLR就非常简单了。OneCycleLR其实就是只取CycleLR的一个周期。
7 WarmupLR
所谓warmup, 就是指在一开始的时候学习率较小, 然后逐步变大。
这个策略经常和其他LR的策略结合使用。 如warmupLR + StepLR, 就是lr先从lr_min增加到lr_max, 然后再以StepLR的策略逐步变小。 再比如, warmupLR +CosineAnnealingLR, 就是学习率r先从lr_min增加到lr_max, 然后再以余弦规律下降。