深度学习常见优化算法总结

深度学习常见优化算法总结

之前了解深度学习时接触了优化算法,但是一直是有一个印象,这次有时间就一起整理学习下深度学习的优化算法,开始学习~😜
在一个深度学习问题中,我们通常会预先定义一个损失函数。有了损失函数以后,我们就可以使用优化算法试图将其最小化。
在深度学习中,包括传统的 SGD,Momentum SGD,AdaGrad,RMSProp 和 Adam 等。不过光看图可能无法理解其中的精妙之处,本文将会从数学的基础知识出发,初步介绍深度学习中的一些优化算法,最后进行一些简单的案例分析。
优化算法虽然是试图将损失函数最小化,其实是通过迭代模型参数来达到损失函数最小化。

1. 数学基础知识

在了解深度学习的优化算法之前,先回顾一些必备的数学基础知识

具体可参考数学基础知识回顾这里就不重复解释

2. 梯度下降和随机梯度下降

在这一节中将介绍梯度下降(gradient descent)的工作原理。虽然梯度下降在深度学习中很少被直接使用,但理解梯度的意义以及沿着梯度反方向更新自变量可能降低目标函数值的原因是学习后续优化算法的基础。随后,我们将引出随机梯度下降(stochastic gradient descent)。
从数学上的角度来看,梯度的方向是函数增长速度最快的方向,那么梯度的反方向就是函数减少最快的方向。那么,如果想计算一个函数的最小值,就可以使用梯度下降法的思想来做。

2.1 一维梯度下降

一维函数的梯度是一个标量,也称导数。
通过在这里插入图片描述
来迭代x,函数f(x)的值可能会降低。因此在梯度下降中,我们先选取一个初始值x和常数η>0,然后不断通过上式来迭代x,直到达到停止条件,例如f函数f(x)的二阶导的值已足够小(函数已经达到收敛)或迭代次数已达到某个值。
补充
上述梯度下降算法中的正数η通常叫作学习率。这是一个超参数,需要人工设定。如果使用过小的学习率,会导致x更新缓慢从而需要更多的迭代才能得到较好的解。

2.2 多维梯度下降

了解了一维梯度下降,再来理解多维梯度下降更加容易。多维是一维更广义的情乱:目标函数的输入为向量,输出为标量。假设目标函数f:Rd→R的输入是一个d维向量x=[x1,x2,…,xd]⊤。目标函数f(x)有关x的梯度是一个由d个偏导数组成的向量(多维梯度):
在这里插入图片描述
因此,我们可能通过梯度下降算法来不断降低目标函数f(x)的值:
在这里插入图片描述

2.3 随机梯度下降 SGD(解决训练数据很大的情况下)

在深度学习里,目标函数通常是训练数据集中有关各个样本的损失函数的平均。设fi(x)是有关索引为i的训练数据样本的损失函数,n是训练数据样本数,x是模型的参数向量,那么目标函数定义为:
在这里插入图片描述
目标函数在x处的梯度计算为:
在这里插入图片描述
如果使用梯度下降,每次自变量迭代的计算开销为O(n),它随着n线性增长。因此,当训练数据样本数很大时,梯度下降每次迭代的计算开销很高。
因此引入了随即梯度下降,随机梯度下降(stochastic gradient descent,SGD)减少了每次迭代的计算开销。在随机梯度下降的每次迭代中,我们随机均匀采样一个样本索引i∈1,…,n,并计算梯度∇fi(x)来迭代x:
在这里插入图片描述
这里η同样是学习率。可以看到每次迭代的计算开销从梯度下降的O(n)降到了常数O(1)。值得强调的是,随机梯度∇fi(x)是对梯度∇f(x)的无偏估计。
平均来说,随机梯度是对梯度的一个良好的估计。

随机梯度下降法(SGD)是一种非常经典的优化算法,常应用在机器学习中,尤其是深度学习中。
SGD中的超参数是学习率,在实际的训练中,我们需要逐步地降低学习率,通常采用指数衰减的策略对学习率进行调整。

3. 小批量随机梯度下降

其实就是上面讲的随机梯度下降,随机梯度下降指的是每次迭代都只随机采样一个样本来计算梯度,小批量随机梯度下降是每次迭代随机采样多个样本来组成一个小批量,然后使用这个小批量来计算梯度。
在这里插入图片描述
**小批量随机梯度下降中每次迭代的计算开销为O(|B|)。当批量大小为1时,该算法即为随机梯度下降;当批量大小等于训练数据样本数时,该算法即为梯度下降。**当批量较小时,每次迭代中使用的样本少,这会导致并行处理和内存使用效率变低。这使得在计算同样数目样本的情况下比使用更大批量时所花时间更多。当批量较大时,每个小批量梯度里可能含有更多的冗余信息。为了得到较好的解,批量较大时比批量较小时需要计算的样本数目可能更多,例如增大迭代周期数。

4. 动量SGD算法

