找回密码
 立即注册
查看: 428|回复: 0

优化算法 - Adam算法

[复制链接]
发表于 2024-8-2 09:29 | 显示全部楼层 |阅读模式
Adam算法

在本章中,我们已经学习了许多有效优化的技术。在本节讨论之前,我们先详细回顾以下这些技术:

  • 随机梯度下降:在解决优化问题时比梯度下降更有效
  • 小批量随机梯度下降:在一个小批量中使用更大的不雅观测值集,可以通过向量化提供额外效率。这是高效的多机、多GPU和整体并行措置的关键
  • 动量法:添加了一种机制,用于汇总过去梯度的历史以加速收敛
  • AdaGrad算法:对每个坐标缩放来实现高效计算的预措置器
  • RMSProp算法:通过学习率的调整来分手每个坐标的缩放
Adam算法将所有这些技术汇总到一个高效的学习算法中。不出预料,作为深度学习中使用的更强大和有效的优化算法之一,它非常受欢迎。但是它并非没有问题,尤其是 [Reddi et al., 2019]表白,有时Adam算法可能由于⽅差控制不良⽽发散。在完善⼯作中,[Zaheer et al., 2018]给Adam算法提供了⼀个称为Yogi的热补丁来解决这些问题。下⾯我们了解⼀下Adam算法
1 - 算法





2 - 实现

从头开始实现Adam算法并不难,为了便利起见,我们将时间步t存储在hyperparams字典中。除此之外,一切都很简单
  1. %matplotlib inline
  2. import torch
  3. from d2l import torch as d2l
  4. def init_adam_states(feature_dim):
  5.     v_w,v_b = torch.zeros((feature_dim,1)),torch.zeros(1)
  6.     s_w,s_b = torch.zeros((feature_dim,1)),torch.zeros(1)
  7.     return ((v_w,s_w),(v_b,s_b))
  8. def adam(params,states,hyperparams):
  9.     beta1,beta2,eps = 0.9,0.999,1e-6
  10.     for p,(v,s) in zip(params,states):
  11.         with torch.no_grad():
  12.             v[:] = beta1 * v + (1 - beta1) * p.grad
  13.             s[:] = beta2 * s + (1 - beta2) * torch.square(p.grad)
  14.             v_bias_corr = v / (1 - beta1 ** hyperparams['t'])
  15.             s_bias_corr = s / (1 - beta2 ** hyperparams['t'])
  16.             p[:] -= hyperparams['lr'] * v_bias_corr / (torch.sqrt(s_bias_corr + eps))
  17.         p.grad.data.zero_()
  18.     hyperparams['t'] += 1
复制代码
此刻,我们用以上Adam算法来训练模型,这里我们使用η=0.01的学习率
  1. data_iter,feature_dim = d2l.get_data_ch11(batch_size=10)
  2. d2l.train_ch11(adam,init_adam_states(feature_dim),{'lr':0.01,'t':1},data_iter,feature_dim);
  3. loss: 0.246, 0.014 sec/epoch
复制代码

此外,我们可以用深度学习框架自带算法应用Adam算法,这里我们只需要传递配置参数
  1. trainer = torch.optim.Adam
  2. d2l.train_concise_ch11(trainer,{'lr':0.01},data_iter)
  3. loss: 0.247, 0.015 sec/epoch
复制代码

3 - Yogi








  1. def yogi(params,states,hyperparams):
  2.     beta1,beta2,eps = 0.9,0.999,1e-3
  3.     for p,(v,s) in zip(params,states):
  4.         with torch.no_grad():
  5.             v[:] = beta1 * v + (1 - beta1) * p.grad
  6.             s[:] = s + (1 - beta2) * torch.sign(torch.square(p.grad) -s ) * torch.square(p.grad)
  7.             v_bias_corr = v / (1 - beta1 ** hyperparams['t'])
  8.             s_bias_corr = s / (1 - beta2 ** hyperparams['t'])
  9.             p[:] -= hyperparams['lr'] * v_bias_corr / (torch.sqrt(s_bias_corr) + eps)
  10.         p.grad.data.zero_()
  11.     hyperparams['t'] += 1
  12.    
  13. data_iter,feature_dim = d2l.get_data_ch11(batch_size=10)
  14. d2l.train_ch11(yogi,init_adam_states(feature_dim),{'lr':0.01,'t':1},data_iter,feature_dim)
  15. loss: 0.244, 0.007 sec/epoch
复制代码
  1. ([0.006999015808105469,
  2.   0.01399993896484375,
  3.   0.02099919319152832,
  4.   0.026999235153198242,
  5.   0.03399944305419922,
  6.   0.0410001277923584,
  7.   0.04800128936767578,
  8.   0.05700254440307617,
  9.   0.06400370597839355,
  10.   0.07200503349304199,
  11.   0.07900643348693848,
  12.   0.08518671989440918,
  13.   0.09218716621398926,
  14.   0.10018706321716309,
  15.   0.10867691040039062],
  16. [0.3831201309363047,
  17.   0.30505007115999855,
  18.   0.27388086752096813,
  19.   0.25824862279494604,
  20.   0.248792000691096,
  21.   0.24663881778717042,
  22.   0.24533938866853713,
  23.   0.24811744292577106,
  24.   0.2440877826611201,
  25.   0.24333851114908855,
  26.   0.24304762629667917,
  27.   0.24334035567442577,
  28.   0.24402384889125825,
  29.   0.24259794521331787,
  30.   0.2435852948029836])
复制代码
  ​   
4 - 小结


  • Adam算法将许多优化算法的功能结合到了相当强大的更新法则中
  • Adam算法在RMSProp算法基础上创建的,还在小批量的随机梯度上使用EWMA
  • 在估计动量和二次矩时,Adam算法使用偏差校正来调整迟缓的启动速度
  • 对于具有显著差异的梯度,我们可能会遇到收敛性问题,我们可以通过使用更大的小批量或者切换到改良的估计值$s_t$来修正它们。Yogi提供了这样的替代方案

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-12-4 00:44 , Processed in 0.101256 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表