文 | 小轶

编 | 夕小瑶


背景

Google Brain团队发布的一篇最新论文在外网引发热议,或将成为Deep Learning发展历程上里程碑式的工作。它所讨论的,是所有AI行业者都要面对的——Deep Learning中的优化问题。也就是,如何更好地训练一个模型

深度模型的训练过程是非常困难的,常见的挑战包括:陷入局部极小值、梯度消失/爆炸、长期依赖(long dependency)等等。但对于大多数算法工程师来说其实并没有这么复杂。因为学术界早已陆续提出了许多卓有成效的优化器,比如AdaGrad、Adam、Momentum等等,都可以一定程度解决上述种种问题。而算法工程师搭完模型后,需要做的只有一件事——调参 :)

如果说深度学习的兴起为算法工程师省去了繁琐的特征工程(特征设计与特征选择),今天介绍的Google这篇工作就是致力于为大家省去繁琐的“调参工程”(优化器设计与优化器选择)。

深度学习用大量的训练数据替代了特征工程,同样的道理,这篇工作致力于用大量训练任务和模型来替代人工设计的优化器(Adam、Momentum等),这种以任务和模型为食的general-purpose的优化器模型,就称之为learned optimizer,可广泛适用于各类任务,无需手动调节优化器参数(如学习率,batch size...)。

实验不仅证明了learned optimizer的普适性,更是发现了这种优化器的一些惊人特性。比如,它甚至可以根据训练过程中的validation loss,隐性地做到正则化规约。最令人惊叹的是,该优化器甚至可以用来从头训练一个新的general-pupose优化器——也就是说,这是一个可以自己优化自己的优化器!

论文题目
《Tasks, stability, architecture, and compute: Training more effective learned optimizers, and using them to train themselves》

论文链接:
https://arxiv.org/pdf/2009.11243.pdf

Arxiv访问慢的小伙伴也可以在 【夕小瑶的卖萌屋】订阅号后台回复关键词 【1020】 下载论文PDF~

方法

接下来,我们就来看看这个神仙优化器是如何训出来的。在探讨其具体模型结构之前,我们先来理清楚优化器训练所需要的是什么样的数据集,以及目标函数是什么。

优化器训练的数据集

learned optimizer(下文简称 )的训练所需要的每个训练样本x都是一个需要在某任务上训练的深度学习模型,样本的标签y则是该模型在其对应任务上的开发集loss,即训练集为:

对于数据集里的每个训练样本 (模型),都

  • 可以采用不同的模型结构

  • 用于完成不同的任务,称为 inner-task

  • 有属于自己的数据集,称为 inner-dataset

比如,

  • 可能是一个用于文本分类的RNN,用的inner-dataset是YELP-5

  • 可能是一个做图像分类的CNN,用的inner-dataset是数据集CIFAR-10

作者实际共设置了 6000 个不同种类的模型。涵盖了RNNs、CNNs、mask auto regressive flows、全连接网络、语言模型、VAE、simple 2D test function、quadratic bowls等...

优化器训练的目标函数

我们都知道,通常一个深度学习模型的训练就需要极大的算力支撑。而此处令人咋舌的是,按照上述设定,我们需要完成6000个模型的训练才能为learned optimizer( )完成1轮训练

的一轮训练过程大致如下图所示(为说明得更加清楚,图中采用的是full batch进行参数更新,也就是每个batch直接包含全部样本):

  1. 先用 训练n个 (理想情况下,每个 应该一直训练到收敛,但考虑到算力的问题,实际上训练240~360个step就停止了)

  2. 每个 都有自己的inner-dataset,我们在它的inner-dataset的验证集上计算 的损失函数

  3. 的损失函数即为所有 的 的平均

  4. 用 的损失函数对其进行参数更新

优化器的结构

其实learned optimizer的概念并不是在这篇论文中首次提出来的,不过论文作者argue了learned optimizer的结构和优化器训练所基于的任务集都会非常非常影响最终learned optimizer的表现。因此本文提出了一种层级的优化器结构,实验表明优于前人提出的learned optimizer结构。

设计learned optimizer结构的关键是平衡计算效率和表达能力

ps:预训练时代的军备竞赛可以疯狂追求模型表达能力,不顾及计算效率(想想BERT和Google T5放出时的恐惧)。但是优化器模型就不能这么任性了,TPU也耗不起

因此,优化器结构一般都不会太复杂,如下图所示

