写点什么

最强深度学习优化器 Ranger 开源:RAdam+LookAhead 强强结合,性能更优速度更快

  • 2019-09-09
  • 本文字数:4166 字

    阅读完需:约 14 分钟

最强深度学习优化器Ranger开源:RAdam+LookAhead强强结合,性能更优速度更快

Ranger 优化器将 RAdam 与 Lookahead 这两大新兴成果加以结合,共同构建起一套用于深度学习的优化器。为了证明其功效,我们团队最近利用 Ranger 优化器捕捉了 FastAI 全球排行榜上的 8 项上榜记录(详情见此处)。


作为 Ranger 优化器的组成部分,Lookahead 由 Geoffrey Hinton 在 2019 年 7 月的《LookAhead 优化器:前进 k 步,后退一步(LookAhead optimizer: k steps forward, 1 step back)》论文中首次提出。Lookahead 的灵感来自对神经网络损失面的最新理解进展,其提出了一种稳定深度学习训练与收敛速度的全新方法。基于 RAdam(Rectified Adam)实现的深度学习方差管理的突破,我发现将 RAdam 与 Lookahead 结合在一起,Ranger 足以成为一支充满活力的 “梦之队”,甚至比 RAdam 自身的优化水平更高。


我已经将二者结合成单一 Ranger 优化器代码库,旨在降低使用难度并整合至 FastAI 当中。目前,大家可以立即获取 Ranger 源代码。



Vanilla Adam、SGD 以及 Look Ahead + Adam/SGD 在 LSTM 上的对比结果(来自 LookAhead 论文)

RAdam 与 LookAhead 为什么能够实现互补

RAdam 可以说是优化器在开始训练时的最佳基础。RAdam 利用动态整流器根据方差调整 Adam 的自适应动量,并有效提供能够根据当前数据集定制的自动预热机制,能够确保训练以扎实的基础顺利迈出第一步。


LookAhead 则受到深度神经网络损失面的最新理解进展启发,能够在整个训练期间提供健壮且稳定的突破。


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


因此,二者都在深度学习优化的不同方面带来了突破,而且这种组合具有高度协同性,有望为大家的深度学习结果提供两项最佳改进。如此一来,通过将两项最新突破(RAdam + LookAhead)加以结合,Ranger 的整合成果有望为深度学习带来新的发展驱动力,帮助我们进一步追求更稳定且强大的优化方法。


Hinton 等人曾表示:“我们凭经验证明,Lookahead 能够显著提高 SGD 与 Adam 的性能,包括在 ImageNet、CIFAR-10/100、神经机器翻译以及 Penn Treebank 上的默认超参数设置场景之下。”



Lookahead 在实际应用中与 SGD 的前瞻性对比——Lookahead 凭借其双重探索设置成功给出更紧密的最小值结果。(来自 Lookahead 论文)


本文将基于之前的 RAdam 介绍,解释 Lookahead 究竟是什么,又是如何通过将 RAdam 与 Lookahead 结合至单一优化器 Ranger 当中,从而获得更高准确率的。这里先简单总结一下,我运行了 20 轮测试,个人得到了更高的准确率百分比,比目前 FastAI 排行榜记录高 1%:



Ranger 首次测试的准确率为 93%



FastAI 排行榜的 20 轮测试准确率为 92%


更重要的是,任何人都可以利用源代码与相关信息使用 Ranger,并检测其是否能够在稳定性与准确率方面为你的深度学习成果带来改善!


下面,我们将深入研究驱动 Ranger 的两大组件——RAdam 与 Lookahead:

RAdam (Rectified Adam)是什么

简单对 RAdam 作个总结:该项目的研究人员调查了自适应动量优化器(Adam、RMSProp 等)的机制,发现所有项目都需要进行预热,否则往往会在训练开始时带来糟糕的局部优化状态。



