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

优化算法 - RMSProp算法

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







1 - 算法




  1. import math
  2. import torch
  3. from d2l import torch as d2l
  4. d2l.set_figsize()
  5. gammas = [0.95,0.9,0.8,0.7]
  6. for gamma in gammas:
  7.     x = torch.arange(40).detach().numpy()
  8.     d2l.plt.plot(x,(1 - gamma) * gamma ** x,label=f'gamma = {gamma:.2f}')
  9. d2l.plt.xlabel('time')
复制代码
  1. Text(0.5, 0, 'time')
复制代码
  ​   
2 - 从零开始实现

和之前一样,我们使用二次函数$f(x)=0.1x_1^2+2x_2^2$来不雅察看RMSProp算法的轨迹。回想在11.7节中,当我们使用学习率为0.4的Adagrad算法时,变量在算法的后期阶段移动非常迟缓,因为学习率衰减太快。RMSProp算法中不会发生这种情况,因为η时单独控制的
  1. def rmsprop_2d(x1,x2,s1,s2):
  2.     g1,g2,eps = 0.2 * x1,4 * x2,1e-6
  3.     s1 = gamma * s1 + (1 - gamma) * g1 ** 2
  4.     s2 = gamma * s2 + (1 - gamma) * g2 ** 2
  5.     x1 -= eta / math.sqrt(s1 + eps) * g1
  6.     x2 -= eta / math.sqrt(s2 + eps) * g2
  7.     return x1,x2,s1,s2
  8. def f_2d(x1,x2):
  9.     return 0.1 * x1 **2 + 2 * x2 ** 2
  10. eta,gamma = 0.4,0.9
  11. d2l.show_trace_2d(f_2d,d2l.train_2d(rmsprop_2d))
  12. epoch 20, x1: -0.010599, x2: 0.000000
  13. C:\Users\20919\anaconda3\envs\d2l\lib\site-packages\torch\functional.py:478: UserWarning: torch.meshgrid: in an upcoming release, it will be required to pass the indexing argument. (Triggered internally at  C:\actions-runner\_work\pytorch\pytorch\builder\windows\pytorch\aten\src\ATen\native\TensorShape.cpp:2895.)
  14.   return _VF.meshgrid(tensors, **kwargs)  # type: ignore[attr-defined]
复制代码

接下来,我们在深度网络中实现RMSProp算法
  1. def init_rmsprop_states(feature_dim):
  2.     s_w = torch.zeros((feature_dim,1))
  3.     s_b = torch.zeros(1)
  4.     return (s_w,s_b)
  5. def rmsprop(params,states,hyperparams):
  6.     gamma,eps = hyperparams['gamma'],1e-6
  7.     for p,s in zip(params,states):
  8.         with torch.no_grad():
  9.             s[:] = gamma * s + (1 - gamma) * torch.square(p.grad)
  10.             p[:] -= hyperparams['lr'] * p.grad / torch.sqrt(s + eps)
  11.         p.grad.data.zero_()
复制代码
我们将初始学习率设置为0.01,加权γ设置为0.9.也就是说,s累加了过去的$\frac{1}{1-\gamma}=10$次平方梯度不雅观测值的平均值
  1. data_iter,feature_dim = d2l.get_data_ch11(batch_size=10)
  2. d2l.train_ch11(rmsprop,init_rmsprop_states(feature_dim),
  3.               {'lr':0.01,'gamma':0.9},data_iter,feature_dim);
  4. loss: 0.245, 0.005 sec/epoch
复制代码

3 - 简洁实现

我们可直接使用深度学习框架中提供的RMSProp算法来训练模型
  1. trainer = torch.optim.RMSprop
  2. d2l.train_concise_ch11(trainer,{'lr':0.01,'alpha':0.9},data_iter)
  3. loss: 0.243, 0.005 sec/epoch
复制代码

4 - 小结


  • RMSProp算法与Adgrad算法非常相似,因为两者都使用梯度的平方缩放系数
  • RMSProp算法与动量法度使用泄露平均值。但是RMSProp算法使用该技术来调整系数挨次的预措置
  • 在尝试中,学习率需要尝试者调剂
  • 系数γ决定了在调整每坐标比例时历史记录的时长

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-12-21 21:11 , Processed in 0.202365 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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