在实践中常用到一阶优化函数,典型的一阶优化函数包括 BGD、SGD、mini-batch GD、Momentum、Adagrad、RMSProp、Adadelta、Adam 等等,一阶优化函数在优化过程中求解的是参数的一阶导数,这些一阶导数的值就是模型中参数的微调值。另外,近年来二阶优化函数也开始慢慢被研究起来,二阶方法因为计算量的问题,现在还没有被广泛地使用。

深度学习模型的优化是一个非凸函数优化问题,这是与凸函数优化问题对应的。对于凸函数优化,任何局部最优解即为全局最优解。几乎所有用梯度下降的优化方法都能收敛到全局最优解,损失曲面如下:

而非凸函数优化问题则可能存在无数个局部最优点,损失曲面如下,可以看出有非常多的极值点,有极大值也有极小值。

本文将从原理、公式、代码、loss曲线图、优缺点等方面详解论述:

  • 一、BGD/SGD/mini-batch GD
    • 1.1 BGD
    • 1.2 SGD
    • 1.3 Mini-batch GD
    • 1.4 GD法的缺点
  • 二、Momentum/NAG
    • 2.1 Momentum
    • 2.2 NAG
  • 三、Adagrad/RMSProp/Adadelta
    • 3.1 Adagrad
    • 3.2 RMSProp
    • 3.3 AdaDelta
  • 四、Adam\AMSgrad
    • 4.1 Adam
    • 4.2 AMSgrad
  • 五、不同优化函数比较
  • 六、pytorch不同优化函数的定义

一、BGD/SGD/mini-batch GD

梯度下降算法主要有BGD、SGD、mini-batch GD,后面还有梯度下降算法的改进,即Momentum、Adagrad 等方法

1.1 BGD

BGD(Batch gradient descent,批量梯度下降),是拿所有样本的loss计算梯度来更新参数的,更新公式如下:
θ=θ−η⋅∇θJ(θ)\theta=\theta-\eta· \nabla_\theta J(\theta)θ=θ−η⋅∇θ​J(θ)

在有的文献中,称GD是拿所有样本的loss计算梯度来更新参数,也就是全局梯度下降,和这里的BGD是一个意思

其中,θ\thetaθ为要更新的参数,即weight、bias;η\etaη 为学习率;JJJ为损失函数,即 loss function ;∇θJ(θ)\nabla_\theta J(\theta)∇θ​J(θ) 是指对 loss function 的 θ\thetaθ 求梯度。

令Δθt=−η⋅∇θJ(θ)\Delta\theta_t=-\eta· \nabla_\theta J(\theta)Δθt​=−η⋅∇θ​J(θ),则θt+1=θt+Δθt\theta_{t+1}=\theta_{t}+\Delta\theta_tθt+1​=θt​+Δθt​,θ1\theta_{1}θ1​ 即初始化的weight、bias。

写成伪代码如下:

# all_input和all_target是所有样本的特征向量和label
for i in range(epochs):optimizer.zero_grad()output = model(all_input)loss = loss_fn(output,all_target)loss.backward()optimizer.step()

在loss的等值线图中,随着 weight 的变化loss降低的曲线走向(红线)如下所示:

其中 x1是纵轴,x2是横轴 ;weight=[x1,x2]weight=[x1,x2]weight=[x1,x2] ,即两个坐标轴对应的点;Xi=[x1i,x2i]X_i=[x1_i,x2_i]Xi​=[x1i​,x2i​],即weight不同时刻的取值;X0=[x10,x20]X_0=[x1_0,x2_0]X0​=[x10​,x20​]是weight的初始化值。

从上图中可以看出,BGD的loss曲线走向相对平滑,每一次优化都是朝着最优点走

由于BGD在每次计算损失值时都是针对整个参与训练的样本而言的,所以会出现内存装不下,速度也很慢的情况。能不能一次取一个样本呢?于是就有了随机梯度下降(Stochastic gradient descent),简称 sgd。

1.2 SGD

SGD(Stochastic gradient descent,随机梯度下降)是一次拿一个样本的loss计算梯度来更新参数,其更新公式如下:

其中,x(i)x^{(i)}x(i) 是第一个样本的特征向量,y(i)y^{(i)}y(i) 是第i个样本的真实值。

也可以写成如下形式:

其中,gt,ig_{t,i}gt,i​ 是第i个样本的梯度。

写成伪代码如下:

for i in range(epochs):# batch=1,每次从dataset取出一个样本for input_i,target_i in dataset:optimizer.zero_grad()output = model(all_input)loss = loss_fn(output,all_target)loss.backward()optimizer.step()

在loss的等值线图中,随着 weight 的变化loss降低的曲线走向如下所示:

