优化器是用来做什么的
我们在训练深度学习模型时一般都会使用梯度下降法,然而梯度下降法是最原始,也是最基础的算法。它将所有的数据集都载入,计算它们所有的梯度,然后执行决策。(即沿着梯度相反的方向更新权重)。优点是在凸函数能收敛到最小值。但显而易见的是,这方法计算量太大。假如我们的数据集很大的话,普通的GPU是完全执行不来的。还有一点,它逃不出鞍点,也容易收敛到局部最小值(也就是极小值)。
那为了提高我们的收敛速度,减小计算量所以我们提出了优化器,在梯度下降算法的基础上,做出不同的改变,从而提高我们训练模型的效率。找出一组参数使损失函数的值达到最小。
常见的优化器
- SGD
- SGD with momentum
- Adagrad
- RMSProp
- Adam
介绍一些我们会用到的符号
SGD
对比基本的梯度下降算法每次都读取所有数据来更新参数,SGD算法每读入一个数据,便立刻计算cost fuction的梯度来更新参数。
优点:
- 算法收敛速度快(在Batch Gradient Descent算法中, 每轮会计算很多相似样本的梯度, 这部分是冗余的)
- 可以在线更新
- 有几率跳出一个比较差的局部最优而收敛到一个更好的局部最优甚至是全局最优
缺点:
- 容易收敛到局部最优,并且容易被困在鞍点
SGD with Momentum(SGDM)
SGD方法的一个缺点是其更新方向完全依赖于当前batch计算出的梯度,因而十分不稳定。Momentum算法借用了物理中的动量概念,它模拟的是物体运动时的惯性,即更新的时候在一定程度上保留之前更新的方向,同时利用当前batch的梯度微调最终的更新方向。这样一来,可以在一定程度上增加稳定性,从而学习地更快,并且还有一定摆脱局部最优的能力。
Adagrad
Adagrad算法能够在训练中自动的对learning rate进行调整,对于出现频率较低参数采用较大的α更新;相反,对于出现频率较高的参数采用较小的α更新。因此,Adagrad非常适合处理稀疏数据。
RMSProp
RMSprop是Geoff Hinton提出的一种自适应学习率方法。Adagrad会累加之前所有的梯度平方,而RMSprop仅仅是计算对应的平均值,因此可缓解Adagrad算法学习率下降较快的问题。
Adam
虽然之前的优化器都各有优缺点但是,还是有一个重要的问题无法得到解决,就是训练过程中可能会在一个极小值处停下来,而得不到全局最小值。因此为了解决这个问题,提出了Adam,将SGDM和RMSProp结合了起来。
应用
应用方面目前用到最多的Optimizer是SGDM和Adam,最主要的是他们抢到了两个最极端的位置,其他的优化器只是在两个极端位置之间做出调整。下面我们来比较下这两个优化器,并谈一谈他们各自突出的地方。
下图是做猫狗分类时得到的数据(图1:训练集;图2:测试集):
还有几张论文上发表的模型在训练和测试时得到的数据图:
总结:
由于SGDM和Adam比较突出,所以有人提出可不可以将两种优化器结合起来,于是就诞生了一种新的优化器:SWATS.SWATS一开始使用Adam优化器来保证训练的速度,在快结束时使用SGDM优化器来保证训练的稳定性,然而带来的问题就是在什么时候去切换优化器,用什么方法去切换,提出者目前采用的方式非常的暴力,而且目前的效果其实并不好,所以在实际的应用上基本没有什么人在使用。
那除了将两种优化器结合起来来提高我们的效率外,我们还可以通过改进Adam或SGDM来提高我们的效率,接下来我们分开来谈谈如何改进Adam和SGDM。
改进Adam
首先我们来聊聊Adam会出现什么问题,比如我们一开始的梯度很小,所以我们每次移动的距离都是LR,这就会导致当我们的梯度突然增大很多时,由于之前累积的小梯度太多了,大梯度无法让我们准确的改变方向,这就会产生误差。
未完待续。。。