这一章开始介绍各种优化器(优化算法)……这里的目录是根据TensorFlow中优化器的目录进行介绍的。
介绍一下TensorFlow官方文档的连接(找了好久……终于找着了,献给辣些跟我一样打不开官网的娃子们):
http://devdocs.io/tensorflow~python-optimizer_v2/
当然,如果你打的开官网的话,也可以去官网找(反正我加载了半天就是出不来,╮(╯▽╰)╭):
感觉官网有一个好处,就是你所有的资料来源都是100%正确的,博客转载可能会因为个人的记忆问题什么的出现错误,但是官方文档不会。好了,下面就是我开始介绍算法的目录了。可能顺序会改变,大体种类就是这么几种了。
预计介绍的就是这么几个常用的优化器了,那么下面开始。唔,我看的网页很多啊……我可能写的参考网页不太全,因为看完不注意就关掉了,希望大佬们见谅……私信我我会加上去的,( • ̀ω•́ )✧
1、梯度下降算法(批量梯度下降,随机梯度下降,小批量梯度下降等)
简单而言,就是人在山坡上一点,然后环顾四周,找到梯度最大(最陡)的点,然后往下走。走完再环顾四周,找到梯度最大点,然后往下走……循环,最后就能走到最低点了。
当然根据这个算法的特性可以知道,有时候我们走到的可能是一个局部最优解,除非损失函数贼友好,贼平滑的凸函数。
(偷盗来的图)
1.1梯度下降的基本算法描述
其中为学习速率,为参数的梯度。
在神经网络中就是对于权重值w的更新,或许下面关于线性回归的梯度下降图比较适合理解。
如图,最佳的w是在损失函数L(w)最小时所取得的w值,对于w值的更新就是L关于w的求导乘以学习速率所得到的。
在该斜率等于0时达到损失函数最小状态,即最优解。此时不考虑损失函数局部最小解的状况。
以上过程就是神经网络中梯度下降算法的优化过程。只是其中L关于w求导的过程,需要根据链式法则进行误差传播的计算。
1.2批量梯度下降法(batch gradient descent,BGD)
传统的梯度下降法需要对于数据集上的所有样本进行损失函数计算,然后进行误差的反向传播,因此,梯度下降算法收敛速度较慢,计算量过大。
批量梯度下降默认损失函数为
如此,关于样本为1的时候,该更新过程为:其中,α为上述η为学习速率,或者说是梯度下降算法中的步长。
推广该式子至m个训练样本时,更新过程为:
该遍历过程需要遍历整个样本,得到的也是全局最优解。但同样的如果m过大,该更新过程的速度就可想而知了。
1.3随机梯度下降(Stochastic Gradient Descent,SGD)
参考网页:https://www.cnblogs.com/shixiangwan/p/7532858.html
https://www.zhihu.com/question/28728418
https://www.cnblogs.com/zhenggege/p/7210755.html
https://www.cnblogs.com/pinard/p/5970503.html
1.4小批量梯度下降(Mini-batch Gradient Descent,MBGD)
左图为伪代码,右图为更新迭代的公式。
盗图来的效果图,(#^.^#),感谢大佬们的万能matlab。参考网址:https://blog.csdn.net/tsyccnh/article/details/76136771
可以看出,MBGD的收敛速度比较快,波动小,很快能到达最优值点。
一般我们使用的梯度下降,直的都是小批量梯度下降法。
1.5 自适应梯度下降
该算法即可与上述算法相结合,区别只是在于,关于学习速率α的调整。我们从图可以看出,越接近最优值,我们的步长需要减小,以免错过最优解,或发生震荡。所以,学习速率需要根据迭代的次数进行减小,来满足这种情况。
当然,也可以固定学习速率是一个很小的值,但是响应的迭代次数也会增加,这样训练的耗时会大大增加。
由自适应的学习速率,我们将引出各种算法。当然最简单的自适应学习速率的更迭为
1.6 Adagrad 算法
即:
对于公式的伪代码为:
在训练的中后期,分母上梯度平方的累加将越来越大,从而梯度接近于0,使得训练收敛越来越慢。
其矩阵形式为: 其中,
G t G t优点:
前期gt较小,梯度下降法步长较大,加快收敛速率;后期gt较大,梯度下降法的步长减小,减小收敛速率。适合处理稀疏的梯度。
缺点:
这个学习速率仍与人工设置的η有关,如果η设置过大,仍会导致梯度下降法的步长较大。在后期时候,分母过大,会导致梯度趋向于0,提前结束训练。