从上图中可以看出,SGD的loss曲线走向是破浪式的,相对于BGD的方式,波动大,在非凸函数优化问题中,SGD可能使梯度下降到更好的另一个局部最优解,但从另一方面来讲,SGD的更新可能导致梯度一直在局部最优解附近波动

SGD的不确定性较大,可能跳出一个局部最优解到另一个更好的局部最优解,也可能跳不出局部最优解,一直在局部最优解附近波动

由于同一类别样本的特征是相似的,因此某一个样本的特征能在一定程度代表该类样本,所以SGD最终也能够达到一个不错的结果,但是,SGD的更新方式的波动大,更新方向前后有抵消,存在浪费算力的情况。于是,就有了后来大家常用的小批量梯度下降算法(Mini-batch gradient descent)。

1.3 Mini-batch GD

Mini-batch GD(Mini-batch gradient descent,小批量梯度下降)是一次拿一个batch的样本的loss计算梯度来更新参数,其更新公式如下:

其中,batch_size=n。

写成伪代码如下:

for i in range(epochs):# batch_size=n,每次从dataset取n个样本for input,target in dataset:optimizer.zero_grad()output = model(all_input)loss = loss_fn(output,all_target)loss.backward()optimizer.step()

在loss的等值线图中,随着 weight 的变化loss降低的曲线走向如下所示:

从上图可以看出,mini-batch GD 的loss走向曲线在BGD和SGD之间,mini-batch GD 既解决了SGD更新方式波动大的问题,又可以尽量去计算多个样本的loss,提高参数的更新效率。

1.4 GD法的缺点

梯度下降算法虽然取得了一定的效果,但是仍然有以下缺点:

  • 学习率大小比较难缺难确定,需要反复去试
  • 学习率不够智能,对每个参数的各个维度一视同仁
  • mini-batch GD算法中,虽然一定程度上提高参数的更新效率,并没有完全解决SGD中的问题,即更新方向仍然前后有抵消,仍然有浪费算力的情况
  • SGD和mini-batch GD由于每次参数训练的样本是随机选取的,模型会受到随机训练样本中噪声数据的影响,又因为有随机的因素,所以也容易导致模型最终得到局部最优解。

二、Momentum/NAG

知道了GD法的缺点,动量法通过之前积累梯度来替代真正的梯度从而避免GD法浪费算力的缺点,加快更新速度,我们现在来看动量法(momentum)和其改进方法NAG吧。

2.1 Momentum

在使用梯度下降算法的时,刚开始的时候梯度不稳定,波动性大,导致做了很多无用的迭代,浪费了算力,动量法(momentum)解决SGD/mini-batch GD中参数更新震荡的问题,通过之前积累梯度来替代真正的梯度,从而加快更新速度,其更新公式如下:
υt=γυt−1+η⋅∇θJ(θ)θ=θ−υt\begin{array}{l} \upsilon_t=\gamma\upsilon_{t-1}+\eta· \nabla_\theta J(\theta)\\ \theta=\theta-\upsilon_t \end{array}υt​=γυt−1​+η⋅∇θ​J(θ)θ=θ−υt​​
其中,θ\thetaθ是要更新的参数即weight,∇θJ(θ)\nabla_\theta J(\theta)∇θ​J(θ)是损失函数关于weight的梯度,γ\gammaγ为动量因子,通常设为0.9;η\etaη 为学习率。这里新出现了一个变量 υ\upsilonυ,对应物理上的速度。
也可以写成下面的形式(不常用):

其中,ρ\rhoρ为动量因子,通常设为0.9;α\alphaα为学习率。

只看公式可能不好理解,我们来代入计算下吧。

假设 η\etaη 学习率为0.1,用 g 表示损失函数关于weight的梯度,则可计算如下:

动量法(momentum)更新示意图如下所示:

这样, 每个参数的实际更新差值取决于最近一段时间内梯度的加权平均值。当某个参数在最近一段时间内的梯度方向不一致时, 其真实的参数更新幅度变小,增加稳定性; 相反, 当在最近一段时间内的梯度方向都一致时, 其真实的参数更新幅度变大, 起到加速作用。

一般而言, 在迭代初期, 梯度方向都比较一致, 动量法会起到加速作用, 可以更快地到达最优点。在迭代后期, 梯度方向会不一致, 在收敛值附近振荡, 动量法会起到减速作用, 增加稳定性。动量法也能解决稀疏梯度和噪声问题,这个到Adam那里会有详细解释。

2.2 NAG

NAG(Nesterov Accelerated Gradient,Nesterov加速梯度)是一种对动量法的改进方法, 也称为 Nesterov 动量法(Nesterov Momentum)。其公式如下:

其中,∇θJ(θ−γυt−1)\nabla_\theta J(\theta-\gamma\upsilon_{t-1})∇θ​J(θ−γυt−1​)是损失函数关于下一次(提前点)weight的梯度。

