【机器学习】梯度下降算法及梯度优化算法

本文深入探讨了梯度下降算法及其三种变体:批量、随机和小批量梯度下降,分析了各自的优缺点。还讨论了梯度下降面临的问题,如全局收敛和学习率挑战,并介绍了优化算法,如动量、NAG、Adagrad、Adadelta、RMSprop和Adam,以及它们如何解决梯度下降的局限性。
摘要由CSDN通过智能技术生成

用于评估机器学习模型的就是损失函数,我们训练的目的基本上都是最小化损失,这个最小化的方式就要用优化算法了,机器学习中最常用的就是梯度下降算法。

导数、方向导数和梯度

要了解梯度下降算法是什么首要知道梯度是什么,导数和方向导数又是了解梯度的前提。

导数

 导数反映的是函数y=f(x)在某一点处沿x轴正方向的变化率,如果f’(x)>0,说明f(x)的函数值在x点沿x轴正方向是趋于增加的;如果f’(x)<0,说明f(x)的函数值在x点沿x轴正方向是趋于减少的。

方向导数

方向导数是某一点在某一趋近方向上的导数值,即导数或偏导数是函数在x轴正方向的变化率,而方向导数是函数在其他特定方向上的变化率。

梯度

梯度的提出只为回答一个问题: 函数在变量空间的某一点处,沿着哪一个方向有最大的变化率?
函数在某一点的梯度是这样一个向量,它的方向与取得最大方向导数的方向一致,而它的模为方向导数的最大值。
也就是说梯度即函数在某一点最大的方向导数,函数沿梯度方向函数有最大的变化率。

知道了函数沿梯度方向有最大的变化率,那么在机器学习中我们为了最小化损失,在优化目标函数的时候就可以沿着负梯度方向去减小函数值,以此达到我们的优化目标,这就是梯度下降算法。

梯度下降算法

梯度下降算法(Gradient Descent)是通过沿着目标函数J(θ)参数θ∈ℜ的梯度相反方向−∇θJ(θ)来不断更新模型参数来到达目标函数的极小值点(收敛),更新步长为η(这个步长又称为学习率)。
更新参数的公式如下:
∇θJ(θ)为参数的梯度
这里写图片描述

根据计算目标函数J(θ)采用数据量的不同(每次学习(更新模型参数)使用的样本个数的不同),梯度下降算法又可以分为批量梯度下降算法(Batch Gradient Descent),随机梯度下降算法(Stochastic Gradient Descent)和小批量梯度下降算法(Mini-batch Gradient Descent)。

批量梯度下降算法(Batch Gradient Descent)

每次使用全量的训练集样本来更新模型参数。具体做法是:每次使用全部训练集样本计算损失函数loss_function的梯度params_grad,然后使用学习速率learning_rate朝着梯度相反方向去更新模型的每个参数params。

优点:

每次更新都会朝着正确的方向进行,最后能够保证收敛于极值点(凸函数收敛于全局极值点,非凸函数可能会收敛于局部极值点)

缺点:

每次学习时间过长,并且如果训练集很大以至于需要消耗大量的内存,并且全量梯度下降不能进行在线模型参数更新。

随机梯度下降算法(Stochastic Gradient Descent)

随机梯度下降算法每次从训练集中随机选择一个样本来进行学习

优点:

每次只随机选择一个样本来更新模型参数,因此每次的学习是非常快速的,并且可以进行在线更新(得到了一个样本,就可以执行一次参数更新)。

缺点:

每次更新可能并不会按照正确的方向进行,因此可以带来优化波动(扰动)。由于波动,因此会使得迭代次数(学习次数)增多,即收敛速度变慢。不过最终其会和全量梯度下降算法一样,具有相同的收敛性,即凸函数收敛于全局极值点,非凸损失函数收敛于局部极值点(随机梯度下降所带来的波动有个好处就是,对于类似盆地区域(即很多局部极小值点)那么这个波动的特点可能会使得优化的方向从当前的局部极小值点跳到另一个更好的局部极小值点,这样便可能对于非凸函数,最终收敛于一个较好的局部极值点,甚至全局极值点。 )。

小批量梯度下降算法(Mini-batch Gradient Descent)

小批量选择了折中的办法,每次选择m个样本进行学习

相对于随机梯度下降,Mini-batch梯度下降降低了收敛波动性,即降低了参数更新的方差,使得更新更加稳定。相对于全量梯度下降,其提高了每次学习的速度。并且其不用担心内存瓶颈从而可以利用矩阵运算进行高效计算。

梯度下降算法的问题

不能保证全局收敛

梯度下降算法针对凸优化问题原则上是可以收敛到全局最优的,因为此时只有唯一的局部最优点。而实际上深度学习模型是一个复杂的非线性结构,一般属于非凸问题,这意味着存在很多局部最优点(鞍点),采用梯度下降算法可能会陷入局部最优。

学习率问题

选择一个合适的学习率很难

如果学习速率过小,则会导致收敛速度很慢。如果学习速率过大,那么其会阻碍收敛,即在极值点附近会振荡。

学习速率调整无法自适应

学习速率调整(又称学习速率调度,Learning rate schedules)试图在每次更新过程中,改变学习速率,如退火。一般使用某种事先设定的策略或者在每次迭代中衰减一个较小的阈值。无论哪种调整方法,都需要事先进行固定设置,这边便无法自适应每次学习的数据集特点。

模型所有的参数每次更新都是使用相同的学习速率

模型所有的参数每次更新都是使用相同的学习速率。如果数据特征是稀疏的或者每个特征有着不同的取值统计特征与空间,那么便不能在每次更新中每个参数使用相同的学习速率,那些很少出现的特征应该使用一个相对较大的学习速率。

梯度下降优化算法

由于梯度下降算法存在上述问题,而理想的梯度下降算法要满足两点:收敛速度要快;能全局收敛。因此出现了很多解决上诉问题的一些梯度优化方法。

其实这些优化算法都是基于学习率上的改变。

冲量梯度下降算法 Momentum

冲量梯度算法参数更新时不仅考虑当前梯度值,动量在参数更新项中加上一次更新量(即动量项),在学习率上来讲就是不进加这一次的学习率还要加上以前的,所以会更快的到达global minimum。公式如下:

νt=γνt1+ηθJ(θ) ν t = γ ν t − 1 + η ∇ θ J ( θ )

θ=θνt θ = θ − ν t 其中动量项超参数γ<1一般是小于等于0.9。

momentum基于这样一个物理事实:将一个小球从山顶滚下,其初始速率很慢,但在加速度作用下速率很快增加(也就是累积了前面的动量(动量不断增加),因此速度变得越来越快),并最终由于阻力的存在达到一个稳定速率。
在更新模型参数时,对于那些当前的梯度方向与上一次梯度方向相同的参数,那么进行加强,即这些方向上更快了;对于那些当前的梯度方向与上一次梯度方向不同的参数,那么进行削减,即这些方向上减慢了。因此可以获得更快的收敛速度与减少振荡。

动量能够解决的问题:
如果在峡谷地区(某些方向较另一些方向上陡峭得多,常见于局部极值点),SGD会在这些地方附近振荡,从而导致收敛速度慢。这种情况下,可用动量解决。

NAG算法 (Nesterov Accelerated Gradient)

NAG算法是冲量梯度下降算法的改进版本,其速度更快。其变化之处在于计算“超前梯度”(下一次参数在的位置)更新冲量项,也就是加上动量项的基础上,在计算参数的梯度时,在损失函数中减去了动量项,即计算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值