用来更新和计算影响模型训练和模型输出的网络参数,使其逼近或达到最优值,从而最小化(或最大化)损失函数L(x)
【这种算法使用各参数的梯度值来最小化或最大化损失函数L(x)。最常用的一阶优化算法是梯度下降。】
模型内部有些参数,是用来计算测试集的真实值和预测值的偏差程度,基于这些参数,就形成了损失函数L(x)。
我们需要通过优化算法来优化损失函数L(x),使其最小化(或最大化)。
比如说,权重(W)和偏差(b)就是这样的模型内部参数,通过优化算法来更新W和b,使得损失达到最小,参数逼近或达到最优值。
这种算法使用各个参数的梯度值来最小化(或最大化)损失函数L(x)。最常用的一阶优化算法是梯度下降。
函数梯度:导数 d y d x \frac{dy}{dx} dxdy的多变量表达式,用来表示 y y y相对于 x x x的瞬时变化率。往往为了计算多变量函数的导数时,会用梯度取代导数,并使用偏导数来计算梯度。梯度和导数之间的一个主要区别是函数的梯度形成了一个向量场。
因此,对于单变量函数,使用导数来分析;而梯度是基于多变量函数而产生的。
二阶优化算法使用了二阶导数(也叫做Hessian方法)来优化(最小化、最大化)损失函数。由于二阶导数的计算成本很高,所以这种方法并没有广泛使用。
3.1. 梯度下降:
在训练和优化模型时,梯度下降是最常用的优化算法。
梯度下降的功能:通过寻找最小值,控制方差,更新模型参数,最终使模型收敛。
梯度下降主要用于在神经网络模型中进行权重更新,即在一个方向上更新和调整模型的参数,来最小化损失函数。
批量梯度下降计算整个数据集梯度,一方面,权重只会进行一次更新,因此在处理大型数据集时速度很慢且难以控制,甚至导致内存溢出;另一方面,在训练大型数据集时存在冗余的权重更新
权重更新的快慢是由学习率η决定的,并且可以在凸面误差曲面中收敛到全局最优值,在非凸曲面中可能趋于局部最优值。
网络更新参数的公式为:θ=θ−η×∇(θ).J(θ) ,其中η是学习率,∇(θ).J(θ)是损失函数J(θ)的梯度。
随机梯度下降(SGD)对每个训练样本进行参数更新,每次执行都进行一次更新,且执行速度更快。
θ=θ−η⋅∇(θ) × J(θ;x(i);y(i)),其中x(i)和y(i)为训练样本。
频繁的更新使得参数间具有高方差,损失函数会以不同的强度波动。这实际上是一件好事,因为它有助于我们发现新的和可能更优的局部最优值。
为了避免BGD和SGD中存在的问题,一个改进方法(i.e. trade-off)为小批量梯度下降(MBGD),小批量梯度下降法不是使用完整数据集,在每次迭代中仅使用m个训练样本去计算代价函数的梯度。一般小批量梯度下降法所选取的样本数量在50到256个之间,视具体应用而定。【NLP中可能会更大】
小批量梯度下降法即保证了训练的速度,又能保证最后收敛的准确率,目前的SGD默认是小批量梯度下降算法!!!
总结:批量梯度下降算法(BGD)、随机梯度下降算法(SGD)、小批量梯度下降算法(MBGD)
批量梯度下降(BGD) | 随机梯度下降(SGD) | 小批量梯度下降(MBGD) | |
---|---|---|---|
优点 | 凸函数可保证收敛至全局最优解,非凸函数可以得到局部最优解 | 计算速度快 | 计算速度快,收敛稳定 |
缺点 | 计算速度缓慢,不允许新样本中途进入 | 计算结果不易收敛,可能会陷入局部最优解中 | 批量大小需要手动选择 |
(此处BGD的优点,网上有的说非凸函数可以得到全局最优解,有的则说智能得到局部最优解,踩了很多坑,感谢师兄和师傅的指导!!!)
使用梯度下降及其变体时面临的挑战
很难选择出合适的学习率。太小的学习率会导致网络收敛过于缓慢,而学习率太大可能会影响收敛,并导致损失函数在最小值上波动,甚至出现梯度发散。
此外,相同的学习率并不适用于所有的参数更新。如果训练集数据很稀疏,且特征频率非常不同,则不应该将其全部更新到相同的程度,但是对于很少出现的特征,应使用更大的更新率。
在神经网络中,最小化非凸误差函数的另一个关键挑战是避免陷于多个其他局部最小值中。实际上,问题并非源于局部极小值,而是来自鞍点,即一个维度向上倾斜且另一维度向下倾斜的点。这些鞍点通常被相同误差值的平面所包围,这使得SGD算法很难脱离出来,因为梯度在所有维度上接近于零。
3.2. 动量优化方法:
动量优化方法引入物理学中的动量思想,加速梯度下降,有Momentum和Nesterov两种算法。当我们将一个小球从山上滚下来,没有阻力时,它的动量会越来越大,但是如果遇到了阻力,速度就会变小,动量优化法就是借鉴此思想,使得梯度方向在不变的维度上,参数更新变快,梯度有所改变时,更新参数变慢,这样就能够加快收敛并且减少动荡。
momentum算法思想:参数更新时在一定程度上保留之前更新的方向,同时又利用当前batch的梯度微调最终的更新方向,简言之就是通过积累之前的动量来加速当前的梯度。假设 m t mt mt 表示 t t t时刻的动量, u u u表示动量因子,通常取值0.9或者近似值,在SGD的基础上增加动量,则参数更新公式如下:
在梯度方向改变时,momentum能够降低参数更新速度,从而减少震荡;在梯度方向相同时,momentum可以加速参数更新, 从而加速收敛。总而言之,momentum能够加速SGD收敛,抑制震荡。
momentum首先计算一个梯度(短的蓝色向量),然后在加速更新梯度的方向进行一个大的跳跃(长的蓝色向量),nesterov项首先在之前加速的梯度方向进行一个大的跳跃(棕色向量),计算梯度然后进行校正(绿色梯向量)
3.3. 自适应学习率优化算法:
在机器学习中,学习率是一个非常重要的超参数,但是学习率是非常难确定的,虽然可以通过多次训练来确定合适的学习率,但是一般也不太确定多少次训练能够得到最优的学习率,玄学事件,对人为的经验要求比较高,所以是否存在一些策略自适应地调节学习率的大小,从而提高训练速度。 目前的自适应学习率优化算法主要有:AdaGrad算法,RMSProp算法,Adam算法以及AdaDelta算法。
Adagrad即adaptive gradient,是一种自适应学习率的梯度法。它通过记录并调整每次迭代过程中的前进方向和距离,使得针对不同问题都有一套自适应学习率的方法。Adagrad最大的优势是不需要手动来调整学习率,但与此同时会降低学习率。
全称:root mean square prop【RMSProp】
AdaGrad算法在前期可能会有很大的梯度,自始至终都保留了下来,这会使得后期的学习率过小。RMSProp在这个基础之上,加入了平方梯度的衰减项,只能记录最近一段时间的梯度,在找到碗状区域时能够快速收敛。
Adam即Adaptive Moment Estimation,是能够自适应时刻的估计方法,能够针对每个参数,计算自适应学习率。这是一种综合性的优化方法,在机器学习实际训练中,往往能够取得不错的效果。
AdaDelta算法也是针对AdaGrad算法在迭代后期可能较难找到有用解的问题做了改进 。
实际上,以上四个优化算法,我还需要深入研究。。。。太难了,我有空在深入剖析吧
除了以上几类较为常见的优化算法以外,还有共轭梯度法、启发式优化算法等。在实际的机器学习问题中,往往需要具体问题具体分析,根据每类优化问题的特征,选择合适的优化算法。
今天就总结到这,感谢网上的一些资料,帮我解疑答惑。最后,感谢粉我的小可爱们,谢谢关注,我会继续加油的,让我们共同进步!
https://mp.weixin.qq.com/s/D_1j7rheNwwODevgJOhaTg
https://mp.weixin.qq.com/s/USZUutgtLTswMVSOH1Q22g
https://www.jianshu.com/p/424b7b70df7b
https://zhuanlan.zhihu.com/p/55150256
https://soyoger.blog.csdn.net/article/details/79549520
https://zhidao.baidu.com/question/1308125130254490299.html
https://mp.weixin.qq.com/s/_PeXxH7SBHRt5jzfg0-kFA