也可以写为(不常用):

NAG更新示意图如下所示:

由于momentum刚开始时梯度方向都比较一致,收敛较快,但是到后期,由于momentum惯性的存在,很可能导致在loss极值点的附近来回震荡,而NAG向前计算了一次梯度,当梯度方向快要改变的时候,它提前获得了该信息,从而减弱了这个过程,再次减少了无用的迭代,并保证能顺利更新到loss的极小值点

三、Adagrad/RMSProp/Adadelta

在神经网络的学习中,学习率(η\etaη)的值很重要。学习率过小,会导致学习花费过多时间;反过来,学习率过大,则会导致学习发散而不能正确进行。

在关于学习率的有效技巧中,有一种被称为学习率衰减(learning rate decay)的方法,即随着学习的进行,使学习率逐渐减小。实际上,一开始“多”学,然后逐渐“少”学的方法,在神经网络的学习中经常被使用。逐渐减小学习率的想法,相当于将“全体”参数的学习率值一起降低。而AdaGrad进一步发展了这个想法,针对“一个一个”的参数,赋予其“定制”的值,现在我们来看Adagrad/RMSProp/Adadelta吧。

3.1 Adagrad

AdaGrad(Adaptive Grad,自适应梯度)为参数的每个参数自适应地调整学习率,让不同的参数具有不同的学习率,其公式如下:

其中,W表示要更新的权重参数,∂L∂W\frac{{\partial L}}{{\partial W}}∂W∂L​表示损失函数关于W的梯度,η\etaη表示学习率,这里新出现了变量hhh,它保存了以前的所有梯度值的平方和,⊙\odot⊙表示对应矩阵元素的乘法。然后,在更新参数时,通过乘以 1h\frac{1}{\sqrt h}h​1​,就可以调整学习的尺度。这意味着,参数的元素中变动较大(被大幅更新)的元素的学习率将变小。也就是说,可以按参数的元素进行学习率衰减,使变动大的参数的学习率逐渐减小

Adagrad公式也可以写为:

其中, gτ∈Rg_\tau \in Rgτ​∈R 是第τ\tauτ次迭代时的梯度,α\alphaα为初始的学习率,ε\varepsilonε是为了保持数值稳定性而设置的非常小的常数, 一般取值 e−7e^{−7}e−7 到 e−10e^{−10}e−10,此外, 这里的开平方、 除、 加运算都是按元素进行的操作。

由于Adagrad学习率衰减用了所有的梯度,如果在经过一定次数的迭代依然没有找到最优点时,累加的梯度幅值是越来越大的,导致学习率越来越小, 很难再继续找到最优点,为了改善这个问题,从而提出RMSProp算法。

3.2 RMSProp

与AdaGrad不同,RMSProp(Root Mean Square Propagation,均方根传播) 方法并不是将过去所有的梯度一视同仁地相加,而是逐渐地遗忘过去的梯度,在做加法运算时将新梯度的信息更多地反映出来,这种操作从专业上讲,称为“指数移动平均”,呈指数函数式地减小过去的梯度的尺度

其中,β\betaβ 为衰减率, 一般取值为 0.9,α\alphaα为初始的学习率, 比如 0.001。

从上式可以看出, RMSProp 算法和 AdaGrad 算法的区别在于 GtG_tGt​ 的计算由累积方式变成了指数衰减移动平均。在迭代过程中, 并且,每个参数的学习率并不是呈衰减趋势, 既可以变小也可以变大(把β\betaβ设的更小些,每个参数的学习率就呈变大趋势)。

这里不得不提一下RProp,Rprop可以看做 RMSProp的简单版,它是依据符号来改变学习率的大小:当最后两次梯度符号一样,增大学习率,当最后两次梯度符号不同,减小学习率。

3.3 AdaDelta

AdaDelta 与 RMSprop 算法类似, AdaDelta 算法也是通过梯度平方的指数衰减移动平均来调整学习率。此外, AdaDelta 算法还引入了每次参数更新差值Δ

