优化器(Optimizer)
本文主要参考:https://blog.youkuaiyun.com/weixin_41417982/article/details/81561210
Gradiend Descent(梯度下降)
梯度下降算法是将所有数据集都载入,计算他们所有的梯度,然后执行决策,(沿着梯度下降最快的方向进行更新)。
优缺点:可以快速进行下降收敛,但是要计算所有的梯度,计算量太大,数据集过大,GPU无法计算,除此之外,如果是凸函数,则可以收敛到最小值,其他情况下,可能会遇到局部最小值的情况 。
Stochastic Gradient Descent(SGD)(随机梯度下降)
随机梯度下降是随机选取部分数据的梯度进行计算。
因为数据量问题,SGD更新速度比较频繁,所以能更快收敛。
问题: SGD在更新过程中,如果在一个方向更新速度较快,另外一个方向更新速度较慢的话,则会产生摆动,收敛速度会变慢,除此之外也会遇到鞍点(局部最小值)的情况。
https://zhuanlan.zhihu.com/p/21486826 中解释的比较好。
除此之外,SGD的噪声会相对较大。
改进方法:
SGD+Momentum
首先是‘Z’字型,加个动量之后,如图所示(自己懒得搞了,盗用别的大佬的图。)
加了动量后,就会减少’Z’字型,动量参数一般设为(0.9),而且如果遇到鞍点(局部最小值),因为有动量的存在,所以梯度导数不会成为0,就会继续向下收敛。
Nesterov Accelerated Gradient(NAG)
(图还是抄的https://blog.youkuaiyun.com/tsyccnh/article/details/76673073)
下图是SGD+Momentum
下图是Nesterov
两张图看起来基本上一样,但实际上是不一样的,SGD+Monmentum是在下次开始的时候加个动量,两个结合后得到一个实际下降点,Nesterov则不一样,他是在上一次梯度下降方向上再向前走一点,然后在走下一步。即先走到C点,然后走到D点。
结论:
在原始形式中,Nesterov Accelerated Gradient(NAG)算法相对于Momentum的改进在于,以“向前看”看到的梯度而不是当前位置梯度去更新。经过变换之后的等效形式中,NAG算法相对于Momentum多了一个本次梯度相对上次梯度的变化量,这个变化量本质上是对目标函数二阶导的近似。由于利用了二阶导的信息,NAG算法才会比Momentum具有更快的收敛速度。
AdaGrad:
我们累计每一次梯度的平方,接着让学习率除以它的开方。这个的作用是为了改变不同参数的学习率。假如一个参数的梯度一直很大,那么通过这个约束,它改变的就越少。假如一个参数的梯度一直很小,那么通过这个约束它,它变化的也就越快。公式后面那个1e-7是为了防止分母为0。
但问题是,因为是一直在累积的,这个grad_squared一定会变得越来越大,最后的结果是,权重更新的步长也会不可避免的变得很小。为了克服这个问题,有了RMSpro。
RMSprop
从上图公式可以看出,RMSprop只改变了grad_squared,添加了一个衰减率(通常为0.9/0.99),有效地解决了AdaGrad梯度累积的问题。
但也由于衰减的问题,grad_squard是可能导致我们训练一直在变慢的。
PS:可以将RMSprop和Nesterov结合起来。
Adam
最常用的。
可以看出来,红色的部分是类似与Momentum的方法,而蓝色的部分则是利用了RMSprop的衰减。因此这个算法是很好的结合了这两个的优点。
之所以有绿色方框的Bias Correction是因为想要避免一个情况:一开始的梯度太小,因此学习率除以second_moment的值太大,步长太大容易跑到一个奇怪的地方。导致收敛之后的效果不好。因此我们有了Bias correction,学习率也是除以second_unbias。
Adam一般来说是收敛最快的优化器,所以被用的更为频繁。当然,它还有变体AdamMax,但知道了Adam再去看其它也不是很难了。
总结:
图片来自: https://blog.youkuaiyun.com/u010089444/article/details/76725843
图片作者:Alec Radford