当优化器没有足够的数据来做出准确的自适应动量决策时,我们就会看到这些在训练初始阶段出现的糟糕表现。因此,预热有助于降低训练起步阶段时的差异……但即使已经确定了预热量需求,我们仍然需要手动调整并根据具体数据集的不同进行微调。


因此,Rectified Adam 应运而生,旨在利用基于所遇到的实际方差的整流函数确定“预热启发式”。整流器会以动态形式对自适应动量进行关闭及“压实”,确保其不会全速跳跃,直到数据的方差稳定下来。


通过这种方式,我们就顺利摆脱了手动预热的需求并能够使训练过程自动实现稳定。


一旦方差稳定下来,RAdam 在余下的训练过程中基本上充当着 Adam 甚至是 SGD 的作用。因此,可以看到 RAdam 的贡献主要在于训练的开始阶段。


读者朋友可能会在结果部分注意到,虽然 RAdam 在很长一段时间内的表现优于 Adam……但 SGD 最终仍会迎头赶上,并在准确率方面成功超越 RAdam 与 Adam。


在这方面,是时候请出 LookAhead 了,我们将其整合至一种新的探索机制当中,最终能够在超高轮数(甚至上千轮)的情况下继续保持对 SGD 的准确率优势。


Lookahead:探索损失面的辅助系统,带来更快且更稳定的探索与收敛效果


根据 Lookahead 的研究人员们所言,目前大多数成功的优化器都建立在 SGD 基础之上,同时加入:自适应动量(Adam、AdaGrad)或者一种加速形式(Nesterov 动量或者 Polyak Heavy Ball)以改善探索与训练过程,并最终收敛。


但是,Lookahead 是一种新型开发成果,其会保留两组权重而后在二者之间进行插值,从而推动更快权重集的“前瞻”或者探索,同时让较慢的权重集留在后面以维持长期稳定性。


结果就是,训练期间的方差有所降低,对次优超参数的敏感性下降,同时减少了对广泛超参数调整的需求。这种作法能够在多种深度学习任务之上实现更快收敛。换言之,这为我们带来了令人印象深刻的重大突破。



通过简单的类比,相信大家能够更好地理解 Lookahead 的作用。想象一下,我们身处山脉的顶端,而周边的峰峦则各有高低。其中一座最终延至山脚下构成了成功的通道,但其它则只是绕来绕去,无法帮助我们走到山脚。


亲自进行探索当然非常困难,因为我们在选定一条路线的同时,总会同时放弃其它路线,直到最终找到正确的通路。


但是,我们在山顶或者靠近山顶的位置留下一位伙伴,其会在情况看起来不妙时及时把我们唤回。这能帮助我们在寻找出路的时候快速取得进展,因为全部地形的探索速度将更快,而且被卡在死路中的可能性也更低。


Lookahead 的意义基本上就是这样。它会保留一个额外的权重副本,而后让内化得“更快”的优化器(在 Ragner 中,即 RAdam)进行 5 或 6 轮探索。轮处理间隔通过 k 参数进行指定。


LookAhead 随后,一旦 k 间隔触发,Lookahead 就会在其保存的权重与 RAdam 的最新权重之间进行差值相乘,并在每 k 个轮次乘以 alpha 参数(默认情况下为.5),同时更新 RAdam 的权重。



Ranger 代码显示,Lookahead 会更新 RAdam 的参数


结果实际上来自内部优化器(在本示例中为 RAdam)的快速移动平均值以及通过 Lookahead 的慢速移动平均值。快速平均值进行探索,慢速平均值则作为回撤或者稳定机制——一般来说,慢速平均值负责垫后,但有时候也会将快速平均值“压实”为正确概率更高的结果。


凭借 Lookahead 提供的安全性保障,优化器能够充分探索下山路径,而不再需要担心卡在死胡同中进退两难。


这种方法与目前的两种主流机制完全不同——即自适应动量以及“重球(heavy ball)”Nesterov 型动量。