上图的优化器结构是ICML2019上提出的,使用了一个全连接网络(Feed-Forward,FF)。当模型完成了一个step的训练后,就用这个FF对每个参数进行更新。FF的输入端是模型某个参数 的梯度,以及该参数的其他feature(如Momentum等)。FF的输出端是w的更新值 ,则该参数将被更新为 。注意,这个FF每跑一次,只完成了一个参数的更新

上图就是paper中提出的优化器结构了。下半部分的FF与上面ICML2019的优化器实现类似,都是用于求某个参数的更新值,称为Per-parameter FF。与之前不同的是,这个FF还会接收到全局信息(如train/valid loss),以及该参数所在张量的信息(如张量形状,gradient norm等)。相关信息来自于上方的LSTM。文中称其为Per-tensor LSTM

实验

与常见优化器的比较

下图展示了与常见优化器(AdamLR、Adam8p、opt_list)的比较结果。实验中,总共测试了100个任务下使用learned optimizer后的性能提升比例。在各个任务上提升比例分布用箱图表示。

纵轴代表了不同设置下的三个basline优化器。最上面3个Global XXX的设定是:该baseline优化器对于所有任务都采用相同的超参数。而下面6个Per Task XXX对不同任务可以采用不同超参数,括号中的XXX Trial代表尝试调参的轮数。每一种baseline,都对应了两条同色系的箱图。这是因为用于测试的100个测试任务中,有一部分是learned optimer训练过程中见过的,有一部分从未见过。同色系的两个箱图中,上面那条代表在见过的那些任务上的提升效果,另一条代表在从未见过的那部分任务上的提升效果。

图中箱图的分布并不十分集中,可见提升效果对于不同的任务也各不相同。但总体来说,与适度调参的baseline相比,都有一定程度的提升效果。

隐性的正则化惩罚项

在机器学习中,时常会在目标函数中加入正则化惩罚项,从而对模型的复杂度进行规约。下图展示了Adam和learned optimizer在优化目标函数 时的收敛轨迹。显然直线 上目标函数最小。但可以看到Adam会直接垂直地收敛到 上。而learned optimizer在收敛过程中还会有逐渐接近原点的趋势。作者认为这是由于接近原点处的(x,y)范数较小,表明learned optimizer有隐式地进行正则化规约。

可以优化自己的优化器

最后,Google Brain团队脑洞大开地用这个learned optimizer再从头训练一个新的自己!作为比较的是,作者在训练它的时候使用的两种优化器设置(图中橙色和绿色曲线)。可以看到learned optimizer取得了非常相近的训练曲线。作者认为,这个实验进一步证明了该优化器的超强普适性。因为,对优化器进行优化是一个全新的任务,与这个优化器训练过程中见过的所有任务都完全不同。

小结

一个可以不用调参、适用于所有训练任务的优化器。如此的脑洞大开、又敢想敢做,不知道除了Google还有哪里可以。

萌屋作者:小轶

刚刚本科毕业于北大计算机系的美少女学霸!目前在腾讯天衍实验室做NLP研究实习生。原计划是要赴美国就读CMU的王牌硕士项目MCDS,不过因为疫情正处于gap year,于是就来和小夕愉快地玩耍啦~文风温柔优雅,偶尔暴露呆萌属性,文如其人哦!知乎ID:小轶。

作品推荐:

1.有钱可以多任性?OpenAI提出人肉模型训练,文本摘要全面超越人类表现!

2.ACL20 Best Paper揭晓!NLP模型评价体系或将迎来重大转折

3.Attention模型:我的注意力跟你们人类不一样

后台回复关键词【入群

加入卖萌屋NLP/IR/Rec与求职讨论群

有顶会审稿人、大厂研究员、知乎大V和妹纸

等你来撩哦~

