原文链接:动手学深度学习pytorch版:7.8 Adam算法
github:https://github.com/ShusenTang/Dive-into-DL-PyTorch

[1] Kingma, D. P., & Ba, J. (2014). Adam: A method for stochastic optimization. arXiv preprint arXiv:1412.6980.
论文链接

Adam算法

Adam算法在RMSProp算法基础上对小批量随机梯度也做了指数加权移动平均 [1]。下面我们来介绍这个算法。

所以Adam算法可以看做是RMSProp算法与动量法的结合。

算法

Adam 算法使用了动量变量 vtv_tvt​ 和 RMSProp 算法中小批量随机梯度按元素平方的指数加权移动平均变量 sts_tst​,并子时间步0将它们中每个元素初始化为0。给定超参数 0≤β1<10 ≤ β_1 < 10≤β1​<1 (算法作者建议设置为 0.9),时间步 ttt 的动量变量 vtv_tvt​ 即小批量随机梯度 gtg_tgt​ 的质数加权移动平均:
vt←β1vt−1+(1−β1)gt{{\text{v}}_{t}}\leftarrow {{\beta }_{1}}{{\text{v}}_{t-1}}+(1-{{\beta }_{1}}){{g}_{t}} vt​←β1​vt−1​+(1−β1​)gt​

和RMSProp算法中一样,给定超参数0≤β2<10 ≤ β_2 < 10≤β2​<1(算法作者建议设为0.999),将小批量随机梯度按元素平方后的项 gt⊙gt{{g}_{t}}\odot {{g}_{t}}gt​⊙gt​ 做指数加权移动平均得到 sts_tst​:
st←β2st−1+(1−β2)gt⊙gt{{s}_{t}}\leftarrow {{\beta }_{2}}{{s}_{t-1}}+(1-{{\beta }_{2}}){{g}_{t}}\odot {{g}_{t}} st​←β2​st−1​+(1−β2​)gt​⊙gt​

由于我们将 v0v_0v0​ 和 s0s_0s0​ 中的元素都初始化为0, 在时间步 ttt 我们得到 vt=(1−β1)∑i=1tβ1t−igi{{v}_{t}}=(1-{{\beta }_{1}})\sum\nolimits_{i=1}^{t}{\beta _{1}^{t-i}{{g}_{i}}}vt​=(1−β1​)∑i=1t​β1t−i​gi​。将过去各时间步小批量随机梯度的权值相加,得到 (1−β1)∑i=1tβ1t−i=1−β1t(1-{{\beta }_{1}})\sum\nolimits_{i=1}^{t}{\beta _{1}^{t-i}=1-}\beta _{1}^{t}(1−β1​)∑i=1t​β1t−i​=1−β1t​ 。需要注意的是,当 ttt 较小时,过去各时间步小批量随机梯度权值之和会较小。例如,当 β1=0.9{{\beta }_{1}}=0.9β1​=0.9时,v1=0.1g1{{v}_{1}}=0.1{{g}_{1}}v1​=0.1g1​。为了消除这样的影响,对于任意时间步 ttt,我们可以将 vtv_tvt​ 再除以 1−β1t1-\beta _{1}^{t}1−β1t​,从而使过去各时间步小批量随机梯度权值之和为1.这也叫做偏差修正。在 Adam 算法中,我们对变量 vtv_tvt​ 和 sts_tst​ 均作偏差修正:
v^t←vt1−β1t{{\hat{v}}_{t}}\leftarrow \frac{{{v}_{t}}}{1-\beta _{1}^{t}} v^t​←1−β1t​vt​​
s^←st1−β2t\hat{s}\leftarrow \frac{{{s}_{t}}}{1-\beta _{2}^{t}} s^←1−β2t​st​​

