梯度下降算法及优化方法

序言

      对于y=f(wx+b),如何使用神经网络来进行求解,也就是给定x和y的值,如何让系统自动生成正确的权重值w和b呢?

      一般情况下,有两种尝试方法:

      1) 随机试:纯概率问题,几乎不可能实现。

      2) 梯度下降法:先初始化w和b(可以随机设置,也可以人为默认),然后使用下降算法来对w和b进行更新。都有哪些方法?到底哪种方法更好?

目录

一、基础知识

二、SGD

三、Momentum

四、Adagrad

五、Adadelta

六、RMSProp

七、Adam

正文

一、基础知识

斜率:在一维空间上,斜率就是函数的导数;

梯度:在多维空间里,函数的导数叫梯度,梯度是偏导数组成的向量;

梯度指向函数增加最快的方向,相应地,负梯度就指向函数下降最快的方向;推导方法可以参考该链接:https://blog.csdn.net/itplus/article/details/9337515

二、SGD

一般情况下,SGD指Mini-batch GD,(GD可分为三种:Batch GD,Stochastic GD,mini-batch GD)

SGD就是每次迭代计算mini-batch的梯度,然后对参数进行更新:

1)gt=θt1f(θt1)
2)Δθt=ηgt
其中,η是学习率,gt是梯度
SGD完全依赖于当前batch的梯度,η可理解为允许当前batch的梯度多大程度影响参数更新。
劣势:
       1、学习率LR选择比较困难
       2、对所有参数都使用相同的LR:在数据不均衡的情况下,如稀疏特征希望更新快些,常出现特征出现慢些时,SGD不太满足要求。
       3、容易收敛到局部最优,有可能被困于鞍点
 

 三、Momentum

积累之前的动量来替代梯度

1)mt=μmt1+gt
2)Δθt=ηmt

其中,μ是动量因子

梯度下降前期:使用上一次参数来更新,下降方向一致,乘上较大的μ能够进行很好的加速

梯度下降后期,在局部最小值来回震荡的时候,gradient→0,μ使得更新幅度增大,跳出陷阱

梯度方向改变时,μ能够减少更新

结论:momentum项能够加速SGD,抑制振荡,从而加快收敛

四、Adagrad

对学习率进行了约束:

nt=nt−1+gt2

Δθt=−η/(√nt+ϵ)∗gt

此处,对gt从11到tt进行一个递推形成一个约束项regularizer:−1/√(∑r=1t(gr)2+ϵ) ,ϵ用来保证分母非0
特点:

前期gt较小的时候, regularizer较大,能够放大梯度
后期gt较大的时候,regularizer较小,能够约束梯度
适合处理稀疏梯度
缺点:

由公式可以看出,仍依赖于人工设置一个全局学习率
η设置过大的话,会使regularizer过于敏感,对梯度的调节太大
中后期,分母上梯度平方的累加将会越来越大,使gradient→0,使得训练提前结束

五、Adadelta

   对Adagrad的扩展,也是对学习率进行自适应约束,但对计算进行了简化。

Adagrad会累加之前所有的梯度平方,而Adadelta只累加固定大小的项,并且也不直接存储这些项,仅仅是近似计算对应的平均值。即: 

1) nt=νnt1+(1ν)gt^2
2) Δθt=η/(√(nt+ϵ))gt

Adadelta依是依赖于全局学习率,但是经过近似牛顿迭代法:

3) E|g^2|t=ρE|g^2|t1+(1ρ)gt^2
4) Δxt=r=1,t-1(Δxr)/√(E|g^2|t+ϵ)     其中E代表期望,Adadelta已经不用依赖于全局学习率
特点:

训练初中期,加速效果不错,很快

训练后期,反复在局部最小值附近抖动

六、RMSprop

RMSprop算Adadelta一个特例

当ρ=0.5时,E|g^2|t=ρ∗E|g^2|t−1+(1−ρ)∗gt^2就变为了求梯度平方和的平均数。
如果再求根的话,就变成了RMS(均方根):
RMS|g|t=√(E|g^2|t+ϵ)

此时,这个RMS就可以作为学习率ηη的一个约束:
Δxt=−η/(RMS|g|t)∗gt
特点:

其实RMSprop依然依赖于全局学习率
RMSprop算是Adagrad的一种发展,和Adadelta的变体,效果趋于二者之间
适合处理非平稳目标
对于RNN效果很好

七、Adam
Adam(Adaptive Moment Estimation)本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。公式如下:
mt=μ∗mt−1+(1−μ)∗gt

nt=ν∗nt−1+(1−ν)∗gt^2

mt^=mt/(1−μt)

nt^=nt/(1−νt)

Δθt=−mt^/√(nt^+ϵ)∗η

其中,mtmt,ntnt分别是对梯度的一阶矩估计和二阶矩估计,可以看作对期望E|gt|,E|gt^2|的估计,mt^,nt^是对mt,nt的校正,这样可以近似为对期望的无偏估计。
可以看出,直接对梯度的矩估计对内存没有额外的要求,而且可以根据梯度进行动态调整,而−mt^/(nt^+ϵ)对学习率形成一个动态约束,而且有明确的范围。
特点:

结合了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优点
对内存需求较小
为不同的参数计算不同的自适应学习率
也适用于大多非凸优化
适用于大数据集和高维空间

原文地址:https://www.cnblogs.com/jimchen1218/p/11848643.html