各种神经网络优化算法:从梯度下降,随机梯度下架,批量随机梯度下架,Adagrad,AdaDelta,Adam

1 一阶优化算法

        这种算法使用各参数的梯度值来最小化或最大化损失函数E(x),从而找到最合适的矩阵权重θ。最常用的一阶优化算法是梯度下降。

 

2 二阶优化算法

二阶优化算法使用了二阶导数(也叫做Hessian方法)来最小化或最大化损失函数。由于二阶导数的计算成本很高,所以这种方法并没有广泛使用。

 

1 梯度下降的公式。

网络更新参数的公式为:θ=θ−η×∇(θ).J(θ) ,其中η是学习率,∇(θ).J(θ)是损失函数J(θ)的梯度。

这是在神经网络中最常用的优化算法。

 

梯度下降的问题:

               传统的批量梯度下降将计算整个数据集梯度,但只会进行一次更新,因此在处理大型数据集时速度很慢且难以控制,甚至导致内存溢出。

                权重更新的快慢是由学习率η决定的,并且可以在凸面误差曲面中收敛到全局最优值,在非凸曲面中可能趋于局部最优值。

 

2 随机梯度下降。

            随机梯度下降(Stochastic gradient descent,SGD)对每个训练样本进行参数更新,每次执行都进行一次更新,且执行速度更快。

    频繁的更新使得参数间具有高方差,损失函数会以不同的强度波动。这实际上是一件好事,因为它有助于我们发现新的和可能更优的局部最小值,而标准梯度下降将只会收敛到某个局部最优值

            

3 小批量梯度下降

为了避免SGD和标准梯度下降中存在的问题,一个改进方法为小批量梯度下降(Mini Batch Gradient Descent),因为对每个批次中的n个训练样本,这种方法只执行一次更新。

为了避免SGD和标准梯度下降中存在的问题,一个改进方法为小批量梯度下降(Mini Batch Gradient Descent),因为对每个批次中的n个训练样本,这种方法只执行一次更新。

使用小批量梯度下降的优点是:

1) 可以减少参数更新的波动,最终得到效果更好和更稳定的收敛。

2) 还可以使用最新的深层学习库中通用的矩阵优化方法,使计算小批量数据的梯度更加高效。

3) 通常来说,小批量样本的大小范围是从50到256,可以根据实际问题而有所不同。

4) 在训练神经网络时,通常都会选择小批量梯度下降算法。

这种方法有时候还是被成为SGD

 

进一步优化梯度下降

1. 动量

SGD方法中的高方差振荡使得网络很难稳定收敛,所以有研究者提出了一种称为动量(Momentum)的技术,通过优化相关方向的训练和弱化无关方向的振荡,来加速SGD训练。换句话说,这种新方法将上个步骤中更新向量的分量’γ’添加到当前更新向量。

 

V(t)=γV(t−1)+η∇(θ).J(θ)

最后通过θ=θ−V(t)来更新参数。

 

当其梯度指向实际移动方向时,动量项γ增大;当梯度与实际移动方向相反时,γ减小。这种方式意味着动量项只对相关样本进行参数更新,减少了不必要的参数更新,从而得到更快且稳定的收敛,也减少了振荡过程。

 

Nesterov梯度加速法

一位名叫Yurii Nesterov研究员,认为动量方法存在一个问题:

如果一个滚下山坡的球,盲目沿着斜坡下滑,这是非常不合适的。一个更聪明的球应该要注意到它将要去哪,因此在上坡再次向上倾斜时小球应该进行减速。

实际上,当小球达到曲线上的最低点时,动量相当高。由于高动量可能会导致其完全地错过最小值,因此小球不知道何时进行减速,故继续向上移动。

Yurii Nesterov在1983年发表了一篇关于解决动量问题的论文,因此,我们把这种方法叫做Nestrov梯度加速法。

在该方法中,他提出先根据之前的动量进行大步跳跃,然后计算梯度进行校正,从而实现参数更新。这种预更新方法能防止大幅振荡,不会错过最小值,并对参数更新更加敏感。

Nesterov梯度加速法(NAG)是一种赋予了动量项预知能力的方法,通过使用动量项γV(t−1)来更改参数θ。通过计算θ−γV(t−1),得到下一位置的参数近似值,这里的参数是一个粗略的概念。因此,我们不是通过计算当前参数θ的梯度值,而是通过相关参数的大致未来位置,来有效地预知未来:

V(t)=γV(t−1)+η∇(θ)J( θ−γV(t−1) ),然后使用θ=θ−V(t)来更新参数。注意,其中 θ−γV(t−1),不是当前参数θ的梯度值,而是相关参数的大致未来位置。

现在,我们通过使网络更新与误差函数的斜率相适应,并依次加速SGD,也可根据每个参数的重要性来调整和更新对应参数,以执行更大或更小的更新幅度。

 

Adagrad方法

Adagrad方法是通过参数来调整合适的学习率η,对稀疏参数进行大幅更新和对频繁参数进行小幅更新。因此,Adagrad方法非常适合处理稀疏数据。

 

在时间步长中,Adagrad方法基于每个参数计算的过往梯度,为不同参数θ设置不同的学习率。

先前,每个参数θ(i)使用相同的学习率,每次会对所有参数θ进行更新。在每个时间步t中,Adagrad方法为每个参数θ选取不同的学习率,更新对应参数,然后进行向量化。为了简单起见,我们把在t时刻参数θ(i)的损失函数梯度设为g(t,i)。

 

4. AdaDelta方法

这是一个AdaGrad的延伸方法,它倾向于解决其学习率衰减的问题。Adadelta不是累积所有之前的平方梯度,而是将累积之前梯度的窗口限制到某个固定大小w。

 

 

Adam算法

Adam算法即自适应时刻估计方法(Adaptive Moment Estimation),能计算每个参数的自适应学习率。这个方法不仅存储了AdaDelta先前平方梯度的指数衰减平均值,而且保持了先前梯度M(t)的指数衰减平均值,这一点与动量类似:

 

结合了 AdaDelta先前平方梯度的指数衰减平均值,在分母中,并且结合了动量。

 

各种神经网络优化算法:从梯度下降,随机梯度下架,批量随机梯度下架,Adagrad,AdaDelta,Adam

Adam在实际应用中效果良好,超过了其他的自适应技术。

如果输入数据集比较稀疏,SGD、NAG和动量项等方法可能效果不好。因此对于稀疏数据集,应该使用某种自适应学习率的方法,且另一好处为不需要人为调整学习率,使用默认参数就可能获得最优值。

如果想使训练深层网络模型快速收敛或所构建的神经网络较为复杂,则应该使用Adam或其他自适应学习速率的方法,因为这些方法的实际效果更优。

 

总结:下面是优化算法的总结和路径。

梯度下降->随机梯度下降-->批量随机梯度下架-->基于动量的方法-->Adagrad自适应学习率(通过不同维度的梯度方差,来确定数据的稀疏性,从而确定不同的学习率)-->设置时间窗口AdaDelta-》adam综合动量和方差的方法(目前最优)。

adam的公式

θi=θi-学习率*梯度/以往累计的方差*动量 i表示不同维度的i