深度学习革命带来了新技术和新思想的旋风。 在模型优化领域,两个最有影响力的新思想是学习率调度器(随着时间的推移修改学习率超参数而不是保持它们恒定)和自适应优化器(使用模型自身的反馈来近似梯度)。
在本文中,我们将讨论学习率调度器和优化器的历史,从而产生当今从业者最熟悉的两种技术:周期性学习率(速率)和 Adam 优化器。 因为(出于我们稍后讨论的原因)不可能同时使用这两种技术,我们还将讨论这两种技术之间的权衡:例如,您应该选择哪种技术以及何时选择。
第一个流行的学习率调度器:
所有优化器都有一个学习率超参数,它是影响模型性能的最重要的超参数之一。
在最简单的情况下,学习率是固定的。 然而,之前发现的经验是,选择较大的初始学习率,然后随着时间的推移缩小它,会带来更好的收敛性和更高性能的模型。 这称为退火或衰变。
在模型训练的早期阶段,模型仍在向梯度空间大步迈进,较大的学习率有助于模型更快地找到所需的粗略值。
在模型训练的后期,情况恰恰相反。 该模型已经具有大致正确的梯度; 它只需要一点额外的推动即可找到性能的最后几个百分位数。 大梯度不再合适,因为它会“超过()”最佳点。 这样,模型就不会收敛到全局最小成本,而是会跳来跳去:
这一发现普及了第一个著名的学习率调度器(torch.optim..)。 需要输入步长 ()、耐心值 () 和冷却时间 ()。 完成每批训练后,检查模型性能是否有所提高。 如果在达到耐心批次之前模型性能没有提高,则学习率会降低(通常为 10 倍)。 冷却期结束后,再次重复该过程,直到完成最后一批训练。
在几乎所有情况下,此技术都可以将性能提高一两个百分点。 因此,直到 2015 年,提前停止 ( )、 和随机梯度下降 ( ) 的组合都是最先进的或接近最先进的。
自适应优化器
2015年,论文《Adam: A For》发布,介绍了第一个受到广泛关注的自适应优化器Adam(torch..Adam)。
自适应优化器避免使用单独的学习率调度器,而是选择将学习率优化直接嵌入到优化器本身中。 事实上,Adam 更进一步,根据每个权重来管理学习率。 换句话说,它为模型中的每个自由变量提供了自己的学习率。 Adam 实际上分配给该学习率的值是优化器本身的实现细节,而不是您可以直接操作的东西。
与 相比,Adam 有两个引人注目的优势。
第一cffps优化器,模型性能。 这是一个更好的优化器。 简而言之,它训练了一个性能更高的模型。
其次,Adam 几乎没有参数。 Adam 确实有一个学习率超参数,但该算法的自适应性质使其非常稳健 - 除非默认学习率偏离一个数量级,否则更改它不会对性能产生太大影响。
Adam 不是第一个自适应优化器(该荣誉属于其 2011 年发布的版本),但它是第一个对于通用目的而言足够强大且快速的优化器。 发布后,Adam 立即取代 SGD Plus 成为大多数应用程序的最佳设置。 此后出现了一些改进的变体(例如 Adamw),但出于一般目的,这些无法取代原始的 Adam。
由于 Adam 在内部管理学习率,因此它与大多数学习率调度程序不兼容。 任何比简单的学习率()和/或衰减更复杂的事情都会导致Adam优化器在管理其内部学习率时“杀死”学习率调度程序,从而导致模型收敛性恶化。
这使得 Adam 与我们将在接下来的两节中介绍的两种技术完全不兼容——余弦退火( )和单周期学习(one-cycle),这两种学习率调度器都可以用学习率做一些棘手的事情。 和有趣的事情。 在本文的最后一部分,我们讨论 Adam 和这两种技术的更现代的单周期学习之间的权衡。
余弦退火热重启(warm)
2017年的论文《SGDR: with Warm》普及了热重启的思想。 学习率调度程序,结合热重启偶尔重新提高学习率。 下面的一个简单的线性示例展示了这是如何完成的:
热重启通常会导致模型发散()。 这是故意的。 结果表明,添加一些可控发散可以使模型围绕任务成本平面的局部最小值工作,从而使模型能够找到更好的全局最小值。 这类似于发现一个山谷,然后爬上附近的一座山发现更深的山谷。 这是一个直观的理解:
两个学习者都收敛到相同的全局最小值。 然而,在左边,学习者沿着低梯度路径缓慢移动。 在右侧,学习器陷入一系列局部最小值(山谷),然后使用热重启来爬过它们(山丘)。 在此过程中,它将更快地找到相同的全局最小值,因为它所采用的路径总体上具有更高的梯度。
fast.ai 推广了一种同时使用热重启和余弦退火的学习率调度器:
余弦退火比线性退火具有更好的收敛行为,其原因尚不完全清楚。
多年来,该学习率调度程序一直是该框架使用的默认调度程序。 它首次在 2018 年 2 月发布的 0.3.1 版 (torch.optim..) 中提供。
一周期学习率调度器(One-cycle rates)
fast.ai 不再推荐余弦退火,因为它不再是性能最高的通用学习率调度程序。 现在,这一荣誉属于单周期学习率调度器。
单周期学习率调度器在2017年的论文《Super-: Very Fast of Using Large Rates》中介绍过。 论文采用以下学习率策略(学习率和动量均适用):
理想情况下,学习率和动量应设置为一个恰好导致网络在峰值时开始发散的值。 训练计划的其余部分包括热身期、放松期和微调期。 请注意,在微调过程中,学习率下降到初始值的十分之一。
当学习率非常高时,动量方向相反,这就是为什么动量在优化器中以与学习率相反的方式进行退火的原因。
单周期学习率调度器或多或少使用了余弦退火热重启学习率调度器所使用的机制,但形式因素不同。
其中,实现略有改变,再次从线性退火切换到余弦退火:
建议使用单循环加SGD而不是Adam,因为经过一些调整(正确获得最大学习率尤其重要),它可以在更短的时间内训练出性能大致相同或稍差的模型。 这种现象被上面提到的单周期论文的作者史密斯称为超收敛(Super-)。 例如,本文显示了以下性能:
虽然您不应期望在实践中得到如此引人注目的结果,但超收敛已经在广泛的数据集和问题领域中证明了自己。
2019年8月,实现了单周期学习率调度器(torch.optim..)。
2021年展望
尽管fast.ai大力倡导,但目前大多数从业者仍然使用Adam优化器作为默认设置。
例如,如果您浏览最近比赛的启动器内核,您会发现 Adam 的使用占主导地位。 正如我上面所解释的,很大程度上是因为 Adam 本质上没有参数,所以它对模型变化的鲁棒性比 Adam 强得多。 开发变得更加容易,因为需要调整的超参数减少了。 在实际应用中,这些优势似乎比超收敛的计算优势更重要。
然而,一旦进入中型模型训练项目的后期优化阶段,就非常值得尝试从 Adam 转向。 想象一下,如果您的模型能够在 25% 的时间内实现 98% 的性能,那么您作为算法工程师的生活将会变得多么轻松!
如果您有足够的时间进行调整,超收敛是一个非常有吸引力的特性。 这就是为什么许多快速深度学习培训指南将其作为首要培训技巧之一。
原文:spell.ml/blog/lr--and---
标题:讨论学习率调度器和优化器的历史以及影响力
链接:https://www.52funs.com/news/xydt/4149.html
版权:文章转载自网络,如有侵权,请联系删除!