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 ...
随机推荐
- Jmeter Web 性能测试入门 (七):Performance 测试中踩过 Jmeter 的坑
脚本运行的过程中,大量request抛error,但没有地方能够查看request是因为什么error的. 原因:Jmeter默认禁掉了运行过程中每个request的具体response信息收集,只保 ...
- .NET笔记题库(一)
1 (1)面向对象的语言具有__继承性_性._封装性_性._多态性 性. (2)能用foreach遍历访问的对象需要实现 _ IEnumerable 接口或声明_ GetEnumerator 方法的类 ...
- linux如何交叉编译i2c-tools?
1. 获取源码 wget https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/i2c-tools-4.1.tar.xz 2. 解压 ...
- Linux通过AIO进行异步读文件
下面列出源代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <a ...
- mybatis plus foreach 的用法
一: foreach 用于 select * from tablename where colname in (A,B,C……); 1:service 层: Set<String> tea ...
- MySQL 查询某个数据库中所有包含数据记录的表名
MySQL 查询某个数据库中所有包含数据记录的表名 有时根据实际应用需要,需要对数据进行备份. 如果一个数据库中有很多数据表,但是只想备份包含数据记录的那些表数据(空表不做数据备份). 如果通过如下S ...
- Semaphore 并发信号
package com.thread; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executo ...
- 使用注解和xml两种方式整合Activemq与spring(gradle工程)
一.新建gradle工程 1.1 使用intellij新建gradle工程步骤省略 二.导入依赖,配置build.gradle plugins { id 'java' } group 'com.bdh ...
- Insomni’hack CTF-l33t-hoster复现分析
题目地址: https://github.com/eboda/insomnihack/tree/master/l33t_hoster 源码如下: <?php if (isset($_GET[&q ...
- list集合的一些小见解
关于LIst集合 前言: 第一次写博客,有些东西可能总结的到位,发表一下自己的一些观点,欢迎大佬们点评和指教 正文: list集合可以分为ArrayLlst和LinkedList. ArrayList ...