各种优化算法详解

1、BGD(Batch Gradient Descent)(批量梯度下降)

参考链接:https://zhuanlan.zhihu.com/p/25765735

拿所有样本来计算梯度,接着更新参数。对于凸函数可以达到全局最小,非凸函数可以达到局部最小。

需要的先验参数有迭代次数(停止更新的条件)、学习率。

优点:每次更新都朝着全局最优的方向前进。

缺点:每次都需要拿全部样本来计算梯度,速度很慢。

 

2、SGD(Stochastic Gradient Descent)(随机梯度下降)

参考链接同BGD。

每次只拿全部样本中的某一个来计算梯度,接着更新参数,直到达到停止更新的条件。

需要的先验参数有迭代次数(停止更新的条件)、学习率。

优点:每次只需要取全部样本中的某一个样本来计算梯度,速度很快。

缺点:①每次更新参数,不一定是朝着全局最优的方向更新,造成了参数的来回震荡,收敛比较慢。从期望上来看,SGD和BGD朝着相同的方向去更新参数。

      ②收敛速度慢,会来回震荡。虽然SGD可能因为来回震荡,能够达到更好的局部最优。

 

3、MBGD(Mini-Batch Gradient Descent)(小批量梯度下降)

参考链接同BGD。

为了在SGD和BGD中间取得平衡,既不希望每次都要取全部样本来算梯度导致时间过长,也不希望每次只取一个样本来算梯度导致参数更新来回震荡、收敛较慢,于是每次去一定量的样本来就算梯度。

需要的先验参数有迭代次数(停止更新的条件)、学习率、每轮的样本个数

优点:比SGD收敛速度加快,比BGD计算时间少

缺点:①会在局部最优值点附近左右徘徊

      ②学习率是固定的。参数更新的时候,每个参数的梯度是不一样的,有的参数的梯度总是比较小,有的参数的梯度总是比较大。我们有时候希望梯度总是很小的参数,应该步长大一点,梯度总是很大的参数,步长要小一些,这样收敛会快一些。

 

到目前为止,我们已经有了三种方法了,但是仍然面临收敛速度慢和学习率固定的问题,因此有了以下更多的方法。

 

4、Momentum(动量法)

参考链接:https://blog.csdn.net/tsyccnh/article/details/76270707

梯度下降,梯度不仅仅是当前点的梯度,还考虑了历史上的梯度,两者加权求和作为当前点的新梯度。更新参数使用新的梯度计算方法。

需要的先验参数有迭代次数(停止更新的条件)、学习率、衰减率(历史梯度),如果使用小批量的方法还有每轮的样本个数。

优点:①考虑了历史梯度之后,如果历史梯度和当前梯度是同方向的,那么加速到达局部最优。

   ②历史梯度和当前梯度方向不一样,如果历史梯度的值还是大于当前梯度的值,那么有时候可以越过局部最优点(但不保证必定能达到更好的局部最优)。

   ③历史梯度和当前梯度方向不一样,如果历史梯度的值小于当前梯度的值,那么可以加快收敛、减小震荡。

缺点:收敛速度还不是最快。

 

5、NAG(Nesterov Accelerated Gradient)

参考链接:https://blog.csdn.net/tsyccnh/article/details/76673073

假设我们在点A,有点A的历史梯度,那为什么不先按历史梯度到达前面的点B,知道点B的梯度,再把点B的梯度和点A的历史梯度加权在一起得到点A的梯度。

也就是说,我们得到点A的梯度,不是用点A的历史梯度和点A的当前梯度加权求和,而是用点A的历史梯度和点A前面的点B的当前梯度加权求和。

这样子,相当于我们提前知道了未来的信息。

需要的先验参数有迭代次数(停止更新的条件)、学习率、衰减率(历史梯度),如果使用小批量的方法还有每轮的样本个数。

优点:比起Momentum的方法,收敛速度快了很多。

缺点:学习率仍然是固定的。

 

6、Adagrad(Adaptive gradient algorithm)

参考链接:https://zh.d2l.ai/chapter_optimization/adagrad.html

当两个梯度值有比较大的差异时,需要选择比较小的学习率来乘以比较大的梯度值,使得参数的更新不会过于猛烈。但这样子话,梯度小的参数更新得就会很慢。

所以我们需要为不同的参数分配不同的学习率。

需要的先验参数有迭代次数(停止更新的条件)、学习率、一个很小的常数用来确保分母不为0,如果使用小批量的方法还有每轮的样本个数。

优点:可以保证不同的参数(梯度不同)拥有不一样的学习率。

缺点:学习率一直在显著降低,如果没有找到比较好的解,那么在后期会由于学习率过小而难以到达局部最优。

 

7、RMSProp

参考链接:https://zh.d2l.ai/chapter_optimization/rmsprop.html

为了解决Adagrad的学习率一直在降低的问题,RMSProp方法的分母不再是一直在增加的梯度,而是换成了历史梯度和当前梯度的加权平均。

这样可以解决Adagrad的学习率过小的尴尬情况。

需要的先验参数有迭代次数(停止更新的条件)、学习率、一个很小的常数用来确保分母不为0,衰减率(历史梯度的平方),如果使用小批量的方法还有每轮的样本个数。

优点:可以解决Adagrad学习率过小的情况,同时保证不同的参数(不同梯度)拥有不一样的学习率。

缺点:目前没发现。

 

8、Adadelta

参考链接:https://zh.d2l.ai/chapter_optimization/adadelta.html

同样为了解决Adagrad的学习率一直在降低的问题,但不需要学习率这个先验参数。

需要的先验参数有迭代次数(停止更新的条件)、一个很小的常数用来确保分母不为0,衰减率(历史梯度的平方),如果使用小批量的方法还有每轮的样本个数。

优点:可以解决Adagrad学习率过小的情况,同时保证不同的参数(不同梯度)拥有不一样的学习率,且不需要一个先验的学习率参数。

缺点:目前没发现。

 

9、Adam

参考链接:https://zh.d2l.ai/chapter_optimization/adam.html

把RMSProp的方法和Momentum的方法融合在一起,既能确保不同梯度的参数拥有不一样的学习率,又能添加上一个动量来加速收敛。

同时做了偏差修正,避免刚开始的时候的梯度过小的情况。

需要的先验参数有迭代次数(停止更新的条件)、学习率、一个很小的常数用来确保分母不为0,衰减率β1(历史梯度,又称动量),衰减率β2(历史梯度的平方),如果使用小批量的方法还有每轮的样本个数。

优点:①不同梯度的参数拥有不一样的学习率

   ②添加上一个动量加速收敛。

   ③做了偏差修正。

缺点:目前没发现。

原文地址:https://www.cnblogs.com/chenjx85/p/10726323.html