文章目录

  • 动量法
    • 1 - 基础
      • 泄露平均值
      • 条件不佳的问题
      • 动量法
      • 有效样本权重
    • 2 - 实际实验
      • 从零开始实现
      • 简洁实现
    • 3 - 理论分析
    • 4 - 小结

动量法

如何执行随机梯度下降,即只在嘈杂的梯度可用的情况下执行优化时会发生什么。对于嘈杂的梯度,我们在选择学习率需要格外谨慎。若衰减速度太快,收敛就会停滞。相反,若太宽松,我们可能无法收敛到最优解

1 - 基础

在本节中,我们将讨论更有效的优化算法,尤其是针对实验中常见的某些类型的优化问题

泄露平均值


其中,较大的β相当于长期平均值,而较小的β相对于梯度法只是略有修正。新的梯度替换不再指定特定实例下降最陡的方向,而是指向过去梯度的加权平均值的方向。这使我们能够实现对单批量计算平均值的大部分好处,而不产生实际计算其梯度的代价

上述推理构成了“加速”梯度方法的基础,例如具有动量的梯度。在优化问题条件不佳的情况下(例如,有些方向的进展比其他方向慢得多,类似狭窄的峡谷),“加速”梯度还额外享受更有效的好处。此外,它们允许我们对随后的梯度计算平均值,以获得更稳定的下降方向。诚然,即使是对于无噪声凸问题,加速度这方面也是动量如此起效的关键原因之一

正如人们所期望的,由于其功效,动量是深度学习及其后优化中一个深入研究的主题

条件不佳的问题

%matplotlib inline
import torch
from d2l import torch as d2leta = 0.4
def f_2d(x1,x2):return 0.1 * x1 ** 2 + 2 * x2 ** 2def gd_2d(x1,x2,s1,s2):return (x1 - eta * 0.2 * x1,x2 - eta * 4 * x2,0,0)d2l.show_trace_2d(f_2d,d2l.train_2d(gd_2d))
epoch 20, x1: -0.943467, x2: -0.000073C:\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.)return _VF.meshgrid(tensors, **kwargs)  # type: ignore[attr-defined]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2EA5gO6B-1663327684951)(https://yingziimage.oss-cn-beijing.aliyuncs.com/img/202209161925190.svg)]

从构造来看,x2⽅向的梯度⽐⽔平x1⽅向的梯度⼤得多,变化也快得多。因此,我们陷⼊两难:如果选择较⼩的学习率,我们会确保解不会在x2⽅向发散,但要承受在x1⽅向的缓慢收敛。相反,如果学习率较⾼,我们在x1⽅向上进展很快,但在x2⽅向将会发散。下⾯的例⼦说明了即使学习率从0.4略微提⾼到0.6,也会发⽣变化。x1⽅向上的收敛有所改善,但整体来看解的质量更差了

