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

She*_*don 5 pytorch kaggle fast-ai cnn

我正在阅读Kaggle 上发布的这个Heroes Recognition ResNet34 notebook。

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

根据学习率绘制损失函数会产生下图:

在此处输入图片说明

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

learn.fit_one_cycle(6,1e-2)

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

Ale*_*x I 11

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

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

我将尝试添加一些关于在此测试中损失最低时发生的情况的直觉,例如学习率 = 1e-1。此时,梯度下降算法在梯度方向上采取了很大的步长,但损失并没有减少。这怎么会发生?好吧,如果步长始终太大,就会发生这种情况。想想在损失景观中尝试进入井(或峡谷)。如果您的步长大于井的大小,则您每次都可以始终如一地跨过它并最终走到另一边。

Jeremy Jordan 的一篇不错的博客文章中的这张图片直观地展示了它: 在此处输入图片说明

在图片中,它显示了梯度下降通过过大的步长从井中爬出(在您的测试中可能是 lr=1+0)。我认为这种情况很少发生,除非 lr 真的过分了;更有可能的是,井在相对平坦的景观中,梯度下降可以跨过它,首先无法进入井中。高维损失景观很难可视化,并且可能非常不规则,但从某种意义上说,lr_find 测试正在寻找景观中典型特征的规模,然后选择一个学习率,该学习率为您提供类似大小的步长但有点小。

  • 您无需猜测最陡点。`_, lr_steepest = learner.lr_find()` 给了你要点。 (2认同)