使用 fastai 的 learn.lr_find() 选择 learning_rate

Choosing the learning_rate using fastai's learn.lr_find()

我正在研究在 Kaggle 上发布的这个 Heroes Recognition ResNet34 笔记本。

作者使用fastai的learn.lr_find()方法求最优学习率

根据学习率绘制损失函数得到下图:

看起来 1e-1 的损失达到了最小值,但在下一步中作者将 1e-2 作为 fit_one_cycle 中的 max_lr 以训练他的模型:

learn.fit_one_cycle(6,1e-2)

为什么在此示例中使用 1e-2 而不是 1e-1?这不会只会让训练变慢吗?

lr_find 中学习率范围测试的想法来自 Leslie Smith 的这篇论文:https://arxiv.org/abs/1803.09820 那有很多其他有用的调整技巧;值得仔细研究。

在lr_find中,学习率缓慢上升(以对数线性方式)。您不想选择损失最低的点;你想选择每一步下降最快的点(=net 正在尽可能快地学习)。这确实发生在下坡或 1e-2 中间的某个地方,所以写笔记本的人是对的。 0.5e-2 和 3e-2 之间的任何值都具有大致相同的斜率,并且是一个合理的选择;较小的值将对应于更慢的学习(=需要更多的时期,也更少的正则化)但过早达到高原的风险更小。

我将尝试添加一些关于此测试中损失最低时发生的事情的直觉,比如学习率=1e-1。此时,梯度下降算法正朝着梯度方向迈出大步,但loss并没有减少。这怎么会发生?好吧,如果步长一直太大,就会发生这种情况。想想在损失景观中试图进入一口井(或峡谷)。如果您的步长大于井的大小,您可以每次都越过它并最终到达另一边。

这张来自 nice blog post by Jeremy Jordan 的图片直观地展示了它:

图中是梯度下降爬出井,步长过大(可能你的测试中lr=1+0)。我认为除非 lr 真的过高,否则这种情况很少发生。更有可能的是,这口井位于一个相对平坦的地貌中,梯度下降可以跨过 它,一开始就无法进入井中。高维损失景观很难可视化,并且可能非常不规则,但从某种意义上说,lr_find 测试正在寻找景观中典型特征的规模,然后选择一个学习率,让你有一个步骤尺寸相似但小一点。