概念:Adam 是一种可以替代传统随机梯度下降过程的一阶优化算法,它能基于训练数据迭代地更新神经网络权重。Adam 最开始是由 OpenAI 的 Diederik Kingma 和多伦多大学的 Jimmy Ba 在提交到 2015 年 ICLR 论文(Adam: A Method for Stochastic Optimization)中提出的.该算法名为「Adam」,其并不是首字母缩写,也不是人名。它的名称来源于适应性矩估计(adaptive moment estimation)

  Adam(Adaptive Moment Estimation)本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。它的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。其公式如下:

  

  其中,前两个公式分别是对梯度的一阶矩估计和二阶矩估计,可以看作是对期望E|gt|,E|gt^2|的估计; 
公式3,4是对一阶二阶矩估计的校正,这样可以近似为对期望的无偏估计。可以看出,直接对梯度的矩估计对内存没有额外的要求,而且可以根据梯度进行动态调整。最后一项前面部分是对学习率n形成的一个动态约束,而且有明确的范围。

  优点:

1、结合了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优点; 
2、对内存需求较小; 
3、为不同的参数计算不同的自适应学习率; 
4、也适用于大多非凸优化-适用于大数据集和高维空间。

  应用和源码:

  参数实例:

class torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)

  参数含义:

  params(iterable):可用于迭代优化的参数或者定义参数组的dicts。

  lr (float, optional) :学习率(默认: 1e-3) betas (Tuple[float, float], optional):

  用于计算梯度的平均和平方的系数(默认: (0.9, 0.999)) eps (float, optional):

  为了提高数值稳定性而添加到分母的一个项(默认: 1e-8) weight_decay (float, optional):权重衰减(如L2惩罚)(默认: 0)

  torch.optim.adam源码:

 1 import math2 from .optimizer import Optimizer3 4 class Adam(Optimizer):5     def __init__(self, params, lr=1e-3, betas=(0.9, 0.999), eps=1e-8,weight_decay=0):6         defaults = dict(lr=lr, betas=betas, eps=eps,weight_decay=weight_decay)7         super(Adam, self).__init__(params, defaults)8 9     def step(self, closure=None):
10         loss = None
11         if closure is not None:
12             loss = closure()
13
14         for group in self.param_groups:
15             for p in group['params']:
16                 if p.grad is None:
17                     continue
18                 grad = p.grad.data
19                 state = self.state[p]
20
21                 # State initialization
22                 if len(state) == 0:
23                     state['step'] = 0
24                     # Exponential moving average of gradient values
25                     state['exp_avg'] = grad.new().resize_as_(grad).zero_()
26                     # Exponential moving average of squared gradient values
27                     state['exp_avg_sq'] = grad.new().resize_as_(grad).zero_()
28
29                 exp_avg, exp_avg_sq = state['exp_avg'], state['exp_avg_sq']
30                 beta1, beta2 = group['betas']
31
32                 state['step'] += 1
33
34                 if group['weight_decay'] != 0:
35                     grad = grad.add(group['weight_decay'], p.data)
36
37                 # Decay the first and second moment running average coefficient
38                 exp_avg.mul_(beta1).add_(1 - beta1, grad)
39                 exp_avg_sq.mul_(beta2).addcmul_(1 - beta2, grad, grad)
40
41                 denom = exp_avg_sq.sqrt().add_(group['eps'])
42
43                 bias_correction1 = 1 - beta1 ** state['step']
44                 bias_correction2 = 1 - beta2 ** state['step']
45                 step_size = group['lr'] * math.sqrt(bias_correction2) / bias_correction1
46
47                 p.data.addcdiv_(-step_size, exp_avg, denom)
48
49         return loss

  使用例子:

 1 import torch2 3 # N is batch size; D_in is input dimension;4 # H is hidden dimension; D_out is output dimension.5 N, D_in, H, D_out = 64, 1000, 100, 106 7 # Create random Tensors to hold inputs and outputs8 x = torch.randn(N, D_in)9 y = torch.randn(N, D_out)
10
11 # Use the nn package to define our model and loss function.
12 model = torch.nn.Sequential(
13     torch.nn.Linear(D_in, H),
14     torch.nn.ReLU(),
15     torch.nn.Linear(H, D_out),
16 )
17 loss_fn = torch.nn.MSELoss(reduction='sum')
18
19 # Use the optim package to define an Optimizer that will update the weights of
20 # the model for us. Here we will use Adam; the optim package contains many other
21 # optimization algoriths. The first argument to the Adam constructor tells the
22 # optimizer which Tensors it should update.
23 learning_rate = 1e-4
24 optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
25 for t in range(500):
26     # Forward pass: compute predicted y by passing x to the model.
27     y_pred = model(x)
28
29     # Compute and print loss.
30     loss = loss_fn(y_pred, y)
31     print(t, loss.item())
32
33     # Before the backward pass, use the optimizer object to zero all of the
34     # gradients for the variables it will update (which are the learnable
35     # weights of the model). This is because by default, gradients are
36     # accumulated in buffers( i.e, not overwritten) whenever .backward()
37     # is called. Checkout docs of torch.autograd.backward for more details.
38     optimizer.zero_grad()
39
40     # Backward pass: compute gradient of the loss with respect to model
41     # parameters
42     loss.backward()
43
44     # Calling the step function on an Optimizer makes an update to its
45     # parameters
46     optimizer.step()

  到这里,相信对付绝大多数的应用是可以的了.我的目的也就基本完成了.接下来就要在应用中加深理解了.

  

