常见的优化方法总结(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步这里不在讨论了,详细推导过程参考上面红色链接的文章。
- 常见的优化方法总结(GD,SGD,SAG,SVRG,BFGS)
- 线性收敛的随机优化算法之 SAG、SVRG(随机梯度下降)
- tensorflow实现最基本的神经网络 + 对比GD、SGD、batch-GD的训练方法
- 实习点滴(8)--收敛优化方法:牛顿法、BFGS算法与L-BFGS算法
- 【TensorFlow】优化方法optimizer总结(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)解析(十三)
- 各种优化方法总结比较(sgd/momentum/Nesterov/adagrad/adadelta)
- 各种优化方法总结比较(sgd/momentum/Nesterov/adagrad/adadelta)
- 各种优化方法总结比较(sgd/momentum/Nesterov/adagrad/adadelta)
- 各种优化方法总结比较(sgd/momentum/Nesterov/adagrad/adadelta)
- 各种优化方法总结比较(sgd/momentum/Nesterov/adagrad/adadelta)
- 深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)
- 各种优化方法总结比较(sgd/momentum/Nesterov/adagrad/adadelta)
- 各种优化方法总结比较(sgd/momentum/Nesterov/adagrad/adadelta)
- 深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)
- 各种优化方法总结笔记(sgd/momentum/Nesterov/adagrad/adadelta)
- 各种优化方法总结比较(sgd/momentum/Nesterov/adagrad/adadelta)
- 各种优化方法总结比较(sgd/momentum/Nesterov/adagrad/adadelta)
- 深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)
- 习惯概论
- 【QT】窗口绘制之几何图形和动画
- Swift vs. Kotlin 漫谈之扩展篇
- 基于动态代理的远程服务
- python一行代码
- 常见的优化方法总结(GD,SGD,SAG,SVRG,BFGS)
- 进程间通信
- leetcode 14, 38, 345
- python的for i in list 陷阱
- Spring4第一讲学习笔记,ioc编程思想
- 【斜率优化DP】BZOJ1010 [HNOI2008]玩具装箱toy
- SELinux syntax error问题定位
- Android集训第三天
- leetCode 刷题记录 Remove Nth Node From End of List