接下来,Adam算法使用以上偏差修正后的变量 v^t{{{\hat{v}}}_{t}}v^t​ 和 s^{\hat{s}}s^ ,将模型参数中每个元素的学习率通过按元素运算重新调整:
g′t←ηv^ts^t+εg{{'}_{t}}\leftarrow \frac{\eta {{{\hat{v}}}_{t}}}{\sqrt{{{{\hat{s}}}_{t}}}+\varepsilon } g′t​←s^t​​+εηv^t​​
其中 η\etaη 是学习率,ϵ\epsilonϵ 是为了维持数值稳定性而添加的常数,如 10−810^{-8}10−8。和 AdaGrad 算法、RMSProp 算法以及AdaDelta 算法一样,目标函数自变量中每个元素都分别拥有自己的学习率。最后,使用 gt′g'_tgt′​ 迭代自变量:
xt←xt−1−gt′{{x}_{t}}\leftarrow {{x}_{t-1}}-g_{t}^{'} xt​←xt−1​−gt′​

从零开始实现

我们按照Adam算法中的公式实现该算法。其中时间步 ttt 通过 hyperparams 参数传入 adam 函数。

%matplotlib inline
import torch
import sys
sys.path.append("..")
import d2lzh_pytorch as d2lfeatures, labels = d2l.get_data_ch7()def init_adam_states():v_w, v_b = torch.zeros((features.shape[1], 1), dtype=torch.float32), torch.zeros(1, dtype=torch.float32)s_w, s_b = torch.zeros((features.shape[1], 1), dtype=torch.float32), torch.zeros(1, dtype=torch.float32)return ((v_w, s_w), (v_b, s_b))def adam(params, states, hyperparams):beta1, beta2, eps = 0.9, 0.999, 1e-6for p, (v, s) in zip(params, states):v[:] = beta1 * v + (1 - beta1) * p.grad.datas[:] = beta2 * s + (1 - beta2) * p.grad.data**2v_bias_corr = v / (1 - beta1 ** hyperparams['t'])s_bias_corr = s / (1 - beta2 ** hyperparams['t'])p.data -= hyperparams['lr'] * v_bias_corr / (torch.sqrt(s_bias_corr) + eps)hyperparams['t'] += 1

使用学习率为0.01的Adam算法来训练模型。

d2l.train_ch7(adam, init_adam_states(), {'lr': 0.01, 't': 1}, features, labels)

输出:

loss: 0.245370, 0.065155 sec per epoch

简洁实现

通过名称为“Adam”的优化器实例,我们便可使用PyTorch提供的Adam算法。

d2l.train_pytorch_ch7(torch.optim.Adam, {'lr': 0.01}, features, labels)

输出:

loss: 0.242066, 0.056867 sec per epoch

小结

  • Adam算法在RMSProp算法的基础上对小批量随机梯度也做了指数加权移动平均。
  • Adam算法使用了偏差修正。

深度学习优化算法:Adam算法相关推荐

  1. adam算法效果差原因_深度学习优化器-Adam两宗罪

    在上篇文章中,我们用一个框架来回顾了主流的深度学习优化算法.可以看到,一代又一代的研究者们为了我们能炼(xun)好(hao)金(mo)丹(xing)可谓是煞费苦心.从理论上看,一代更比一代完善,Ada ...

  2. Adam 那么棒,为什么还对 SGD 念念不忘?一个框架看懂深度学习优化算法

    作者|Juliuszh 链接 | https://zhuanlan.zhihu.com/juliuszh 本文仅作学术分享,若侵权,请联系后台删文处理 机器学习界有一群炼丹师,他们每天的日常是: 拿来 ...

  3. 2017年深度学习优化算法最新进展:改进SGD和Adam方法

    2017年深度学习优化算法最新进展:如何改进SGD和Adam方法 转载的文章,把个人觉得比较好的摘录了一下 AMSGrad 这个前期比sgd快,不能收敛到最优. sgdr 余弦退火的方案比较好 最近的 ...

  4. 2017年深度学习优化算法最新进展:如何改进SGD和Adam方法?

    2017年深度学习优化算法最新进展:如何改进SGD和Adam方法? 深度学习的基本目标,就是寻找一个泛化能力强的最小值,模型的快速性和可靠性也是一个加分点. 随机梯度下降(SGD)方法是1951年由R ...

  5. 深度学习优化算法实现(Momentum, Adam)

    目录 Momentum 初始化 更新参数 Adam 初始化 更新参数 除了常见的梯度下降法外,还有几种比较通用的优化算法:表现都优于梯度下降法.本文只记录完成吴恩达深度学习作业时遇到的Momentum ...

  6. 深度学习优化算法,Adam优缺点分析

    优化算法 首先我们来回顾一下各类优化算法. 深度学习优化算法经历了 SGD -> SGDM -> NAG ->AdaGrad -> AdaDelta -> Adam -& ...

  7. Adam那么棒,为什么还对SGD念念不忘?一个框架看懂深度学习优化算法

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者|Juliuszh,https://zhuanlan.zhih ...

  8. 深度学习优化算法-Adam算法

    Adam算法 Adam算法在RMSProp算法基础上对小批量随机梯度也做了指数加权移动平均.Adam算法可以看做是RMSProp算法与动量法的结合. 算法内容 Adam算法使用了动量变量vt\bold ...

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

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

最新文章

  1. 对装饰器@wraps的解释(一看就懂)-- 并对装饰器详解
  2. 软件设计之 数据库设计
  3. MySQL的EXPLAIN的SELECT TYPE
  4. 后台管理系统怎么实现操作日志原理_springboot角色权限后台管理系统脚手架实战开发教程包含完整源码...
  5. linux二进制文件构建mysql_MySQL安装系列:使用通用二进制文件在Unix/Linux安装
  6. Linux驱动调试中的Debugfs的使用简介 CONFIG_DEBUG_FS 的功能与配置
  7. uml+oopc嵌入式c语言开发精讲_当前火爆的嵌入式领域,为什么选择C语言作为开发语言?了解一下...
  8. ARM再出手,软银攀登新高山
  9. 【高校宿舍管理系统】第二章 整合Mybatis和写CRUD的基本流程以及使用代码生成器生成Mapper等相关代码
  10. html5 拖放游戏,HTML5拖放API实现拖放排序的实例代码
  11. 原生js 修改html,原生JS改变HTML内容
  12. table——caption
  13. js去除字符串中的空白字符(也可以去除其他字符串)
  14. 捡到的苹果手机怎么解id锁_苹果手机换id通讯录没了怎么恢复?超全教程,建议收藏!...
  15. html中的注释格式是,html的注释格式是什么
  16. [Python从零到壹] 四十九.图像增强及运算篇之顶帽运算和底帽运算
  17. Android基础知识梳理
  18. linux查看磁盘硬件日志,Linux下如何查看硬件信息
  19. LeetCode(Python)—— 加一(简单)
  20. 非官方的juoyter notebook 扩展包

热门文章

  1. Word Embedding 学习笔记
  2. mysql 事务排他锁_[数据库事务与锁]详解六: MySQL中的共享锁与排他锁
  3. Java经典面试题:HashMap和HashTable以及ConcurrentHashMap分析
  4. 【指针进阶06】函数指针数组
  5. CentOS7 注册系统服务实现服务自启
  6. UIImage非正方形图片如何剪切为正方形
  7. 多线程(一):创建线程和线程的常用方法
  8. TensorFlow2数据加载与数据集
  9. Ubuntu安装X11
  10. 7.联合索引(最左前缀原则)