前言
学习机器学习一直是用梯度下降法的,对于牛顿下降法并没有什么了解,但是小学期同学的一个项目用到了牛顿下降法,同时好多大神同学的夏令营之旅问到了牛顿下降法(我等弱鸡疯狂被刷。。。)所以就总结学习一下。
梯度下降法
梯度
梯度高等数学都学过,在向量微积分中,标量场的梯度是一个向量场。标量场中某一点上的梯度指向标量场增长最快的方向,梯度的长度是这个最大的变化率。也就是梯度表示数值变化最快的方向,在一元情况下,梯度当然就是斜率,或者导数。在多元的情况下梯度是这样的:
其实就是计算了φ在三个方向上的微分,表示了在三个方向上的变化量。
梯度下降与推导
梯度下降法其实就是下面这个式子:
下一次函数的值为上一次的值在变化最大的方向上移动μ*f'(xn)。我们知道变化最快可以变大也可以变小那么梯度下降为什么可以保证一定变小呢?
我们知道梯度方向增加最快,那么梯度方向的反方向是下降最快的,所以在梯度上加负号保证了一定是下降的。例如:f(x)=-3x 它的梯度就是导数-3,在负方向是增加的也就是x减小,函数值增大我们看到上面梯度下降的公式是针对自变量的,那么假设第一步我们处于x=1这个位置,那么下一步可能就在1-0.01*(-3)=1.03,x增大了,最后的函数值减小了,下降了。
牛顿下降法
牛顿下降法的递推公式:
关于两者的解释:
下图是两种方法的图示表示,红色为牛顿下降法,绿色为梯度下降法,从图中直观的感觉是,红色线短,下降速度快。因为牛顿下降法是用二次曲面去拟合当前的局部曲面,而梯度下降法是用平面去拟合当前的局部曲面,一般用二次曲面拟合的更好,所以一般牛顿算法收敛快。
为啥梯度下降是平面拟合而牛顿下降是二次曲线拟合呢?
解释来源于博客:
http://blog.csdn.net/njucp/article/details/50488869
一阶泰勒展式如下表示:
左式表示一个曲面,而右式相当于用平面在x附近表示曲面,所以一阶泰勒展式可以表示平面近似拟合曲面,主要的拟合部分是f'*Δx的部分。
我们的目的是使得左边的值变小,那是不是应该使得下面的式子变为负值。
但是如何使得上式一定为负值,简单的方法就是:
这样上式就变为:
但是不要忘了以上所有的一切只有在局部成立,也就是说在小范围才成立,那么下式就有很能太大 :
所以加个小的修正的因子,上式就变为:
得到最终的梯度下降公式。
平面拟合曲面是有于一阶泰勒展开。那么二次曲面拟合曲面的牛顿迭代很显然就是二阶泰勒展开的结果了。考虑一下二阶泰勒:
同样我们希望左式最小,那么将左式看成是△x的函数,当取合适的△x值时,左边的式子达到极小值,此时导数为0。因此上式对△x进行求导数,得到以下公式:
所以有:
所以牛顿迭代法表示为:
为什么牛顿法更快
第一种解释是,牛顿下降法利用了函数的更多的信息,能够更好的拟合局部曲面,所以收敛的速度也会加快。
第二种是:
关于梯度下降算法,其中最重要的就是要确定步长μ,它的值严重的影响了梯度下降算法的表现。
接下来考虑如下公式:
和
结合起来有:
令左边的式子为0,得到:
由此可见牛顿下降法是梯度下降法的最优情况,因此牛顿下降法的收敛的速度必然更快。
对于高维数据要计算Hessian 矩阵,关于Hessian 矩阵,很简单,自行百度吧。
为什么大多数机器学习算法是基于梯度下降的?
机器学习大多数都有着极高维度的特征以及极多的样本,所以计算Hessian 矩阵需要的时间很长,效率很低。
还有来自知乎大神的关于牛顿法的缺点和优点:
https://www.zhihu.com/question/19723347/answer/28414541)
- 牛顿法起始点不能离局部极小点太远,否则很可能不会收敛。(考虑到二阶拟合应该很容易想象),所以实际操作中会先使用别的方法,比如梯度下降法,使更新的点离最优点比较近,再开始用牛顿法。
- 牛顿法每次需要更新一个二阶矩阵,当维数增加的时候是非常耗内存的,所以实际使用是会用拟牛顿法。
- 梯度下降法在非常靠近最优点时会有震荡,就是说明明离的很近了,却很难到达,因为线性的逼近非常容易一个方向过去就过了最优点(因为只能是负梯度方向)。但牛顿法因为是二次收敛就很容易到达了。
牛顿法最明显快的特点是对于二阶函数(考虑多元函数的话要在凸函数的情况下),牛顿法能够一步到达,非常有效。
多变量的牛顿下降法
来源于博客:
http://blog.csdn.net/itplus/article/details/21896453,我觉得写的很好。
关于随机梯度下降和批量梯度下降
见我的下一篇文章吧2333!