神经网络和深度学习—优化算法

写在前面

本篇博客是根据我之前在实验室汇报的时候做的一个PPT的内容来写的,有部分内容应该是借鉴了其它一些博客还有一些讲义,由于年代久远,就不贴上参考链接了,如有侵犯内容的,实属抱歉。

引入

在介绍神经网路里面的一些优化方法的时候,需要讲一下指数加权平均的思想,因为这与我们后面要将的动量是由很大的关系。

首先我们看一下平均数求法:

比如我们现在有100天的温度值,要求这100天的平均温度值。

24,25,24,26,34,28,33,33,34,35……….32。

我们直接可以用公式:

而我们要介绍的指数加权平均本质上就是一种近似求平均的方法。

上面的图,是一个天与温度的变化关系,其中横轴表示的是一年中的第几天,纵轴表示的是该天的温度,1月份和12月份的温度相对于年中(6月、7月)的温度要低一些。

下面我们通过温度的局部平均值(移动平均值)来描述温度的变化趋势,通过下面的公式来计算平均值

$\theta$ 表示的是当天的温度,$v$ 表示的是局部平均值。

在计算局部温度平均值的时候我们使用的是β等于0.9,计算出来的温度趋势,如右图的红色曲线。

在上面为什么说当β为0.9时,只是平均了10天的温度。

当权重为$1/e$ 时,该项可以忽略不计,$(0.9)^{10}$ 约等于$1/e$

指数加权平均的优势

我们可以看到指数加权平均的求解过程实际上是一个递推的过程,那么这样就会有一个非常大的好处,每当我要求从0到某一时刻(n)的平均值的时候,我并不需要像普通求解平均值的作为,保留所有的时刻值,类和然后除以n。

而是只需要保留0-(n-1)时刻的平均值和n时刻的温度值即可。也就是每次只需要保留常数值,然后进行运算即可,这对于深度学习中的海量数据来说,是一个很好的减少内存和空间的做法。

基本知识

梯度下降优化法经历了SGD→SGDM→NAG→AdaGrad→AdaDelta→Adam→Nadam这样的发展历程。之所以会不断地提出更加优化的方法,究其原因,是引入了动量(Momentum)这个概念。最初,人们引入一阶动量来给梯度下降法加入惯性(即,越陡的坡可以允许跑得更快些)。后来,在引入二阶动量之后,才真正意味着“自适应学习率”优化算法时代的到来。

优化算法框架

首先定义:

待优化参数:$w$

目标函数:$f(w)$

初始学习率:$α$

然后进行迭代优化。在每个epocht :

  • 计算目标函数关于当前参数的梯度:$\mathrm{g}_{t}=\nabla \mathrm{f}\left(W_{\mathrm{t}}\right)$
  • 根据历史梯度计算一阶动量和二阶动量:$m_{t}=\phi\left(\mathrm{g}_{1}, \mathrm{g}_{2}, \cdots, \mathrm{g}_{t}\right) ; V_{t}=\mathrm{g}_{1}, \quad \mathrm{g}_{2}, \cdots, \mathrm{g}_{t} )$
  • 计算当前时刻的下降梯度:$\eta_{t}=\mathbb{\alpha} \cdot m_{t} \sqrt{V_{t}}$根据下降梯度进行更新:$w_{t+1}=w_{t+1}-\eta_{t}$

最速梯度下降法

回归函数及目标函数

以均方误差作为目标函数(损失函数),目的是使其值最小化,用于优化上式。

  • 对目标函数求导
  • 沿导数相反方向移动theta

随机梯度下降法

SGD是最速梯度下降法的变种。

使用最速梯度下降法,将进行N次迭代,直到目标函数收敛,或者到达某个既定的收敛界限。每次迭代都将对m个样本进行计算,计算量大。

SGD每次迭代仅对一个样本计算梯度,直到收敛。

Mini-batch Gradient Descent

(1)这是介于BSD和SGD之间的一种优化算法。每次选取一定量的训练样本进行迭代。

(2)从公式上似乎可以得出以下分析:速度比BSD快,比SGD慢;精度比BSD低,比SGD高。

mini_batch的步骤

Step 1: Shuffle (X, Y)

训练前把训练数据打乱,同时还要保持打乱前训练数据和训练标签的对应关系。

Step 2: Partition (shuffled_X, shuffled_Y).Minus the end case.

Mini-batch sizes,简称为“batchsizes”,是算法设计中需要调节的参数。比如对应于不同GPU或CPU硬件(32,64,128,256)等的内存要求。batchsize是学习过程中的“滑块”。

  • 较小的值让学习过程收敛更快,但是产生更多噪声。
  • 较大的值让学习过程收敛较慢,但是准确的估计误差梯度。
  • 默认值一般是32

动量(Momentum)梯度下降法

SGD方法的一个缺点是,其更新方向完全依赖于当前的batch,因而其更新十分不稳定。解决这一问题的一个简单的做法便是引入momentum。momentum即动量,它模拟的是物体运动时的惯性,即更新的时候在一定程度上保留之前更新的方向,同时利用当前batch的梯度微调最终的更新方向。这样一来,可以在一定程度上增加稳定性,从而学习地更快,并且还有一定摆脱局部最优的能力:

其实上面的公式就是我们介绍的指数平均加权。

红色箭头显示了一个带动量的小批量梯度下降的方向。蓝色的点显示了每个步骤的梯度(关于当前的小批)的方向,很明显的就是每一次更新的时候动量的存在矫正了“偏”的参数更新方向

动量梯度下降法与标准的梯度下降法的关系:

1、当β=0时,就变成了标准的梯度下降法

2、在我们进行动量梯度下降算法的时候,由于使用了指数加权平均的方法,原来在纵轴方向上的上下波动,经过平均以后,接近于0,纵轴上的波动变得非常的小(因为其是取前1/(1−β) 次的梯度);但在横轴方向上,所有的微分都指向横轴方向,因此其平均值仍然很大。最终实现红色线所示的梯度下降曲线。

3、一般情况下β的取值越大越好,因为越大可以取到更多次的过去的值,可以让下降更加光滑,但是β的取值不能够太,一般取到0.9

4、动量梯度下降法既可以与 batchgradient descent, mini-batch gradient descent or stochastic gradient descent联合使用

总结:动量梯度下降法是在梯度上面进行优化

Adagrad

这里借用一下李宏毅李宏毅老师的讲课的课件:

最开始时,我们距离最低点很远,所以我们用较大的步长。

经过几轮后,我们接近了最低点,所以我们减少learningrate。



(1) 经常出现(累积梯度大)的参数的学习率会被拉低,较少出现(累积梯度小)的参数的学习率会被拉高;

(2) 随着训练次数增加,累积梯度肯定会上升,导致分母变大,则学习率会自动下降。因此,Adagrad可以自动调节学习率,而我们只需给其一个初始学习率即可;

(3) 同样是随着训练参数增加,学习率会下降的很快,这可能导致后期学习率过低而学不到东西。

总结:Adagrad是在学习率上进行优化

RMSProp

Adagrad会累加之前所有的梯度平方,而RMSprop仅仅是计算对应的平均值,因此可缓解Adagrad算法学习率下降较快的问题。

Adam

Adam优化算法的基本思想就是将MomentumRMSprop结合起来形成的一种适用于不同深度学习结构的优化算法。

Adam实现了集成动量(V的那一部分)+自适应学习率(S表示的的是学习率),是目前比较好的优化算法。