梯度求解六式
梯度下降法是优化方法中最为基本和简便的一种优化手段。随着神经网络的发展,梯度下降法应随着需求不断发展。在资料...
梯度下降法是优化方法中最为基本和简便的一种优化手段。随着神经网络的发展,梯度下降法应随着需求不断发展。在资料参考的基础上,结合自己的理解,这里就目前最为主流的梯度下降法进行归纳总结,名为六式,仅供参考。
第一式:起手式
在最优化的问题中,我们通常会将一个问题抽象为一个凸函数(convex function),目标是求得凸函数为最小值情况下的解。此时,该凸函数对应的梯度为0,即f′(x)=0。在实际应用中,直接获得函数f在梯度为0时的闭式解不太容易。梯度下降法能够通过迭代逼近,最终求得近似解(见图 1)。
一般的梯度下降法为:令凸函数为J(θ),参数θ的更新方式为:θ=θ−ηJ′(θ)。
图 1 梯度方向和凸函数最小值的关系
这种在一轮迭代更新参数过程中使用全量数据的方式称作批量梯度下降(Batch gradient descent)。但批量梯度下降在处理数据量大,或者流式数据的情况下存在效率问题。因此起手式中包含几路变招,分别是:
随机梯度下降(Stochasticgradient descent)
随机梯度下降(SGD)在对参数θ进行一轮更新时仅从样本中随机采样一个训练样本,即:θ=θ−ηJ′(θ;x(i),y(i)),其中(x(i),y(i))指第i个训练样本。这种方法非常适合处理流式数据,但这种方式对J(θ)的估计非常片面,其收敛过程会呈现剧烈波动(见图 2)。
图 2 SGD的收敛曲线
小批量梯度下降(Mini-batch)是随机梯度下降和批量梯度下降的折中,更新时从样本中随机采样一组训练样本,即:θ=θ−ηJ′(θ;x(i:i+n),y(i:i+n)),其中(x(i:i+n),y(i:i+n))指随机采样的n个训练样本。
值得注意的是SGD和mini-batch都是目前神经网络训练中比较常用的优化方式。
第二式:开山式
上一章所讲述的梯度下降法中有一个核心问题:学习率η的设置。过大的学习率会使得算法无法收敛,过小则会导致收敛太慢而同样无法收敛。牛顿法可以很好的解决这一问题,牛顿法的更新方式为:θ=θ−J′(θ)/ J′′(θ)。
牛顿法的原理是运用泰勒展开,求解一阶导数J′(θ)为0的点。将J(θ+Δθ)=J(θ)+J′(θ)Δθ+1/2 J′′(θ)Δθ2,令Δθ趋近于0,即可解得。
牛顿法能够在每个迭代步中选取到最优的更新策略,大幅提升优化的效率(见图 3)。但采用牛顿法时所引入Hessian矩阵(函数的二阶导数矩阵),其复杂度与参数θ的维度n2相关,当参数维度过大时牛顿法不再适用。
图 3 牛顿法(红线)和梯度下降法(绿线)的优化比较
在实际应用中函数J(θ)往往不只有一个导数为0的点,因此优化常会有陷入局部最优(见图 4)。在优化过程中加入动量(momentum),能够使得梯度下降过程有机会跳出局部最优,尝试找到更优解。另外,动量还能在梯度震荡(梯度符号不断变换)时平滑优化过程,从而加速梯度下降。
图 4 优化陷入局部最优解的情况
动量法虽然有前述所提的几个优势,但考虑动量会使得梯度更新“惯性”前进,因而需要更多的迭代步才能收敛。
值得注意的是动量法能够很好的弥补SGD的缺陷,用来加速SGD的收敛。
在实际应用中γ一般取0.9左右。
变招:Nesterov加速梯度(Nesterov accelerate gradient)
动量法的一种加速方式。NAG的核心思想是对当前的参数的位置进行移动(θ-γvt−1),近似估计参数θ在下一迭代步的位置,从而加速算法的优化速度。
NAG的更新方式为:vt=γvt−1+ηJ′(θ-γvt−1),θ=θ-vt。
第四式:破刀式
在梯度下降中,学习率η需要根据迭代的进行而调整,这进一步增加了优化的难度。AdaGrad可以自适应的找到参数的学习率η,避免这一问题。
AdaGrad的更新方式为:
gt,i= J′(θi)—当前的梯
—历史梯度的平方和
—当前迭代步的学习率
θ=θ−ηt,iJ′(θ)—参数更新
采用AdaGrad时会对参数的每一维度的学习率都进行自适应调整。这种依据历史梯度进行调整的方式可以避免处理稀疏数据时梯度容易向某一方向过度优化的问题。AdaGrad中梯度优化已不再严格按照原梯度方向,但在神经网络的实际应用中证明其确实有效。
一般η的初始学习率设置为[0.1,0.01,0.01,0.001]。
变招:RMSprop
AdaGrad在学习率的调整中会考虑完整的历史梯度信息,而RMSprop对其做衰减处理。
RMSprop的更新方式为(已有的符号定义不再重复):
E[g2]t=γE[g2]t-1+(1-γ)gt2—历史梯度平方和(指数衰减,E[g2]t视作符号标记)的信息
θ=θ−ηt,iJ′(θ)—参数更新
一般,η的初始学习率设置为[0.1,0.01,0.01,0.001],γ设置为0.9或0.95。
第五式:破剑式
AdaDelta目标是通过近似Hessian矩阵,使得学习率的调整能够在每个迭代步逼近最优。
AdaDelta的更新方式为(已有的符号定义不再重复):
E[Δθ2]t=γE[Δθ]t-1+(1-γ) Δθt2—历史梯度更新的平方和(指数衰减,E[Δθ2]t视作符号标记,初始为0)信息
—当前的参数更新量
θ=θ+Δθ—参数更新
AdaDelta的收敛速度会比AdaGrad和RMSprop快,但需要说明的是AdaGrad、RMSprop和AdaDelta之间本身并不存在绝对的优劣之分,应根据具体的应用问题由效果确定。
一般γ设置为0.9或0.95。
第六式:破气式
所谓破解上层内劲高手,只能神而明之,存乎一心(就是这章的优化方式我也没明白的意思)。Adam部分采用了AdaDelta中的历史梯度信息,同时对这些信息进行了修正。
Adam的更新方式为:
mt=β1mt-1+(1-β1)gt—历史梯度和(指数衰减)的信息
vt=β1vt-1+(1-β1)gt2—历史梯度平方和(指数衰减)的信息
m’t=mt/(1-β1t)—Bias-corrected
v’t=vt/(1-β1t)—Bias-corrected
—参数更新
Adam的收敛速度据说是目前最快的,(再据说)采用Adam可以在神经网络的训练中快速达到收敛,但当训练数据较为稀疏时不建议使用,很容易使得模型出现过拟合问题。
一般Adam的参数设置为:β1=0.9, β2=0.999, α=0.001。
结语:六式梯度从易而难,应针对具体情况而选择不同的优化算法。最为普通的梯度下降法,牛顿法和动量法可以在尝试求解阶段采用(具有严格保证的优化方法,能够验证问题的抽象是否正确)。其后,再采用改进的梯度算法使得求解可以适用于更大或者存在稀疏性问题的数据。另外,梯度求解的参数需要反复调整,一次调整的幅度以增加或缩小目标参数的一个量级为宜,例如0.01->0.001或0.01->0.1。
关注 KingsGarden
微信扫一扫关注公众号