谷歌重磅:可以优化自己的优化器!手动调参或将成为历史!?相关推荐

  1. pytorch 优化器 机器学习 调参

    torch.optim 如何使用optimizer 构建 为每个参数单独设置选项 进行单次优化 optimizer.step() optimizer.step(closure) 算法 如何调整学习率 ...

  2. 使用贝叶斯优化工具实践XGBoost回归模型调参

    0. 关于调参 0.1. 超参数 在机器学习的上下文中,超参数(hyper parameters)是在开始学习过程之前设置值的参数,而不是通过训练得到的参数数据.通常情况下,需要对超参数进行优化,给学 ...

  3. 谷歌发布颠覆性研究:不训练不调参,AI自动构建超强网络,告别炼丹一大步...

    来源:凹非寺 机器学习全靠调参?这个思路已经过时了. 谷歌大脑团队发布了一项新研究: 只靠神经网络架构搜索出的网络,不训练,不调参,就能直接执行任务. 这样的网络叫做WANN,权重不可知神经网络. 它 ...

  4. 随机森林算法及贝叶斯优化调参Python实践

    1. 随机森林算法 1.1. 集成模型简介 集成学习模型使用一系列弱学习器(也称为基础模型或基模型)进行学习,并将各个弱学习器的结果进行整合,从而获得比单个学习器更好的学习效果. 集成学习模型的常见算 ...

  5. 暴力调参——GridSearchCV、RandomizedSearchCV、贝叶斯优化

    https://blog.csdn.net/juezhanangle/article/details/80051256 http://www.360doc.com/content/18/0707/15 ...

  6. 谷歌大脑提出VeLO优化器,无需调参,最高比Adam快16倍!

    文 | 萧箫 发自 凹非寺 源 | 量子位 还在苦恼怎么给优化器调整更好的参数吗? 现在,谷歌大脑搞出了一个新的优化器VeLO,无需手动调整任何超参数,直接用就完事了. 与其他人工设计的如Adam.A ...

  7. 重磅 | 2017年深度学习优化算法研究亮点最新综述火热出炉

    翻译 | AI科技大本营(微信ID:rgznai100) 梯度下降算法是机器学习中使用非常广泛的优化算法,也是众多机器学习算法中最常用的优化方法.几乎当前每一个先进的(state-of-the-art ...

  8. MongoDB 教程五: MongoDB固定集合和性能优化 (索引Indexes, 优化器, 慢查询profile)

    mongodb索引详解(Indexes) 索引介绍 索引在mongodb中被支持,如果没有索引,mongodb必须扫描每一个文档集合选择匹配的查询记录.这样扫描集合效率并不高,因为它需要mongod进 ...

  9. pytorch 优化器调参

    torch.optim 如何使用optimizer 构建 为每个参数单独设置选项 进行单次优化 optimizer.step() optimizer.step(closure) 算法 如何调整学习率 ...

最新文章

  1. Android中Context 的理解
  2. flask_sqlalchemy 多对多 关系 对中间表的操作
  3. 让我来教你 PHP 函数调用
  4. 对话尹成杰三农谋定压舱石-农业大健康·万祥军:稳农保供
  5. mongoDB的shell数组操作器
  6. Linux服务器CPU、内存、磁盘空间、负载情况查看python脚本
  7. OpenCV Laplace point/edge detection拉普拉斯点/边缘检测的实例(附完整代码)
  8. The literal of int xxxxx is out of range
  9. 实验吧-密码学-杯酒人生(特殊凯撒--维吉尼亚密码)(凯撒加解密脚本、维吉尼亚密码加解密脚本)...
  10. 方格路径问题!【转】
  11. CVPR 2020 论文大盘点-目标检测篇
  12. android蓝牙协议名词解释 OPP HFP HDP A2DP PAN
  13. SQL中LIMIT子句介绍
  14. 关于DIPS的MVC 4.0项目发布与在IIS 7.0上的部署的方法
  15. Chrome对应webdriver版本
  16. Opencv与python实现多目标跟踪 (一) - PaddleDetection目标检测
  17. PlayStation@4功能介绍及测试应用
  18. 学习uni-app之微信登录
  19. 两台linux 机器互联,Red Hat Linux9.0下两台机器怎么互联
  20. PostgreSQL 配置文件 postgresql.conf 及 postgresql.auto.conf

热门文章

  1. MAC 合并多个jpg文件为PDF
  2. 接口测试管理平台手册
  3. 第五次面试----中软国际有限公司
  4. 华为2018优招 解决方案技术工程师
  5. 一个web站点的欢迎页面
  6. gitblit中忘记admin密码,怎么办?附详细解决方法和截图
  7. 谷歌、Microsoft、火狐浏览器主页被篡改解决方法
  8. 想快速发表自然语言处理论文?推荐一个出论文的好方向!
  9. 华为防火墙查看日志命令_华为路由器防火墙配置命令总结(上)
  10. 儒家思想的核心:仁、义、礼、智、信、忠、孝、悌、节、恕、勇、让