【超详细】对比10种优化函数BGD、SGD、mini-batch GD、Momentum、NAG、Adagrad、RMSProp、Adadelta、Adam、AMSgrad相关推荐

  1. 各种优化算法总结(区别及联系)SGD Momentum NAG Aadagrad RMSprop AadaDelta Adam Nadam

    文章是最近整理的一些深度学习优化算法总结,具体参考文献见文章末尾: 刚刚开始接触优化算法,林林总总,认识总是很浅薄,但是当你拿过来看的时候,发现从刚刚开始的SGD到现在的adam.Nadam等,原理上 ...

  2. 2017深度学习最新报告及8大主流深度学习框架超详细对比(内含PPT)

    2017深度学习最新报告(PPT) ​ 深度学习领军人物 Yoshua Bengio 主导的蒙特利尔大学深度学习暑期学校目前"深度学习"部分的报告已经全部结束. 本年度作报告的学术 ...

  3. 【机器学习】交叉验证详细解释+10种常见的验证方法具体代码实现+可视化图

    [机器学习]交叉验证详细解释+10种常见的验证方法具体代码实现+可视化图 一.使用背景 由于在训练集上,通过调整参数设置使估计器的性能达到了最佳状态:但在测试集上可能会出现过拟合的情况. 此时,测试集 ...

  4. 小米电视系统统计服务器,史上最全!小米电视4 各系列超详细对比

    原标题:史上最全!小米电视4 各系列超详细对比 小米电视作为智能电视的新秀,以优秀的品牌号召力.良好的口碑,当然免不了小米一直以来的价格攻势,逐渐成为电视领域的领头羊,目前市面上包含小米电视4.4A. ...

  5. DL之DNN优化技术:神经网络算法简介之GD/SGD算法(BP的梯度下降算法)的简介、理解、代码实现、SGD缺点及改进(Momentum/NAG/Ada系列/RMSProp)之详细攻略

    DL之DNN优化技术:神经网络算法简介之GD/SGD算法(BP的梯度下降算法)的简介.理解.代码实现.SGD缺点及改进(Momentum/NAG/Ada系列/RMSProp)之详细攻略 目录 GD算法 ...

  6. 2019pro与air怎么选_MacBookAir 2020和MacBookPro 2019该选谁?超详细对比告诉你

    日前,苹果在官方商城上线的2020款MacBook Air 已经正式开售,但是,不少小伙伴却在新款 MacBook Air 和老款 MacBook Pro(13英寸)之间犯了"选择困难症&q ...

  7. 图像压缩哪家强?请看这份超详细对比

    在碎片化阅读充斥眼球的时代,越来越少的人会去关注每篇论文背后的探索和思考. 在这个栏目里,你会快速 get 每篇精选论文的亮点和痛点,时刻紧跟 AI 前沿成果. 点击本文底部的「阅读原文」即刻加入社区 ...

  8. PyTorch的十个优化器(SGD,ASGD,Rprop,Adagrad,Adadelta,RMSprop,Adam(AMSGrad),Adamax,SparseAdam,LBFGS)

    本文截取自<PyTorch 模型训练实用教程>,获取全文pdf请点击:https://github.com/tensor-yu/PyTorch_Tutorial 文章目录 1 torch. ...

  9. 20张图详细对比8种室内RTLS(实时定位)技术

    关注.星标公众号,直达精彩内容 来源 | 导航圈 作者 | 北斗天玑 RTLS即 Real Time Location Systems的简称,实时定位系统. RTLS是一种基于信号的无线电定位手段,可 ...

最新文章

  1. linux c 函数 link symlink unlink 链接相关功能
  2. 【JavaScript基础系列】决定你的人生能走多远的,是基础。
  3. 3 linux禁用ssl_ESXI申请阿里云SSL证书并配置
  4. PHP于js的交互,关于php与js交互问题
  5. P4015 运输问题
  6. Logtail从入门到精通(三):机器分组配置
  7. goland创建一个不限长度的字节切片_Go语言3 : 切片
  8. Linux下squid代理缓存服务环境部署
  9. 2014 找工作总结
  10. Nutch数据集的目录具体内容
  11. python静态地图_Matplotlib Toolkits:地图绘制工具
  12. 医院后勤管理软件系统助力医院后勤管理实施国家数字低碳战略
  13. 什么是jdk的java运行工具_下面( )是 JDK 中的 JAVA 运行工具。
  14. http://www.cocoachina.com/ios/20150907/13336.html
  15. 艾克---BBB时间设置
  16. android手机的文件格式,安卓手机如何打开.apk文件?
  17. 十个Google关键词分析工具
  18. 手机消息通知服务器,手机通知消息服务
  19. 计算机毕业设计django基于python智能在线考试阅卷系统
  20. 基因预测软件-Augustus安装过程

热门文章

  1. 2022-2028年中国地震预警行业投资潜力分析及发展前景展望报告
  2. 亚马逊ERP软件贴牌OEM是什么意思有什么优势
  3. 啃下这三块最难啃的硬骨头,你将在嵌入式C语言中大放异彩
  4. 小飞升值记——(23)
  5. 改版后的51la统计,与旧版有何区别呢?
  6. 强化学习(Reinforcement Learning)背景介绍
  7. 阿龙的学习笔记---Effective C++---第一章:习惯C++
  8. 【opencv 一日一练】 api 之 blur
  9. iOS 绘制纯色图片与渐变色图片
  10. Java切图或者判断是不是纯色图片