eta = 0.6
d2l.show_trace_2d(f_2d, d2l.train_2d(gd_2d))
epoch 20, x1: -0.387814, x2: -1673.365109

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vMLbQvSe-1663327684951)(https://yingziimage.oss-cn-beijing.aliyuncs.com/img/202209161925191.svg)]

动量法

def momentum_2d(x1,x2,v1,v2):v1 = beta * v1 + 0.2 * x1v2 = beta * v2 + 4 * x2return x1 - eta * v1,x2 - eta * v2,v1,v2eta,beta = 0.6,0.5
d2l.show_trace_2d(f_2d,d2l.train_2d(momentum_2d))
epoch 20, x1: 0.007188, x2: 0.002553

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EwOyfqCN-1663327684952)(https://yingziimage.oss-cn-beijing.aliyuncs.com/img/202209161925192.svg)]

正如所见,尽管学习率与我们以前使用的相同,动量法仍然很好地收敛了。让我们看看当降低动量参数时会发生什么,将其减半至β=0.25会导致一条几乎没有收敛的轨迹。尽管如此,它比没有动量时解将会发散要好得多

eta,beta=0.6,0.25
d2l.show_trace_2d(f_2d,d2l.train_2d(momentum_2d))
epoch 20, x1: -0.126340, x2: -0.186632

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YuAmqcQx-1663327684952)(https://yingziimage.oss-cn-beijing.aliyuncs.com/img/202209161925193.svg)]

请注意,我们可以将动量法与随机梯度下降,特别时小批量随机梯度下降结合起来。唯一的变化是,在这种情况下,我们将梯度 g t , t − 1 g_{t,t-1} gt,t−1​替换为 g t g_t gt​。为了方便期间,我们在时间t=0初始化为 v 0 = 0 v_0=0 v0​=0

有效样本权重

d2l.set_figsize()
betas = [0.95,0.9,0.6,0]for beta in betas:x = torch.arange(40).detach().numpy()d2l.plt.plot(x,beta ** x,label = f'beta = {beta:.2f}')
d2l.plt.xlabel('time')
d2l.plt.legend()
<matplotlib.legend.Legend at 0x164da1591f0>


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MIZMFrbF-1663327684952)(https://yingziimage.oss-cn-beijing.aliyuncs.com/img/202209161925194.svg)]

2 - 实际实验

让我们来看看动量法在实验中是如何运作的。为此,我们需要一个更加可扩展的实现

从零开始实现

相比如小批量随机梯度下降,动量方法需要维护一组辅助变量,即速度。它与梯度以及优化问题的变量有相同的形状。在下面的实现中,我们称这些变量为states

def init_momentum_states(feature_dim):v_w = torch.zeros((feature_dim,1))v_b = torch.zeros(1)return (v_w,v_b)
def sgd_momentum(params,states,hyperparams):for p,v in zip(params,states):with torch.no_grad():v[:] = hyperparams['momentum'] * v + p.gradp[:] -= hyperparams['lr'] * vp.grad.data.zero_()

让我们来看看它在实验中是如何运作的

def train_momentum(lr,momentum,num_epochs=2):d2l.train_ch11(sgd_momentum,init_momentum_states(feature_dim),{'lr':lr,'momentum':momentum},data_iter,feature_dim,num_epochs)data_iter,feature_dim = d2l.get_data_ch11(batch_size=10)
train_momentum(0.02,0.5)
loss: 0.246, 0.006 sec/epoch

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6qtTGfkr-1663327684953)(https://yingziimage.oss-cn-beijing.aliyuncs.com/img/202209161925195.svg)]

当我们将动量超参数momentum增加到0.9时,它相当于有效样本数量增加到 1 1 − 0.9 = 10 \frac{1}{1-0.9}=10 1−0.91​=10。我们将学习率略微降至0.01,以确保可控

train_momentum(0.01,0.9)
loss: 0.242, 0.009 sec/epoch

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-06dYtCjS-1663327684953)(https://yingziimage.oss-cn-beijing.aliyuncs.com/img/202209161925196.svg)]

降低学习率进一步解救了任何非平滑优化问题的困难,将其设置为0.005会产生良好的收敛性能

train_momentum(0.005,0.9)
loss: 0.243, 0.006 sec/epoch

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Qw3hQda-1663327684953)(https://yingziimage.oss-cn-beijing.aliyuncs.com/img/202209161925197.svg)]

简洁实现

由于深度学习框架中的优化求解器早已构建了动量法,设置匹配参数会产生非常类似的轨迹

3 - 理论分析

lambdas = [0.1, 1, 10, 19]
eta = 0.1
d2l.set_figsize((6, 4))
for lam in lambdas:t = torch.arange(20).detach().numpy()d2l.plt.plot(t, (1 - eta * lam) ** t, label=f'lambda = {lam:.2f}')
d2l.plt.xlabel('time')
d2l.plt.legend()
<matplotlib.legend.Legend at 0x164da2e35b0>


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OJeWhktu-1663327684953)(https://yingziimage.oss-cn-beijing.aliyuncs.com/img/202209161925198.svg)]

4 - 小结

  • 动量法用过去梯度的平均值来替换梯度,这大大加快了收敛速度
  • 对于无噪声梯度下降和嘈杂的随机梯度下降,动量法都是可取的
  • 动量法可以防止在随机梯度下降的优化过程中停滞的问题
  • 由于对过去的数据进行了指数降权,有效梯度为 1 1 − β \frac{1}{1-\beta} 1−β1​
  • 在凸二次问题中,可以对动量法进行明确而详细的分析
  • 动量法的实现非常简单,但它需要我们存储额外的状态向量(动量v)

优化算法 - 动量法相关推荐

  1. 深度解读最流行的优化算法:梯度下降

    深度解读最流行的优化算法:梯度下降 By 机器之心2016年11月21日 15:08 梯度下降法,是当今最流行的优化(optimization)算法,亦是至今最常用的优化神经网络的方法.本文旨在让你对 ...

  2. 深度学习梯度下降优化算法(AdaGrad、RMSProp、AdaDelta、Adam)(MXNet)

    在深度学习优化算法之动量法[公式推导](MXNet)中,动量法因为使用了指数加权移动平均,解决了自变量更新方向不一致的问题.动量法由于每个元素都使用了相同的学习率来做迭代,这也导致另外一个问题:如果x ...

  3. 【从零开始学习深度学习】43. 算法优化之Adam算法【RMSProp算法与动量法的结合】介绍及其Pytorch实现

    Adam算法是在RMSProp算法基础上对小批量随机梯度也做了指数加权移动平均 [可以看做是RMSProp算法与动量法的结合]. 目录 1. Adam算法介绍 2. 从零实现Adam算法 3. Pyt ...

  4. 深度学习优化算法之动量法[公式推导](MXNet)

    我们在前面的文章中熟悉了梯度下降的各种形态,深度学习优化算法之(小批量)随机梯度下降(MXNet),也了解了梯度下降的原理,由每次的迭代,梯度下降都根据自变量的当前位置来更新自变量,做自我迭代.但是如 ...

  5. 加速收敛_引入Powerball 与动量技术,新SGD优化算法收敛速度与泛化效果双提升 | IJCAI...

    本文介绍的是 IJCAI-2020论文<pbSGD: Powered Stochastic Gradient Descent Methods for Accelerated Non-Convex ...

  6. adam算法_梯度下降/批量(随机)梯度下降/动量法/RMSporp/Adam算法汇总

    我们在机器学习的过程中,当我们构建好我们的模型后要对输出构建损失函数.然后要不断的减小损失函数的值来不断更新优化我们模型中的参数. 那么如何优化我们的参数呢? 梯度下降法: 对1到M这些给出的数据计算 ...

  7. 一阶动量和二阶动量及Adam等优化算法笔记

    就按照 从动量和矩的角度探讨优化理论的内涵(以动量法.AdaGrad和Adam举例) - 知乎 的讲解学习,讲的挺细的.这里补充一些笔记方便以后自己复习用. 1.AdaGrad算法 其中说到了&quo ...

  8. 优化算法之梯度下降法、牛顿法、拟牛顿法和拉格朗日乘数法

      在机器学习中,优化方法是其中一个非常重要的话题,最常见的情形就是利用目标函数的导数通过多次迭代来求解最优化问题. - 无约束最优化问题:梯度下降法.牛顿法.拟牛顿法: - 有约束最优化问题:拉格朗 ...

  9. 【物理应用】基于粒子群优化算法实现瞬变电磁法视电阻率反演附matlab代码

    1 内容介绍 煤矿井下矿井瞬变电磁法(MTEM)探测中,电磁场呈全空间分布,全空间瞬变电磁反演是复杂的非线性问题,目前反演计算中全空间响应主要由半空间响应乘以全空间响应系数来得到,导致反演结果中顶板和 ...

最新文章

  1. 【自动化__持续集成】___java___static
  2. #转载:十大排序方法,动图展示
  3. 【线段树 集合hash】bzoj4373: 算术天才⑨与等差数列
  4. matlab 自再现模,平行平面腔自再现模FoxLi数值迭代解法及MATLAB实现
  5. JS 计算日期天数差
  6. foxmail邮件怎样打印日历
  7. (桌面虚拟化最佳实践--呼叫中心系统优化之二)存储和服务器优化项目
  8. GNS3 1.5.2 无法上传文件的解决办法
  9. web安全day14:扫描与爆破
  10. php源码 学校版 cms,S-CMS学校建站系统PHP源码(含小程序) v5.0 bulid20201126
  11. 大华服务器如何修改IP,大华摄像头更改IP地址
  12. group by 为什么 distinct 效率高
  13. springboot实现word转pdf
  14. bios设置raid启动模式Linux,[BIOS设置]BIOS中RAID模式怎么设置?
  15. 用 Python 切换输入法
  16. 计算机更新一直在57转怎么办,win10系统更新到57%出现死机的原因和解决方法
  17. Linux---Linux是什么
  18. 梦幻仙缘剧情java_梦幻仙缘ios下载-梦幻仙缘苹果版1.0 ios变态版-东坡下载
  19. 计算机考研高数试卷答案,考研数学试卷大全(全国各高校历年试卷)
  20. 数据化分析简单实例——销售预测

热门文章

  1. mysql安装的官方教程_MySQL官方教程及各平台的安装教程和配置详解入口
  2. 感叹北京当程序员月薪1万只能跟在大众后面吃灰
  3. 苏州众里Apache Log4j2 漏洞处置建议
  4. npoi css,NPOI 扩展:NPOI.CSS_html/css_WEB-ITnose
  5. 红旗linux无线网卡,如何让红旗linux使用无线上网卡联网更安全
  6. Nordic DFU OTA参考资料
  7. 【C#】基于Stateless的简易半物理仿真工具
  8. HTML基本的一些知识以及标签的使用
  9. 泰森多边形的建立描述
  10. java列队使用案例