标准梯度下降
GD
假设要学习训练的模型参数为 W ,代价函数为 J(W) ,则代价函数关于模型参数的偏导数即相关梯度为 ΔJ(W) ,学习率为 ηt ,则使用梯度下降法更新参数为:
Wt+1=Wt−ηtΔJ(Wt) BGD
其中可以使用批量样本来估计梯度,提升梯度估计的准确性
Wt+1=Wt−ηti=1∑nΔJi(Wt,X(i),Y(i)) 动量
Momentum
该方法使用动量缓冲梯度,减小随机梯度引起的噪声,并且解决Hessian矩阵病态问题(BGD在收敛过程中和正确梯度相比来回摆动比较大的问题)。
由于当前权值的改变会受到上一次权值改变的影响,类似于小球向下滚动的时候带上了惯性。这样可以加快小球向下滚动的速度。
{vt=αvt−1+ηtΔJ(Wt,X(is),Y(is))Wt+1=Wt−vt NAG
牛顿加速梯度(Nesterov accelerated gradient)是动量的变种。
Nesterov动量梯度的计算在模型参数施加当前速度之后,因此可以理解为往标准动量中添加了一个校正因子。在Momentun中小球会盲目地跟从下坡的梯度,容易发生错误。所以需要一个更聪明的小球,能提前知道它要去哪里,还要知道走到坡底的时候速度慢下来而不是又冲上另一个坡。
{vt=αvt−1+ηtΔJ(Wt−αvt−1)Wt+1=Wt−vt 自适应学习率
AdaGrad
独立地适应所有模型参数的学习率,缩放每个参数反比于其所有梯度历史平均值总和的平方根。具有代价函数最大梯度的参数相应地有个快速下降的学习率,而具有小梯度的参数在学习率上有相对较小的下降。
Wt+1=Wt−∑t′=1t(gt′,i)+ϵη0⊙gt,i Adagrad 的主要优势在于不需要人为的调节学习率,它可以自动调节;缺点在于,随着迭代次数增多,学习率会越来越小,最终会趋近于0。
RMSProp
RMSProp算法修改了AdaGrad的梯度积累为指数加权的移动平均,使得其在非凸设定下效果更好。
{E[g2]t=αE[g2]t−1+(1−α)gt2Wt+1=Wt−E[g2]t+ϵη0⊙gt RMSProp算法在经验上已经被证明是一种有效且实用的深度神经网络优化算法。目前它是深度学习从业者经常采用的优化方法之一。
AdaDelta
AdaDelta是对AdaGrad的扩展,最初方案依然是对学习率进行自适应约束,但是进行了计算上的简化。 AdaGrad会累加之前所有的梯度平方,而AdaDelta只累加固定大小的项,并且也不直接存储这些项,仅仅是近似计算对应的平均值。即:
nt=ν∗nt−1+(1−ν)∗gt2Δθt=−nt+ϵη∗gt 在此处AdaDelta其实还是依赖于全局学习率的,但是作者做了一定处理,经过近似牛顿迭代法之后:
Eg2t=ρ∗Eg2t−1+(1−ρ)∗gt2Δxt=−E∣g2∣t+ϵ∑r=1t−1Δxr 此时,可以看出AdaDelta已经不用依赖于全局学习率了。
Adam
Adam(Adaptive Moment Estimation)本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。公式如下:
⎩⎨⎧mt=β1mt−1+(1−β1)gtvt=β2vt−1+(1−β2)gt2m^t=1−β1tmt,v^t=1−β2tvtWt+1=Wt−v^t+ϵηm^t 其中, mt 和 vt 分别为一阶动量项和二阶动量项。 β1,β2 为动力值大小通常分别取0.9和0.999; m^t,v^t 分别为各自的修正值。
性能比较