梯度下降算法及优化方法
序言
对于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的梯度,然后对参数进行更新:
三、Momentum
积累之前的动量来替代梯度
其中,μ是动量因子
梯度下降前期:使用上一次参数来更新,下降方向一致,乘上较大的μ能够进行很好的加速
梯度下降后期,在局部最小值来回震荡的时候,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只累加固定大小的项,并且也不直接存储这些项,仅仅是近似计算对应的平均值。即:
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善于处理非平稳目标的优点
对内存需求较小
为不同的参数计算不同的自适应学习率
也适用于大多非凸优化
适用于大数据集和高维空间