因此,由于训练稳定性提到显著提高,Lookahead 能够更快结束探索并实现“压实”,最终获得超越 SGD 的准确率结果。

Ranger:一套利用 RAdam 与 Lookahead 的单一优化器整合代码库

Lookahead 能够与任意优化器共同运行以获取“快速”权重——论文当中使用的是初版 Adam,因为 RAdam 在一个月前才刚刚诞生。



LookAhead 的 PyTorch 集成 (lonePatient实现)


然而,为了便于同 FastAI 进行代码集成并实现更为广泛的应用,我进一步将二者合并为一款名为 Ranger 的单一优化器(Ranger 中的 RA 是为了致敬 Rectified Adam;而之所以选择 Ranger,是因为 LookAhead 的作用就像是在迷途时探索出路,如同「游侠」一般)。



上图为我个人在 ImageNette 上得到的 20 轮测试最高分数——这实际上也是我第一次使用 Ranger。(目前的排行榜为 92%。)另外需要注意,训练过程的稳定性也有所改善。

马上使用 Ranger!

目前 GitHub 上已经有多种 Lookahead 实现,我从 LonePatient 开始,因为我喜欢它简洁的代码风格,并以此为基础进行构建。至于 Radam,当然使用了来自官方的 RAdam GitHub 代码库。


Ranger 的源文件如下:


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


使用指南:


1 — 将 ranger.py 复制至你的项目目录。


2 — 导入 Ranger:



导入 Ranger 即可使用。


3 — 在 FastAI 当中创建一个分区以供 Ranger 使用,而后将学习方的 opt_func 指定该分区。



4 — 开始测试!




LookAhead 参数:


  • k parameter :— 用于控制在合并 Lookahead 权重之前需要运行的轮次数。常见的默认值为 5 或 6,我认为论文当中可能使用了 20 轮。

  • alpha = 用于控制更新所使用的 Lookahead 方差的百分比。默认值为.5。Hinton 等人对.5 的合理性做出了强证明,但可能还需要进行简单测试。


论文中还提到了后续的猜测,即可能可以根据训练进展的程度将 k 或 alpha 纳入调整范畴。


根据此前 RAdam 文章的反馈,我打算尽快发布一份 notebook,帮助大家快速将 Ranger 与 ImageNet 或者其它数据集配合使用,从而进一步降低 Ranger/RAdam/Lookahead 的使用门槛。

总结

两支彼此独立的研究团队,为实现深度学习的快速稳定优化算法做出了新的突破性贡献。我发现通过将 RAdam 与 Lookaheaad 加以结合,能够打造出协同优化器 Ranger,并最终在 ImageNet 的 20 轮测试中取得新的最高分。


后续,我还需要进一步测试以优化 Lookahead 与 RAdam 的 k 参数与学习率。不过即使着眼于当下,Lookahead 与 RAdam 已经足以减少手动超参数调整量,因此应该能够为大家提供新的训练结果优化途径。


Ranger 源代码目前已经正式发布,大家可以点击此处体验 RAdam 加 Lookahead 这个新组合能否进一步提升你的深度学习效果!


进一步测试表明,使用 Ranger 加上新的 Mish 激活函数(而非 ReLU)能够产生更好的结果。关于 Mish 的细节信息请参阅:


https://medium.com/@lessw/meet-mish-new-state-of-the-art-ai-activation-function-the-successor-to-relu-846a6d93471f


相关链接:


本示例中使用的 Lookahead 实现来自 LonePatient:


https://github.com/lonePatient/lookahead_pytorch/blob/master/optimizer.py


RAdam 代码(PyTorch):


https://github.com/LiyuanLucasLiu/RAdam


相关论文链接:


LookAhead (Zhang, Lucas, Hinton, Ba ) — “Lookahead Optimizer: k steps forward, 1 step back


