Keras实现两个优化器:Lookahead和LazyOptimizer

By 苏剑林 | 2019-07-30 | 2232位读者 |

最近用Keras实现了两个优化器,也算是有点实现技巧,遂放在一起写篇文章简介一下(如果只有一个的话我就不写了)。这两个优化器的名字都挺有意思的,一个是look ahead(往前看?),一个是lazy(偷懒?),难道是两个完全不同的优化思路么?非也非也~只能说发明者们起名字太有创意了。

Lookahead #

首先登场的是Lookahead优化器,它源于论文《Lookahead Optimizer: k steps forward, 1 step back》,是最近才提出来的优化器,有意思的是大牛Hinton和Adam的作者之一Jimmy Ba也出现在了论文作者列表当中,有这两个大神加持,这个优化器的出现便吸引了不少目光。

Lookahead的思路很朴素,准确来说它并不是一个优化器,而是一个使用现有优化器的方案。简单来说它就是下面三个步骤的循环执行:

1、备份模型现有的权重θθ

2、从θθ出发,用指定优化器更新kk步,得到新权重θ~θ~

3、更新模型权重为θ←θ+α(θ~−θ)θ←θ+α(θ~−θ)

下面则是我的Keras实现,写法在之前的《“让Keras更酷一些!”:小众的自定义优化器》一文中就提到过了,属于一种“侵入式”的写法:

https://github.com/bojone/keras_lookahead

用法就很简单了:

<span style="color:rgba(0, 0, 0, 0.75)"><span style="color:black"><code class="language-python">model<span style="color:#999999">.</span>compile<span style="color:#999999">(</span>optimizer<span style="color:#a67f59">=</span>Adam<span style="color:#999999">(</span><span style="color:#990055">1e</span><span style="color:#a67f59">-</span><span style="color:#990055">3</span><span style="color:#999999">)</span><span style="color:#999999">,</span> loss<span style="color:#a67f59">=</span><span style="color:#669900">'mse'</span><span style="color:#999999">)</span> <span style="color:slategray"># 用你想用的优化器</span>
lookahead <span style="color:#a67f59">=</span> Lookahead<span style="color:#999999">(</span>k<span style="color:#a67f59">=</span><span style="color:#990055">5</span><span style="color:#999999">,</span> alpha<span style="color:#a67f59">=</span><span style="color:#990055">0.5</span><span style="color:#999999">)</span> <span style="color:slategray"># 初始化Lookahead</span>
lookahead<span style="color:#999999">.</span>inject<span style="color:#999999">(</span>model<span style="color:#999999">)</span> <span style="color:slategray"># 插入到模型中</span></code></span></span>

至于效果,原论文中做了不少实验,有些有轻微提高(cifar10和cifar100那两个),有些提升还比较明显(LSTM做语言模型那个),我自己简单实验了一下,结果是没什么变化。我一直觉得优化器是一个很玄乎的存在,有时候非得SGD才能达到最优效果,有时候又非得Adam才能收敛得下去,总之不能指望单靠换一个优化器就能大幅度提升模型效果。Lookahead的出现,也就是让我们多一种选择罢了,训练时间充足的读者,多去尝试一下就好。

附:《机器之心的Lookahead的介绍》

LazyOptimizer #

LazyOptimizer优化器基本上就是为NLP准备的,当然更准确来说是为Embedding层准备的。

LazyOptimizer指出所有带动量的优化器(自然也就包括Adam以及带动量的SGD)都存在一个问题:当前batch中没被采样到的词,依然会使用历史动量来更新,这可能导致Embedding层过拟合(参考知乎讨论)。具体来说,当一个词的被采样过后,它的Embedding的梯度不为0,这个梯度也会被记录在动量中,实际更新是用动量去更新的;在后面的batch中,假如该词没有被采样到,它的Embedding的梯度为0,但是它的动量并不为0,所以该词还是被更新了。这样一来就算没有被反复采样的词,对应的Embedding也被反复更新了,就导致了过拟合。

所以,一个改进的方案是只有当该词被采样过才更新,这就是LazyOptimizer的基本原理了。

在实现上,我们要如何判断一个词有没有被采样过呢?当然终极方法肯定是传入被采样过的词的index了,但这使用上不够友好。我这里使用了一个近似的方法:判断该词的Embedding对应的梯度是否为0,如果为0意味着它“很可能”在当前batch没有被采样到。背后的原理在于,如果它没有被采样到,那么梯度一定为0,如果它被采样到了,那么梯度为0的概率是非常小的,毕竟那么多分量,同时为0的可能性很小,所以这样实现也够用了。

我的Keras实现位于:

https://github.com/bojone/keras_lazyoptimizer

这个用法也很简单,就是包装一个带动量的优化器,传入所有Embedding层,使得它成为一个新的Lazy版的优化器:

Github中还带有一个IMDB的例子,在这个例子中,如果直接用Adam(1e-3)做优化器,那么验证准确率最高只有83.7%左右,而如果用LazyOptimizer(Adam(1e-3), embedding_layers),那么基本上最优验证准确率能跑到84.9%以上,效果可见一斑。总的来说,我觉得Embedding层很大的模型(尤其是以词为单位的模型)都可以试一下,总的来说就是因为Embedding层参数量太大了,减少更新频率,让模型重点去优化其余部分。