参考文档:

1 https://blog.csdn.net/kgzhang/article/details/77479737

2 https://pytorch.org/tutorials/beginner/examples_nn/two_layer_net_optim.html

作者:虚生
简介:专注于小型物联网系统解决方案,擅长物联网协议(wifi,bt)和音频处理算法。
商务合作和技术探讨:邮箱:caoyin2011@163.com QQ:1173496664. 音频市场技术对接群:347609188

PyTorch-Adam优化算法原理,公式,应用相关推荐

  1. 深度学习最常用的学习算法:Adam优化算法

    上海站 | 高性能计算之GPU CUDA培训 4月13-15日 三天密集式学习  快速带你晋级 阅读全文 > 正文共6267个字,30张图,预计阅读时间16分钟. 听说你了解深度学习最常用的学习 ...

  2. 【转】听说你了解深度学习最常用的学习算法:Adam优化算法?

    深度学习常常需要大量的时间和机算资源进行训练,这也是困扰深度学习算法开发的重大原因.虽然我们可以采用分布式并行训练加速模型的学习,但所需的计算资源并没有丝毫减少.而唯有需要资源更少.令模型收敛更快的最 ...

  3. 深度学习最常用的算法:Adam优化算法

    深度学习常常需要大量的时间和机算资源进行训练,这也是困扰深度学习算法开发的重大原因.虽然我们可以采用分布式并行训练加速模型的学习,但所需的计算资源并没有丝毫减少.而唯有需要资源更少.令模型收敛更快的最 ...

  4. Adam优化算法介绍

    Adam是一种优化算法,全称时adaptive moment estimation(适应性矩估计) SGD 和Adam SGD( stochastic gradient descent随机梯度下降)与 ...

  5. Adam优化算法(Adam optimization algorithm)

    Adam优化算法(Adam optimization algorithm) Adam优化算法基本上就是将Momentum和RMSprop结合在一起. 初始化 2.在第t次迭代中,用mini-batch ...

  6. 【最全干货】从SGD到NadaMax,十种机器学习优化算法原理及实现

    点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要15分钟 Follow小博主,每天更新前沿干货 作者丨永远在你身后@知乎 来源丨https://zhuanlan.zhihu.com/p/81 ...

  7. 2.8 Adam 优化算法-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 2.7 RMSprop 回到目录 2.9 学习率衰减 Adam优化算法 (Adam Optimization Algorithm) 在深度学习的历史上,包括许多知名研究者在内 ...

  8. 收藏 | 从SGD到NadaMax,深度学习十种优化算法原理及实现

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:作者丨永远在你身后@知乎 来源丨https://zhuanl ...

  9. 指数加权平均、动量梯度下降法、RMSprop、Adam优化算法

    目录 1.指数加权平均(exponentially weighted averages) 这里有一年的温度数据. 如果想计算温度的趋势,也就是局部平均值(local average),或者说移动平均值 ...

最新文章

  1. db2 日期英式写法_《学霸英语》16:美国人和英国人“表达日期”,差距竟然这么大!...
  2. php excel导入mysql_使用PHPExcel导入Excel到MySql
  3. 全文搜索引擎 ElasticSearch 还是 Solr?
  4. UIButton或UILabel加个下划线
  5. 在ROS中使用Neato XV-11 激光雷达
  6. bs后端开发语言_哪种编程语言适合后端开发?Java和PHP的区别在哪?
  7. Oracle 10g 用户数及价格
  8. NLP简报(Issue#1)
  9. 在线摇骰子/色子工具
  10. 赛思互动:Salesforce包括哪些产品和服务
  11. Treejs+EasyUI+Vuejs实操
  12. 用mysql搭建蚂蚁笔记_利用蚂蚁笔记搭建个人云笔记/博客
  13. linux 桌面小部件,在Ubuntu中安装桌面小部件 | MOS86
  14. 批量打印远端PDF文件
  15. 实验报告《私有云搭建》
  16. Android 密钥库系统 (一)
  17. 你还在用canvas画爱心吗?看我让你的名字在星空绽放
  18. 炽热如初 向新而生|ISC2022 HackingClub白帽峰会圆满举办!
  19. windows server 2012 使用包管理工具choco安装程序
  20. ionic3 版本更新

热门文章

  1. 2022-2028年中国金融安防行业深度调研及投资前景预测报告
  2. 数据结构(01)— 算法复杂度概念及常见的复杂度计算
  3. 浅显易懂 Makefile 入门 (01)— 什么是Makefile、为什么要用Makefile、Makefile规则、Makefile流程如何实现增量编译
  4. 格式化_icecream_python
  5. PyTorch的torch.cat
  6. python读取xml文件报错ValueError: multi-byte encodings are not supported
  7. Google Colab 免费GPU服务器使用教程 挂载云端硬盘
  8. 机器翻译注意力机制及其PyTorch实现
  9. 对字符数组输入输出数组名是否加取地址符的一些理解
  10. GAAFET与FinFET架构