当前位置: 代码迷 >> 综合 >> 《机器学习从入门到入职》-不同梯度下降算法的比较-‘sgd‘, ‘rmsprop‘, ‘adagrad‘, ‘adadelta‘, ‘adam‘, ‘nadam‘
  详细解决方案

《机器学习从入门到入职》-不同梯度下降算法的比较-‘sgd‘, ‘rmsprop‘, ‘adagrad‘, ‘adadelta‘, ‘adam‘, ‘nadam‘

热度:93   发布时间:2023-12-24 16:10:12.0

代码链接:

CSDN:

https://download.csdn.net/download/qq_38649386/12671543

GitHub:

待更新

 

实验原理:

框架回顾:

优化算法经历了 SGD -> SGDM -> NAG ->AdaGrad -> AdaDelta -> Adam -> Nadam 

SGD:

SGD最大的缺点是下降速度慢,而且可能会在沟壑的两边持续震荡,停留在一个局部最优点。

SGD with Momentum(SGDM):

为了抑制SGD的震荡,SGDM认为梯度下降过程可以加入惯性。下坡的时候,如果发现是陡坡,那就利用惯性跑的快一些。SGDM全称是SGD with momentum,在SGD基础上引入了一阶动量:

SGD with Nesterov Acceleration:

SGD 还有一个问题是困在局部最优的沟壑里面震荡。想象一下你走到一个盆地,四周都是略高的小山,你觉得没有下坡的方向,那就只能待在这里了。可是如果你爬上高地,就会发现外面的世界还很广阔。因此,我们不能停留在当前位置去观察未来的方向,而要向前一步、多看一步、看远一些。

NAG:

全称Nesterov Accelerated Gradient,是在SGD、SGD-M的基础上的进一步改进,改进点在于步骤1。我们知道在时刻t的主要下降方向是由累积动量决定的,自己的梯度方向说了也不算,那与其看当前梯度方向,不如先看看如果跟着累积动量走了一步,那个时候再怎么走。因此,NAG在步骤1,不计算当前位置的梯度方向,而是计算如果按照累积动量走了一步,那个时候的下降方向:

然后用下一个点的梯度方向,与历史累积动量相结合,计算步骤2中当前时刻的累积动量。

AdaGrad:

此前我们都没有用到二阶动量。二阶动量的出现,才意味着“自适应学习率”优化算法时代的到来。SGD及其变种以同样的学习率更新每个参数,但深度神经网络往往包含大量的参数,这些参数并不是总会用得到(想想大规模的embedding)。对于经常更新的参数,我们已经积累了大量关于它的知识,不希望被单个样本影响太大,希望学习速率慢一些;对于偶尔更新的参数,我们了解的信息太少,希望能从每个偶然出现的样本身上多学一些,即学习速率大一些。

怎么样去度量历史更新频率呢?那就是二阶动量——该维度上,迄今为止所有梯度值的平方和:

AdaDelta / RMSProp:

由于AdaGrad单调递减的学习率变化过于激进,我们考虑一个改变二阶动量计算方法的策略:不累积全部历史梯度,而只关注过去一段时间窗口的下降梯度。这也就是AdaDelta名称中Delta的来历。

修改的思路很简单。前面我们讲到,指数移动平均值大约就是过去一段时间的平均值,因此我们用这一方法来计算二阶累积动量:

这就避免了二阶动量持续累积、导致训练过程提前结束的问题了。

Adam:

谈到这里,Adam和Nadam的出现就很自然而然了——它们是前述方法的集大成者。我们看到,SGD-M在SGD基础上增加了一阶动量,AdaGrad和AdaDelta在SGD基础上增加了二阶动量。把一阶动量和二阶动量都用起来,就是Adam了——Adaptive + Momentum。

Nadam:

最后是Nadam。我们说Adam是集大成者,但它居然遗漏了Nesterov,这还能忍?必须给它加上,按照NAG的步骤1:

说到这里,大概可以理解为什么j经常有人说 Adam / Nadam 目前最主流、最好用的优化算法了。新手上路,先拿来一试,收敛速度嗖嗖滴,效果也是杠杠滴。

 

 

实验结果:

实验结论:

数据稀疏---》(自适应方法): Adam,RMSprop, Adadelta, (Adagrad)

Adam总体效果最好,但最终效果由非自适应的SGD超过。

先用Adam,再用SGA调优

主流的观点认为:Adam等自适应学习率算法对于稀疏数据具有优势,且收敛速度很快;但精调参数的SGD(+Momentum)往往能够取得更好的最终结果。

Adam罪状一:可能不收敛:探讨了Adam算法的收敛性,通过反例证明了Adam在某些情况下可能会不收敛。

Adam罪状二:可能错过全局最优解:

深度神经网络往往包含大量的参数,在这样一个维度极高的空间内,非凸的目标函数往往起起伏伏,拥有无数个高地和洼地。有的是高峰,通过引入动量可能很容易越过;但有些是高原,可能探索很多次都出不来,于是停止了训练。

 

问题解决:

 

1.”y_train = np_utils.to_categorical(y_train, NB_CLASSES)“

函数作用:分类标签处理:转化为二值化序列,比如:[0,0,0,0,1,0,0,0],

这个序列就和mnist数据集0-9的识别标签种类相对应,所以参数:NB_CLASSES设置为10

2.时间比较的实验没做好

-》未解决

 

 

 

  相关解决方案