【傻瓜攻略】深入学习入门之优化算法(八)

这一章开始介绍各种优化器(优化算法)……这里的目录是根据TensorFlow中优化器的目录进行介绍的。

介绍一下TensorFlow官方文档的连接(找了好久……终于找着了,献给辣些跟我一样打不开官网的娃子们):

http://devdocs.io/tensorflow~python-optimizer_v2/

当然,如果你打的开官网的话,也可以去官网找(反正我加载了半天就是出不来,╮(╯▽╰)╭):

https://www.tensorflow.org/

感觉官网有一个好处,就是你所有的资料来源都是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)

【傻瓜攻略】深入学习入门之优化算法(八)【傻瓜攻略】深入学习入门之优化算法(八)

每次i只使用第j个样本,相比较批量梯度下降法,速度快了点。当样本数很大的时候,计算▽f的所有样本和,计算量会非常大。随机梯度下降就是从多有样本的▽f中选取一个代替所有样本的下降方向,这种方法加快了计算速度,但是同样也带来了一定的问题。
这时该损失函数为:【傻瓜攻略】深入学习入门之优化算法(八)
在θ靠近极小值点的时候▽f≠0,这导致随机梯度下降法精度低。由于损失函数是方差,同样在靠近极小值点的时候需要减小α,来避免在极小值点震荡,而减小收敛速度。
或许这张图会比较容易明白我得个人理解:
【傻瓜攻略】深入学习入门之优化算法(八)

参考网页: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)

小批量梯度下降法是批量梯度下降法和随机梯度下降法的折中。每一次训练迭代的时候就在样本中随机取m个样本组成一个batch,然后进行数值更新。其中m为大于1小于样本总数的常量。

【傻瓜攻略】深入学习入门之优化算法(八)【傻瓜攻略】深入学习入门之优化算法(八)

左图为伪代码,右图为更新迭代的公式。

【傻瓜攻略】深入学习入门之优化算法(八)

盗图来的效果图,(#^.^#),感谢大佬们的万能matlab。参考网址:https://blog.csdn.net/tsyccnh/article/details/76136771

可以看出,MBGD的收敛速度比较快,波动小,很快能到达最优值点。

一般我们使用的梯度下降,直的都是小批量梯度下降法。

1.5 自适应梯度下降

该算法即可与上述算法相结合,区别只是在于,关于学习速率α的调整。我们从图可以看出,越接近最优值,我们的步长需要减小,以免错过最优解,或发生震荡。所以,学习速率需要根据迭代的次数进行减小,来满足这种情况。

当然,也可以固定学习速率是一个很小的值,但是响应的迭代次数也会增加,这样训练的耗时会大大增加。

由自适应的学习速率,我们将引出各种算法。当然最简单的自适应学习速率的更迭为【傻瓜攻略】深入学习入门之优化算法(八)

1.6 Adagrad 算法

【傻瓜攻略】深入学习入门之优化算法(八)

即:【傻瓜攻略】深入学习入门之优化算法(八)

对于公式的伪代码为:

【傻瓜攻略】深入学习入门之优化算法(八)

在训练的中后期,分母上梯度平方的累加将越来越大,从而梯度接近于0,使得训练收敛越来越慢。

其矩阵形式为:【傻瓜攻略】深入学习入门之优化算法(八) 其中,

【傻瓜攻略】深入学习入门之优化算法(八)

GtGt

优点:

前期gt较小,梯度下降法步长较大,加快收敛速率;后期gt较大,梯度下降法的步长减小,减小收敛速率。适合处理稀疏的梯度。

缺点:

这个学习速率仍与人工设置的η有关,如果η设置过大,仍会导致梯度下降法的步长较大。在后期时候,分母过大,会导致梯度趋向于0,提前结束训练。

发现有些多了,强迫症要求我再开一篇博客继续介绍,所以,剩下的算法我们下个博客再见……嘻嘻(#^.^#)