动量是一个物理学中类比过来的概念,它是为了解决经典的SGD收敛速度慢的问题而提出的。使得自变量的更新方向更加一致,从而降低发散的可能。动量算法在相关方向上加速了随机梯度下降,如 以及抑制振荡。
上述算法都是从梯度影响位置来考虑的,动量法从物理观点建议梯度只是影响速度,然后速度再影响位置动量这个参数的物理意义与摩擦系数更一致,通过交叉验证,动量参数值通常设为[0.5,0.9,0.95,0.99]中的一个。
它能够保留上一轮更新中的参数更新增量,并加入该轮的梯度。
参数更新变为:
在这里插入图片描述

v的更新为:
在这里插入图片描述
其中α是动量参数,可以发现参数θ更新不再是仅仅加上梯度变化
在这里插入图片描述
而是加上了一个速度v,这个v就表示引入的动量元素。
通过上个式子也可以看出来:
第一,它可以保留上一次的梯度信息,通过动量参数来控制上一次的更新量对本次更新量的影响,注意到它是一个非负项,所以它起到了“惯性”的作用,上一次的增量大则带给本次更新的增量影响就大;如果上一次的增量小,那么它带给本次更新的增量影响就小。

对比经典SGD算法和动量SGD算法:
经典SGD算法:直接用梯度更新参数θ:
在这里插入图片描述
动量SGD算法:分两步走
1.计算速度v更新.
2. 利用速度v来更新参数θ
在这里插入图片描述
给出动量SGD算法流程如下:
在这里插入图片描述
接下来介绍的优化算法皆属于自适应学习率算法

5. 自适应学习率算法——优化算法

学习率本身就是很难调试的一个超参数,这是工业界公认的事情。动量算法只能在一定程度上缓解调参的压力,但代价是多引入了一个超参数。总有人会想有没有更简便的方法,于是就提出来了Adagrad, AdaDelta, Adam, RMSProp, 动量RMSProp等自适应学习率算法。本节梳理各个算法流程,并进行对比。
在之前介绍过的优化算法中,目标函数自变量的每一个元素在相同时间步都使用同一个学习率来自我迭代。

5.1 Adagrad算法

本节我们介绍AdaGrad算法,它根据自变量在每个维度的梯度值的大小来调整各个维度上的学习率,从而避免统一的学习率难以适应所有维度的问题。
在这里插入图片描述
Adagrad算法可以说是与SGD算法的框架非常像了,可以来对比一下区别之处:
SGD算法中的参数更新:
1.直接用梯度来更新参数θ
在这里插入图片描述
2. Adagrad算法中的参数更新:
1.梯度累积变量与梯度内积累加得到累积平方梯度r
2.利用累积平方梯度计算参数更新量▲θ
3.利用参数更新量▲θ更新参数θ
在这里插入图片描述

5.2 AdaDelta

另一个常用优化算法AdaDelta算法也针对AdaGrad算法在迭代后期可能较难找到有用解的问题做了改进。有意思的是,AdaDelta算法没有学习率这一超参数。

在这里插入图片描述
AdaDelta算法是adagrad算法的延伸和改进,他们的不同之处在于:
AdaDelta算法中的参数更新:
在这里插入图片描述

5.3 RMSProp算法

在AdaGrad算法中提到,因为调整学习率时分母上的变量r一直在累加按元素平方的小批量随机梯度,所以目标函数自变量每个元素的学习率在迭代过程中一直在降低(或不变)。因此,当学习率在迭代早期降得较快且当前解依然不佳时,AdaGrad算法在迭代后期由于学习率过小,可能较难找到一个有用的解。为了解决这一问题,RMSProp算法对AdaGrad算法做了一点小小的修改。该算法源自Coursera上的一门课程,即“机器学习的神经网络。
在这里插入图片描述
RMSProp算法实际上对AdaGrad算法做出了改进,修改了累积平方梯度和参数更新量的计算方法,在非凸情况下比AdaGrad效果较好。
RMSProp算法和AdaGrad算法区别在于:
RMSProp算法:
1.梯度累积变量与梯度内积累加得到累积平方梯度.
2.利用累积平方梯度计算参数更新量▲θ。
在这里插入图片描述

5.4 Adam算法(这是笔者经常使用的)

Adam算法在RMSProp算法基础上对小批量随机梯度也做了指数加权移动平均 。所以Adam算法可以看做是RMSProp算法与动量法的结合。
算法:Adam算法流程:
在这里插入图片描述
其中修正二阶矩的偏差为:
在这里插入图片描述
把s换成r即可
Adam算法与其他的优化算法相比,区别还是比较大的,在参数更新的过程中,首先计算了有偏一阶矩和二阶矩,然后修正一阶矩和二阶矩的偏差,再用修正后的一阶和二阶矩求解参数更新量,最后利用参数更新量对参数进行更新。

参考:
深度学习里的一些优化算法

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值