SWATS算法剖析(自动切换adam与sgd)
SWATS算法剖析(自动切换adam与sgd)

SWATS是ICLR在2018的高分论文,提出的一种自动由Adam切换为SGD而实现更好的泛化性能的方法。
论文名为Improving Generalization Performance by Switching from Adam to SGD,下载地址为:https://arxiv.org/abs/1712.07628。
作者指出,基于历史梯度平方的滑动平均值的如adam等算法并不能收敛到最优解,因此在泛化误差上可能要比SGD等方法差,因此提出了一种转换机制,试图让算法自动在经过一定轮次的adam学习后,转而由SGD去执行接下来的操作。
算法本身思想很简单,就是采用adam这种无需操心learning rate的方法,在开始阶段进行梯度下降,但是在学习到一定阶段后,由SGD接管。这里前面的部分与常规的adam实现区别不大,重要的是在切换到sgd后,这个更新的learning rate如何计算。 整个算法步骤流程如下:

熟悉adam的应该能熟悉蓝色的部分,这个就是adam的原生实现过程。
作者比较trick的地方就是14行到24行这一部分。这一部分作者做了部分推导,作为最后的切换learning rate。
算法的整个实现逻辑并不复杂,这里列出自己实现时遇到的一些问题。
填坑 & 问题
- 在上面的算法流程第12行,有个
,这个在整个流程中未介绍如何实现,本人阅读论文后,发现应该是学习率衰减的设计。一如很多深度学习策略一样,这里可以设置经过若干轮迭代后,学习率降为原来的1/N。在论文中,作者使用了在150轮后,将学习速率减少10倍。即
。
- 上面说了
的更新,我们通过公式推导,其实能发现
和
有一定的关系,自己代码实现的版本,发现切换的时机很大程度上和
有关,因为切换涉及到第17行的一个比较过程,
和
本身都与
相关,当
降一个量级时,
|本身也会更接近
。其有些类似正比关系,因此一般都是在经过一定轮次的衰减后,才能触发SGD切换时机。这一点目前本人实现验证是这样,未深入推理。
- 这个
还有个坑,就是实现该算法,开始不太清楚这个k到底指的是epoch,还是指的经历的batch数量。最后按照常规学习率衰减应该是按照epoch来算的,因此推测其k应该为epoch。
- 还有和大坑是
作为学习率,在切换到SGD后应一直不变,该值为标量,因此应该如常用eta等学习率一样,为正值,因此需要在17行加个约束,即
。(该场景难以复现,之前有次更新发现不设置为正值时,导致切换sgd后准确度大减)
总结
通过若干的对比,该论文变相增加了一些超参数,所以实际使用有待商榷。自己的数据集上经常就在还未满足切换条件就已经收敛了。 目前已做了相应的实现,放在scalaML中,位置为https://github.com/sloth2012/scalaML/blob/master/src/main/scala/com/lx/algos/ml/optim/GradientDescent/SWATS.scala,使用见https://github.com/sloth2012/scalaML/blob/master/src/test/scala/com/lx/algos/ml/GradientDescentTest.scala。最后想要查看切换过程的话,建议将early_stop设置为false,然后将学习率衰减系数设置低一点。 代码目前仅支持二分类。
SWATS算法剖析(自动切换adam与sgd)的更多相关文章
- 神经网络优化算法如何选择Adam,SGD
之前在tensorflow上和caffe上都折腾过CNN用来做视频处理,在学习tensorflow例子的时候代码里面给的优化方案默认很多情况下都是直接用的AdamOptimizer优化算法,如下: o ...
- Nginx+Keepalived主从双机热备+自动切换
1 安装配置nginx 参考: http://www.cnblogs.com/jager/p/4388202.html 2 安装配置keepalived tar xvf keepalived-1.2. ...
- nginx+keepalive主从双机热备+自动切换解决方案
环境采集cenots 6.3 64位迷你安装,因为安装前,你需要做一些工作 yum install -y make wget 如果你愿意可以更新下系统,更换下yum源. 1.安装keepalive 官 ...
- 协程:gevent模块,遇到i/o自动切换任务 038
协程 : gevent模块,遇到io自动切换任务 from gevent import monkey;monkey.patch_all() # 写在最上面 这样后面的所有阻塞就全部能够识别了 impo ...
- 【机器学习详解】SMO算法剖析(转载)
[机器学习详解]SMO算法剖析 转载请注明出处:http://blog.csdn.net/luoshixian099/article/details/51227754 CSDN−勿在浮沙筑高台 本文力 ...
- 原生js+css3实现图片自动切换,图片轮播
运用CSS3transition及opacity属性 制作图片轮播动画 自己这两天根据用js来控制触发CSS3中transition属性,从而写出来的以CSS3动画为基础,js控制过程的图片轮播 运用 ...
- 获取bing.com的图片并在gnome3中设置自动切换
发现 bing.com 上的图片很好看,因此打算每天把 bing.com 的图片下载下来,用作桌面. 需要做的是两个部分,爬取图片到目录和设置目录图片为桌面背景并可以自动切换. 第一部分,下载图片,使 ...
- 在 Visual Studio 等编辑器/IDE中自动切换输入法,不需要手动的有没有?
使用Visual Studio写代码,经常遇到的一个问题就是切换中文输入法麻烦,输入完注释//,要切换到中文,输入完引号,要输入中文,然后还需要切换回来,有没有? 有时候中文输入法忽然失效有没有?明明 ...
- jquery背景自动切换特效
查看效果网址:http://keleyi.com/a/bjad/4kwkql05.htm 本特效的jquery版本只支持1.9.0以下. 代码如下: <!DOCTYPE html PUBLIC ...
随机推荐
- easyui的combobox模糊搜索
<tr> <th>测试名称:</th> <td> <select data-options="" class="ea ...
- Raspberry Pi 4B 使用OpenCV访问摄像头picamera模块
目录 1.OpenCV安装 (1)安装依赖 (2)下载OpenCV源码 (3)安装pip (4)安装Python虚拟机 (5)编译OpenCV (6)验证安装 2.使用OpenCV和Python控制摄 ...
- postgresql interval 字段拼接
无拼接时: SELECT scan_time + '5 day' FROM tbl_temp_record SELECT scan_time + '-5 day' FROM tbl_temp_reco ...
- Pro*C编程研究一:从.pc到.exe
[第一步]在Windows下编辑一个.pc程序(Pro*C源程序,作者用到:C:\proctest\exam1.pc),其内容如下: #include <stdio.h> #include ...
- Flutter移动电商实战 --(26)列表页_使用Provide控制子类-2
主要实现功能,点击一级分类,二级分类跟着变.这里主要用我们的provide 新建provide provide文件夹下创建:child_category.dart 事件上就是这个实体:BxMallSu ...
- ccf 201803-3 URL映射(python)
使用正则表达式 import re import collections n, m = list(map(int, input().split())) arr = ['']*(m+n) for i i ...
- Linux使用iptables设置黑白名单
使用ipset工具 1,下面我先说下iptables的基本配置规则,然后再说ipset以下使用C7 x86_64为实验环境CentOS7默认的防火墙不是iptables,而是firewalle.如果你 ...
- List 的删除
List 不要在循环中使用remove 删除.可以新加一个List ,把符合条件的元素加入到这个list 中,然后调用removeAll . 比如:(增强for 循环需要判断 list 是否是 nul ...
- eclipse快捷键整理
编辑 Ctrl+1 快速修复(最经典的快捷键,就不用多说了,可以解决很多问题,比如import类.try catch包围等)Ctrl+Shift+F 格式化当前代码Ctrl+Shift+M 添加类的i ...
- iOS面试-关于秒退
1 为什么很多的 iOS app 都有秒退现象?有什么好方法避免它?有哪些好方法避免这种现象吗? 问题里的“秒退”如果我没理解错,应该是指程序显示完默认启动图片后,在初始化阶段就崩溃了(也可以叫“闪退 ...