常见的优化方法总结(GD,SGD,SAG,SVRG,BFGS)

来源:互联网 发布:披甲龙龟事件知乎 编辑:程序博客网 时间:2024/06/15 22:28

机器学习中常用的优化方法.................MARK.....................持续更新


写在最前面:这篇文章是所有常见优化方法的一个总结,因此你看起来可能会很乱,我已经把一些比较好的文章都在每部分提出(红色链接),读者可以先参考一下这些文章再来看本文。参考文章写的都很清晰。



梯度下降法:

1.随机梯度下降法(每次只选取一个样本来代替当前的梯度值)

2.批量梯度下降法(每次选取m个样本来代替当前梯度值)

3.梯度下降法(选取所有样本值来计算梯度值)

总结:利用梯度下降法进行优化时,梯度值的计算是和样本有关的,因此,原始的梯度下降法需要计算所有样本的值才能够得出梯度,计算量大,所以后面才有会一系列的改进。

参考文章:http://blog.sina.com.cn/s/blog_6bb07f8301017bot.html


牛顿法:

牛顿法其实原理很简单,利用的是:求函数f的极大极小问题,可以转化为求解函数f的导数f'=0的问题,这样求可以把优化问题看成方程求解问题(f'=0)。

所以考虑f(x)的泰勒展开:

取后面两项,然后令它们为0。

化简之后可以得到

其实,这里的△x就是x1-x0,移项可以得到:


这里就可以得出前后项的迭代关系了。这里只是只是只有一个维度的时候牛顿法的迭代公式(也就是说只有一个特征)

下面给出n维时候的迭代公式。(感觉复杂的可以先看看多元泰勒公式的展开)


上面这个是多元泰勒展开,写成矩阵的形式就是下图


其中,海森矩阵如下:


最后,有了这个补充的知识,我们就能够看的懂下面这个公式:


下面这个文章有非常非常详细的推导:

参考文章:http://blog.csdn.net/itplus/article/details/21896453

简单小结这两种最简单的优化方法:

1.牛顿法利用了2阶导数的信息,收敛速度自然比只利用了1阶导数信息的梯度下降法要快。但这也意味着,牛顿法对f(x)的要求更高。

参考文章:http://blog.csdn.net/owen7500/article/details/51601627



------------------进阶线----------------------------

在SGD中,由于收敛的速度太慢,所以后面就有人提出SAG和SVRG两种基于梯度下降的算法。

SAG中的S是随机,A是平均(average),G是梯度的意思。可以看到SAG是一种加速版本的SGD

SAG原论文。

具体我们从算法上可以看的出,下面我简单的概括一下。

SAG其实每次计算时,利用了两个梯度的值,一个是前一次迭代的梯度值,另一个是新的梯度值。当然这两个梯度值都只是随机选取一个样本来计算。

直观上看,利用的信息量大了,收敛速度就应该比单纯用一个样本估计梯度值的SGD要快。但是SAG带来的问题就是需要内存来维护(保存)每一个旧梯度值。

用空间换时间也是一种不错的思路。


说完SAG,下面就是SVRG。

S是随机,V和R要分别是varience(方差),reduction(缩减),G也是梯度。SVRG具体的原理看看下面的参考文献。

我这里简单概括一下。

在SGD或者SAG中,我们都只用了一个样本值去估梯度。在SVRG里,我们是用一个“批”,也就是n个样本去估计梯度,当然,我们并不是每次计算都要用新的n个样本去估计梯度,而是采取下面这种思路:在一段时间内(例如m次迭代)使用这n个样本来估计梯度,然后过完这段时间(经过m次迭代后)重新选择n个样本来估计梯度。当然这里还有一个类似SAG中的 “前一次迭代的梯度”这个信息。



参考文章:https://zhuanlan.zhihu.com/p/22402784



--------------------------------再进阶--------------------------------------

上面中,我们提到的SAG和SVRG其实都是在SGD的基础上改进而来,而下面,我们要讨论的一个是在牛顿法的基础上改进而来。

BFGS。BFGS这个名字是由其4个作者名字首字母得来。



接下来,我也是概括一下BFGS算法的思想,具体详细的推导可以参考下面这个文章(写的非常详细)

参考文章:http://blog.csdn.net/itplus/article/details/21897443

首先考虑一个这样的问题,为什么要改进牛顿法?因为牛顿法需要计算海森矩阵的逆,逆的运算是很复杂的。当数据规模很大的时候,求逆是不可能的事情。

那么,改进牛顿法就是改进海森矩阵,BFGS中的思想就是不直接求海森矩阵,而是求其近似的一个矩阵。其他的地方其实和原来的牛顿法没什么区别。整个算法,思想就在这里,具体的推导可能有点难度。

下面我们逐步做个简单的分析:



第一步,矩阵B就是对海森矩阵的一个近似,记作矩阵B,B0是第一次迭代时候的矩阵,初始化成单位矩阵。

第二步,所谓的搜索方向,其实就是上面提到的牛顿法的迭代公式中等号右边的第二项(只不过这里用B来近似)。如下图红圈所示


第三步,步长,我们还是看上面这个公式,再看看梯度下降法的公式,我们会发现好像少了一个“学习率”的参数。所以,再牛顿法中,可以认为步长为1,也就是定步长,但是这样会带了一些问题。问题在下图描述:


因此,这里的步长应该通过计算得到。公式如下:


对第三步总结一下:其实,如果只看后一个式子,,然后再把sk带进去,也就是:

其实这个公式,和我们牛顿法比就是多了个,和把矩阵H改成了矩阵B而已。

所以下面5、6步就是求近似矩阵B而已。算法就这么简单,只是数学推导的过程有点复杂!(但是作为主要是调包侠的我们,补充这点理论只是就已经足够了,滑稽脸)

所以,第5、6步这里不在讨论了,详细推导过程参考上面红色链接的文章。

阅读全文
1 0
原创粉丝点击