RAdam (Liu, Jiang, He, Chen, Liu, Gao, Han) — “On the Variance of the Adaptive Learning Rate and Beyond


原文链接:


https://medium.com/@lessw/new-deep-learning-optimizer-ranger-synergistic-combination-of-radam-lookahead-for-the-best-of-2dc83f79a48d


2019-09-09 07:009125

评论

发布
暂无评论
发现更多内容

文档管理系统对于企业来说有哪些作用?

Baklib

Spring Cloud Stream 消息发送

急需上岸的小谢

8月月更

超人飞来!Flutter 实现满屏的力量感动画!

岛上码农

flutter ios 移动端开发 安卓开发 8月月更

每日一R「01」跟着大佬学 Rust

Samson

8月月更

MySQL权限管理

武师叔

8月月更

Java 多行字符串

HoneyMoose

开源一夏 | 基于 Serverless一键体验FastAPI

六月的雨在InfoQ

阿里云 开源 Serverless FC 8月月更

openEuler 资源利用率提升之道02:典型应用下的效果

openEuler

开源 数据 cpu 操作系统 openEuler

培训预告 | 企业应用现代化实用教程——DevOps方法论及最佳实践篇 8月11日上线

York

DevOps 云原生 团队建设 降本增效 应用现代化

借问变量何处存,牧童笑称用指针,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang类型指针(Pointer)的使用EP05

刘悦的技术博客

入门 教程 Go web 教程分享 入门介绍

SRv6故障管理

穿过生命散发芬芳

8月月更 SRv6

中断系统结构及中断控制详解

timerring

8月月更

舔狗至高境界,学会这个技巧让你从舔狗升华到海王【Python趣味爬虫】

Geek_ac6fb9

后端

抖音开启“818发现好物节”:电商平台造节活动何时休

石头IT视角

RocketMQ 详解系列

牧小农

RocketMQ

低代码实现探索(四十七)低的不止前端,还有后端

零道云-混合式低代码平台

微服务架构的核心关键点

阿泽🧸

微服务架构 8月月更

什么是Shell?从小白到入门你只差一个它

Albert Edison

Linux centos 运维 shell脚本编程 8月月更

【高并发】别闹了,要实现亿级流量下的分布式限流,这些算法你必须掌握!!

冰河

并发编程 多线程 高并发 协程 异步编程

分门别类输入输出,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang基本数据类型和输入输出EP03

刘悦的技术博客

golang 编程 教程 教程分享 golang 面试

开源一夏 | jQuery对于链和捕获的实战研究

恒山其若陋兮

开源 8月月更

Unity Metaverse(四)、接入环信IM SDK 实现用户登录注册

CoderZ

Unity 登录验证 环信im 8月月更

Kubernetes与OpenStack

CTO技术共享

开源 OpenStack 签约计划第三季 8月月更

Go-Excelize API源码阅读(四)——Save()

Regan Yue

Go 开源 源码刨析 8月日更 8月月更

Linux下Docker安装部署以及云原生的理解

Geek_acae888666

云原生 Docker 镜像

阿里云数据库PolarDB开源人才培养计划发布!万元好礼等你来拿!

阿里云数据库开源

数据库 阿里云 开源 认证 polarDB

企业进行知识共享的好处有哪些?

Geek_da0866

经验分享|低成本快节奏搭建企业知识管理系统的方法

Baklib

兼容并蓄广纳百川,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang复合容器类型的声明和使用EP04

刘悦的技术博客

golang go doc 教程 教程分享 golang 面试

头脑风暴:打家劫舍2

HelloWorld杰少

算法 LeetCode 动态规划 8月月更

直播 | 服务餐饮商户年交易额超 7000 亿,哗啦啦如何用 StarRocks 搞定实时报表

StarRocks

数据库

最强深度学习优化器Ranger开源:RAdam+LookAhead强强结合,性能更优速度更快_AI&大模型_Less Wright_InfoQ精选文章