美文网首页计算机视觉笔记
把RAdam和LookAhead协同打造最强的优化器

把RAdam和LookAhead协同打造最强的优化器

作者: 图像算法 | 来源:发表于2019-08-28 11:17 被阅读0次

    一篇由知名深度学习研究员Geoffrey Hinton撰写的新论文介绍了LookAhead优化器(“LookAhead优化器:k步前进,后退一步”,2019年7月)。Lookahead的灵感来自对神经网络损耗表面理解的最新进展,并提出了一种稳定深度学习训练和收敛速度的全新方法。在RAdam(Rectified Adam)实现的深度学习方差管理突破的基础上,我发现将RAdam和LookAhead结合在一起可以产生一个动态的梦之队,甚至比单独的RAdam更优化。

    我已将两者合并为一个Ranger优化器代码库,以便于使用和集成到FastAI中,Ranger源代码可供您立即使用

    为什么RAdam和LookAhead是互补的:

    RAdam可以说是优化者在培训开始时建立的最佳基础。RAdam利用动态整流器根据方差调整Adam的自适应动量,并有效地提供自动预热,根据当前数据集定制,以确保扎实的训练开始。

    LookAhead受到深度神经网络损失表面理解的最新进展的启发,并在整个训练期间提供了稳健和稳定探索的突破。

    引用LookAhead团队 - LookAhead“减少了对广泛超参数调整的需求”,同时实现“以最小的计算开销实现不同深度学习任务的更快收敛”。

    因此,两者都在深度学习优化的不同方面提供了突破,并且这种组合具有高度协同性,可能为您的深度学习结果提供最佳的两种改进。因此,对更加稳定和强大的优化方法的追求仍在继续,通过结合两项最新突破(RAdam + LookAhead),Ranger的整合有望为深度学习提供又一步。

    因此,本文基于之前的RAdam介绍来解释LookAhead是什么,以及如何通过将RAdam和LookAhead组合到单个优化器Ranger中,获得了新的高精度。 从字面上看,我测试的第一个20个epoch,我个人看到了一个新的高%精度,比目前的FastAI排行榜标记高1%:

    更重要的是,任何人都可以使用源和使用信息让Ranger工作,看看它是否在稳定性和准确性方面都没有改善您的深度学习效果!

    让我们深入研究驱动Ranger的两个组件--RAdam和LookAhead:

    1 - 什么是RAdam(Rectified Adam):

    我将向您介绍我之前在RAdam上详细介绍的文章。然而,简短的总结是开发RAdam的研究人员调查了自适应动量优化器(Adam,RMSProp等)的原因。所有这些都需要热身,否则他们往往会在训练开始时接近糟糕/可疑的局部最佳状态。

    当优化器根本没有看到足够的数据来做出准确的自适应动量决策时,在训练开始时发现原因是过度的变化。热身因此有助于减少训练开始时的差异......但即使决定多少热身就足够了,需要手动调整并根据日期设置改变数据集。

    因此,Rectified Adam是通过使用基于所遇到的实际方差的整流函数确定“预热启发式”来构建的。整流器动态地关闭和/或“夯实”自适应动量,使得它不会全速跳跃,直到数据的方差稳定下来。

    通过这样做,避免了对手动预热的需要并且训练自动稳定。

    一旦差异稳定下来,RAdam基本上成为亚当甚至SGD等同于其余的训练。因此,RAdam的贡献是在训练开始时。

    读者注意到在结果部分中,虽然RAdam在很长一段时间内表现优于亚当......但SGD最终可以赶上并且可以超越RAdam和Adam的最终准确度。

    我们现在转向LookAhead,整合一种新的探索机制,即使在1000个时代之后也可以超越SGD。

    2 - Lookahead - 探索损失面的伙伴系统=更快,更稳定的探索和收敛。

    正如LookAhead的研究人员所说,目前,大多数成功的优化器都是建立在SGD基础之上的

    1 - 适应性动量(Adam,AdaGrad)或

    2 - 一种加速形式(Nesterov动量或Polyak Heavy Ball)

    改善探索和培训过程,最终收敛。

    结果是训练期间的方差减小,对次优超参数的敏感性降低,并且减少了对广泛的超参数调整的需求。这样做可以在各种深度学习任务上实现更快的收敛。换句话说,这是一个令人印象深刻的突破。

    通过简单的类比,LookAhead可以被认为如下。想象一下,你处于山脉的顶端,周围有各种各样的落差。其中一个导致了底部和成功,但其他人只是裂缝没有好结局。

    要自己探索会很难,因为你必须放弃每一个,并假设它是一个死胡同,找到你的方式退出。

    但是,如果你有一个会留在顶部或靠近顶部的伙伴并且如果事情看起来不太好就帮你拉回来,你可能会在找到最好的方式上取得更大进展,因为探索全部地形会进行得更快,并且更不容易被卡在坏裂缝中。

    这基本上就是LookAhead所做的。它保留了一个额外的权重副本,然后让内化的“更快”优化器(对于Ranger,即RAdam)进行5或6批次的探索。批处理间隔通过k参数指定。

    然后,一旦k间隔被击中,LookAhead将其保存的权重与RAdam的最新权重之间的差值相乘,并在每k个批次乘以alpha参数(默认情况下为.5),并更新RAdam的权重。

    结果实际上来自内部优化器(在本例中为RAdam)的快速移动平均值和通过LookAhead的较慢的指数移动平均值。快速探索但慢速探测作为回撤或稳定机制 - 通常在平均探索速度较快的情况下保持落后,但在某些情况下,将较快的一个推向更有希望的斜率,而速度更快的探测继续探索。

    凭借LookAhead的安全性,优化器可以更充分地探索景观,而不必担心卡住。

    这种方法与目前使用的两种主要方法完全不同 - 自适应动量或“重球”/ Nesterov型动量。

    因此,由于提高了训练稳定性,LookAhead结束了探索并更快地找到了“向下”的方式,因此甚至超越了SGD。

    3 - Ranger - 一个使用RAdam和LookAhead的优化器的集成代码库。

    Lookahead可以与任何优化器一起运行以获得“快速”权重 - 该文件使用了vanilla Adam,因为RAdam在一个月前甚至没有。

    然而,为了便于与FastAI进行代码集成以及一般的使用简单性,我继续将两者合并为一个名为Ranger的单一优化器(Ranger中的RA用于向Rectified Adam致敬,Ranger作为一个整体名称,因为LookAhead是杰出的 探索失落的地形,就像一个真正的Ranger。

    4 - 今天使用Ranger!

    在github上有几个LookAhead的实现,我从LonePatient开始,因为我喜欢它的代码简洁,然后构建在它上面。RAdam当然是来自官方的RAdam github代码库。

    Ranger的源文件在这里:

    https://github.com/lessw2020/Ranger-Deep-Learning-Optimizer

    如何使用:

    1 - 将ranger.py复制到您的工作目录。

    2 - import ranger:

    3 - 创建一个部分准备Ranger用于FastAI,并将学习者的opt_func指向它。

    4 - 开始测试!

    LookAhead参数:

    k参数:- 它控制在与LookAhead权重合并之前要运行的批次数。5或6是常见的默认值,我相信在论文中使用了多达20个。

    alpha = this控制要更新的LookAhead差异的百分比。.5是默认值。Hinton等人强有力地证明.5可能是理想的,但可能值得进行简短的实验。

    本文提到的一个未来想法可能是根据培训进展的程度将k和/或alpha放在计划表上。

    笔记本电脑即将推出:根据RAdam文章的反馈,我计划很快添加一款笔记本,让您快速将Ranger与ImageNet或其他数据集配合使用,从而轻松使用Ranger / RAdam / LookAhead。

    (我计划今天发布它,但过去两天我的当前GPU提供商一直不断抢先一步,并且不想进一步推迟这篇文章......)。

    摘要:

    两个独立的研究团队为实现深度学习的快速稳定优化算法的目标取得了新的突破。我发现通过结合这两者,RADam + LookAhead,生成协同优化器(Ranger),并以ImageNette 20时代得分的一个新高来验证。

    需要进一步测试以优化使用LookAhead的RAdam的k参数和学习速率,但LookAhead和RAdam都减少了先前为实现最新结果所需的手动超参数调整量,并且应该帮助您走向新的道路最先进的培训结果。

    Ranger可以在这里立即进行测试,看看Ranger内部的这个动态组合RADam + LookAhead是否不会进一步提高您的深度学习效果!

    更多论文源码关注微信公众号:“图像算法”或者微信搜索账号imalg_cn关注公众号

    相关文章

      网友评论

        本文标题:把RAdam和LookAhead协同打造最强的优化器

        本文链接:https://www.haomeiwen.com/subject/pnrpectx.html