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 ...
随机推荐
- 方阵转置(c++)
#include #include using namespace std; int main(int argc,char* argv[]) { int a[4][4]={ {0,1,2,3}, {4 ...
- 程序猿必备的Git教程
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 版权声明:本文为博主原创文章,未经 ...
- 异步机制 - APC
APC : An asynchronous procedure call,异步过程调用,是微软提供的一种在线程上下文中执行代码的机制.当向一个线程插入一个USER APC时,如果线程进入alertab ...
- 设计模式----外观(facade)模式
外观(facade)模式外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.uml图
- SQL-W3School-高级:SQL DEFAULT 约束
ylbtech-SQL-W3School-高级:SQL DEFAULT 约束 1.返回顶部 1. SQL DEFAULT 约束 DEFAULT 约束用于向列中插入默认值. 如果没有规定其他的值,那么会 ...
- kotlin泛型基本使用
class box<T> (t :T){ var vlaue =t } fun main(arg: Array<String>) { val box1:box<Int&g ...
- [Java复习] Spring Framework 框架小结
Spring 总共大约有 20 个模块,由 1300 多个不同的文件构成. 而这些组件被分别整合在 核心容器 (Core Container), AOP(Aspect Oriented Pro ...
- [服务器时区问题]PHP Warning: strftime(): It is not safe to rely on the system's timezone set
PHP Warning: strftime(): It is not safe to rely on the system's timezone set 当运行一些程序时,在httpd日志中会有如下警 ...
- 阶段5 3.微服务项目【学成在线】_day04 页面静态化_05-freemarker基础-List指令
controller填充数据 @RequestMapping("/freemarker") @Controller public class FreemarkerControlle ...
- [Scikit-learn] 2.3 Clustering - kmeans
参考: 2.3. Clustering 2.4. Biclustering 2.1.2.3. The Dirichlet Process Clusering, GMM, Variational Inf ...