注:这个LazyOptimizer和标准的LazyOptimizer有点不一样。标准的LazyOptimizer对没有采样过的词,所有相关的缓存量(比如动量等)也不去更新,但我这个实现中,就算该词没有被采样到,该词对应的所有缓存量还是会被更新的,有评测说这样做其实效果会更好些。

文末小结 #

也没啥内容,就用Keras实现了两个优化器,让用Keras的朋友可以及时尝尝鲜,或者用Keras用得更有意思一些。

Keras实现两个优化器:Lookahead和LazyOptimizer相关推荐

  1. oracle 两种优化器,Oracle的优化器有两种优化方式(一)

    Oracle的优化器有两种优化方式(整理), 2010-04-13 RBO方式:基于规则的优化方式(Rule-Based Optimization,简称为RBO)  优化器在分析SQL语句时,所遵循的 ...

  2. Keras实现学习率,优化器,损失函数调优

    文章目录 1.样本不均衡 1.1 定义focalloss 1.2 权值均衡 2.定义动态学习率 3. 优化器的选择 3.1 AdamW 4.代码实现 1.样本不均衡 1.1 定义focalloss i ...

  3. RAdam优化器又进化:与LookAhead强强结合,性能更优速度更快

    鱼羊 编译整理  量子位 报道 | 公众号 QbitAI 上周,来自UIUC的中国博士生Liyuan Liu提出了一种兼具Adam和SGD两者之美的新优化器RAdam,收敛速度快,还很鲁棒,一度登上了 ...

  4. Keras之小众需求:自定义优化器

    作者丨苏剑林 单位丨广州火焰信息科技有限公司 研究方向丨NLP,神经网络 个人主页丨kexue.fm 今天我们来看一个小众需求:自定义优化器. 细想之下,不管用什么框架,自定义优化器这个需求可谓真的是 ...

  5. 使用什么优化器_新的深度学习优化器Ranger:RAdam + LookAhead强强结合

    [导读]给大家介绍一个新的深度学习优化器,Ranger,同时具备RAdam和LookAhead的优点,一行代码提升你的模型能力. Ranger 优化器结合了两个非常新的发展(RAdam + Looka ...

  6. Keras Adam代码解析以及EMA的Adam优化器

    文章目录 Keras Adam 初始化 更新函数 带EMA的Adam Adam理论可以参考下这里 优化算法的选择 Keras Adam class Adam(Optimizer):"&quo ...

  7. 神经网络优化器的选择_神经网络:优化器选择的重要性

    神经网络优化器的选择 When constructing a neural network, there are several optimizers available in the Keras A ...

  8. MaxCompute理解数据、运算和用户的大脑:基于代价的优化器

    摘要: 回顾大数据技术领域大事件,最早可追溯到06年Hadoop的正式启动,而环顾四下,围绕着数据库及数据处理引擎,业内充斥着各种各样的大数据技术.在云栖社区2017在线技术峰会大数据技术峰会上,阿里 ...

  9. 手撕深度学习中的优化器

    深度学习中的优化算法采用的原理是梯度下降法,选取适当的初值params,不断迭代,进行目标函数的极小化,直到收敛.由于负梯度方向时使函数值下降最快的方向,在迭代的每一步,以负梯度方向更新params的 ...

最新文章

  1. 360极速浏览器崩溃_360极速浏览器12.0新版上线 四大亮点引国内浏览器浪潮
  2. 第二十二章 5为你的命名空间取个别名
  3. 上海集成电路材料研究院-面试经历-取消面试
  4. JAVA进阶day04多态(向上转化,向下转化)
  5. 搜索 —— 深度优先搜索(DFS)
  6. memcached内存管理及key value长度限制
  7. 产品经理学习---高级产品经理
  8. vue中npm run dev运行项目不能自动打开浏览器! 以及 webstorm跑vue项目jshint一直提示错误问题的解决方法!...
  9. 拓端tecdat|R语言解决最优化运营研究问题-线性优化(LP)问题
  10. Winform 表格布局
  11. LabVIEW使用 NI Package Manager(NIPM)修复软件
  12. ThinkPHP(TP框架)的归纳与总结(一)----基于TP开发手册
  13. echarts 图表数据更新方式
  14. mac安装旺旺启动台找不到_如何正确安装卸载mac软件
  15. Oracle:imp导入dmp文件
  16. linux 命令查看内存和cpu信息
  17. jenkins调用shell脚本实现自动上线完整项目---此项目中用到了git parameter、choise parameter参数化构建(五)
  18. 【DDNS更新】--公云的DDNS自动更新
  19. 90后小伙自己开发APP年赚10亿,自己开发APP需要什么工具
  20. 用python调查应用程序结构

热门文章

  1. Vin码查询车辆详细信息
  2. Android 根据身份证号判断性别
  3. 第15课:ul,添加新闻信息列表ol,添加图书销售排行榜
  4. 1213:八皇后问题
  5. 单臂路由器互联VLAN实验-Cisco Packet Tracer
  6. 报表解决方案Telerik Reporting发布R2 2019 SP1|支持MS Access
  7. 电脑截屏怎么固定到屏幕 截图放在桌面上
  8. WPF GMap使用高德地图
  9. 【光剑藏书轩2021】5分钟读懂《贫穷的本质》:“穷人通常缺少信息来源”
  10. ubuntu安装有道词典