【深度学习】深度学习优化算法总结

在开玩笑的时候,我们自称研究深度学习的人为炼丹师。所谓炼丹,就是拿到同一种丹药的配方,可能炼出来的丹药的效果也是不一样的。深度学习也是如此,同一种模型,采取不同的优化策略,所得到的结果往往不同。在探究深度学习算法的优化策略过程中,人们大概经历过以下几个阶段:
SGD-> Momentum -> Nesterov -> Adagrad -> RMSProp -> Adam ->Nadam

由于最近在准备实习面试中,特开一篇博客对上述几种优化算法进行回顾,也方便自己总结。

一、随机梯度下降(SGD)

SGD算法是一种非常经典的优化算法,其衍生于批梯度下降(BGD)算法。由于 BGD算法需要对整个训练集进行计算梯度,然后再进行更新梯度,其带来的开销是非常大的。因此 用一个mini-batch去更新梯度可以有效减少计算开销,加速收敛,还不容易陷入鞍点。
这里写图片描述

值得注意的是在真实采用SGD进行训练的时候,有必要随着时间进行逐渐降低学习率,这是因为SGD中在梯度估计引入的噪声源(由于只用了m个样本)并不会在极小点消失。

二、动量(Momentum)
从SGD上受到的启发,由于SGD只用了m个样本,容易在梯度估计的时候引入噪声,因此带来一个结果便是梯度更新的时候会在高曲率的方向震荡,这在一定程度上降低了收敛速度。因此momentum算法采用移动平均减缓梯度在高区率方向上的更新,从而加速整体的收敛。


这里写图片描述

其中红色的梯度更新线是采用momentum算法后的优化路径。
这里写图片描述

这里稍微简单介绍一下动量的概念:当梯度更新进行震荡时,我们方向其方向是不停的变化的,动量便会像摩擦力一样试图保持原来的方向,从而降低震荡方向梯度的更新。
当梯度的更新都指向同一方向时,动量便会使得梯度更新的速度越来越快。

三、Nesterov动量
Nesterov动量 认为,竟然梯度方向是当年mini-batch样本更新的方向说了不算,那为什么不按照原来动量的方向去更新看看,然后在计算更新后的梯度,从而进行校正呢?

这里写图片描述
值得注意的是:在凸批量梯度的情况下,Nesterov 动量将额外误差收敛率从O(1/k)改进到O(1/k^2),然而在随机梯度的情况下,Nesterov并没有改进收敛率。

四、AdaGrad
我们发现SGD需要我们设置对学习率进行衰减,从而降低随机样本带来的梯度噪声。而AdaGrad算法的提出独立适应所有模型参数的学习率,缩放每个参数反比于其所有历史平方值总和的平方根。这样带来的好处是,更新快的给他慢下来,更新慢的给他快上去。原因很简单,更新快的往往是震荡部分,更新慢的往往是趋优部分。也就从AdaGrad开始,优化算法开始趋向选择自适应学习速率。
这里写图片描述
Adagrad的缺点也很明显:对于训练深度神经网络模型而言:从训练开始时积累梯度平方会导致有效学习率过早和过量的减少。

五、RMSProp
由于AdaGrad根据平方梯度的整个历史收缩学习率,可能 RMSprop观测到Adagrad优化算法中的缺点,并也对此进行了改进。选择移动平均来对梯度的平方进行累积,可能使得学习率在达到这样的凸结构就变得太小了。RMSProp使用指数衰减平均以丢弃遥远过去的历史,使其能够在凸碗状结构后快速收敛。
这里写图片描述

六、Adam
Adam在RMSProp的基础又增加了梯度的动量,融合了一阶,二阶的动量得到的优化算法。
这里写图片描述

七、Nadam
这个算法就不多介绍了,就是前面算法的集大成者。在Adam的基础上了增加了Nesterov。

================================================================================

关于指数平均:

V <= beta * V + (1-beta) * theta
V可以近似看作为 1/(1-beta) 个数据的平均值, 如beta=0.1,则近似为10个数据的平均值

关于Adam里的偏差修正:
这是由于在初始的更新时,并没有 1/(1-beta) 的数据,举个例子来看:


这里写图片描述

原先应该是绿色的曲线,变成了紫色曲线。由图中可以看到,紫色曲线的起点较低,但随之数据增大,其实影响也不大。为了更好的修正,往往对指数平均进行如下偏差修正:

这里写图片描述

参考自:
http://mooc.study.163.com/learn/2001281003?tid=2001391036#/learn/content?type=detail&id=2001702122
https://zhuanlan.zhihu.com/p/32230623

其他的一些经验:

1。实际上我们看到自从RMSProp和Adam引入二阶动量后,对整个梯度更新速度加快了。然而很可能导致不收敛的状态。原因其实也很简单,因为AdaGrad 是累积二阶矩,随着训练的加深,二阶矩的累加会导致学习速率很降低。而Adam和RMSProp则容易出现不收敛的状态。
2。 由于Adam的收敛速度确实很快,所以一般初学者还是推荐使用Adam。对于一些进阶者,依旧推荐SGD的调参方式。要相信:精调的参数一定比自适应的要好。

猜你喜欢

转载自blog.csdn.net/shwan_ma/article/details/79950072