写在前面
本篇博客是根据我之前在实验室汇报的时候做的一个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)$
初始学习率:$α$
然后进行迭代优化。在每个epoch :
- 计算目标函数关于当前参数的梯度:$\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
优化算法的基本思想就是将Momentum
和RMSprop
结合起来形成的一种适用于不同深度学习结构的优化算法。
Adam实现了集成动量(V的那一部分)+自适应学习率(S表示的的是学习率),是目前比较好的优化算法。