参考博客:优化算法整理
梯度下降法:
当目标函数是凸函数时,梯度下降法的解是全局解。
随机梯度下降法:
随机梯度下降是
通过每个样本来迭代更新一次,
如果样本量很大的情况(例如几十万),那么可能只用其中几万条或者几千条的样本,就已经将theta迭代到最优解了,对比上面的批量梯度BGD下降,迭代一次需要用到十几万训练样本,一次迭代不可能最优,如果迭代10次的话就需要遍历训练样本10次。
但是,SGD伴随的一个问题是噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。
对批量梯度(BGD)下降法和随机梯度下降法的总结:
批量梯度下降---
最小化所有训练样本的损失函数
,使得最终求解的是全局的最优解,即求解的参数是使得风险函数最小,但是对于
大规模样本
问题
效率低下
。
随机梯度下降---
最小化每条
样本的损失函数,
虽然不是每次迭代得到的损失函数都向着全局最优方向, 但是大的整体的方向是向全局最优解的
,
最终的结果往往是在全局最优解附近,适用于大规模训练样本情况
。
随机梯度下降方法以损失很小的一部分精确度和增加一定数量的迭代次数为代价,换取了总体的优化效率的提升。
增加的迭代次数远远小于样本的数量(即我虽然增加迭代次数,但是可能这个次数还是不及data的数量,还是高效的...)。
牛顿法:
算法大致的思路流程:
算法每次迭代的是极小点xk、xk+1... pk是每次迭代的修正值,pk由Hession矩阵和g(xk)梯度值共同决定。所以Hession有点类似学习率的作用。
g(xk),f(x)的导数在xk处的取值..
牛顿法是一种在实数域和复数域上
近似求解方程的方法。方法
使用函数
f
(
x
)的泰勒级数的前面几项来寻找方程
f
(
x
) = 0的根。牛顿法最大的特点就在于它的收
敛速度很快。
首先,
选择一个接近函数
f
(
x
)零点的
x
0
,计算相应的
f
(
x
0
) 和切线斜率
f '
(
x
0
)(这里
f ' 表示函数
f 的导数)。然后我们
计算穿过点(
x
0,
f
(
x
0
)) 并且斜率为
f
'(
x
0
)的直线和
x
轴的交点的
x
坐标,也就是求如下方程的解:
我们将
新求得的点的
x
坐标命名为
x
1,
通常
x
1
会比
x
0
更接近方程
f
(
x
) = 0的解。因此我们现在
可以利用
x
1
开始下一轮迭代。迭代公式可化简为如下所示:
已经证明,如果
f ' 是连续的,并且待求的零点
x是孤立的,那么在零点
x周围存在一个区域,只要初始值
x
0位于这个邻近区域内,那么牛顿法必定收敛。 并且,如果
f ' (
x)不为0, 那么牛顿法将具有平方收敛的性能. 粗略的说,这意味着每迭代一次,牛顿法结果的有效数字将增加一倍。下图为一个牛顿法执行过程的例子。
由于牛顿法是基于当前位置的切线来确定下一次的位置,所以牛顿法又被很形象地称为是"切线法"。牛顿法的搜索路径(二维情况)如下图所示:
牛顿法搜索动态示例图:
关于牛顿法和梯度下降法的效率对比:
从本质上去看,
牛顿法是二阶收敛,梯度下降是一阶收敛,所以牛顿法就更快
。如果更通俗地说的话,比如你想找一条最短的路径走到一个盆地的最底部,
梯度下降法每次只从你当前所处位置选一个坡度最大的方向走一步
,
牛顿法在选择方向时,不仅会考虑坡度是否够大,还会考虑你走了一步之后,坡度是否会变得更大
。所以,可以说牛顿法比梯度下降法看得更远一点,能更快地走到最底部。(牛顿法目光更加长远,所以少走弯路;相对而言,梯度下降法只考虑了局部的最优,没有全局思想。)
根据wiki上的解释,从几何上说,牛顿法就是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面,通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路径会更符合真实的最优下降路径。
牛顿法的优缺点总结:
优点:二阶收敛,收敛速度快;
缺点:牛顿法是一种迭代算法,每一步都需要
求解目标函数的Hessian矩阵(一个二阶导阵)的逆矩阵,计算比较复杂。
拟牛顿法:
拟牛顿法的本质思想是改善牛顿法每次需要求解复杂的Hessian矩阵的逆矩阵的缺陷,
使用正定矩阵来近似Hessian矩阵的逆
,从而简化运算的复杂度。
拟牛顿法和梯度下降法一样,只要求每一步迭代时知道目标函数的梯度g(xk)。通过测量梯度的变化,构造一个目标函数的模型使之足以
产生超线性收敛性
。这类方法大大优于梯度下降法。另外,因为拟牛顿法不需要二阶导数(Hession是个二阶偏导矩阵..)的信息,所以有时比牛顿法更为有效。
拟牛顿法的基本思想如下:
首先构造目标函数在当前迭代x
k的二次模型:
这里,B
k
是一个正定矩阵,其他与牛顿法类似。
介绍下牛顿法的DFP算法:
不同于牛顿法的有两个地方:1)用一个
正定矩阵(Gk)代替二阶导的Hession阵;2)
牛顿法里面,更新xk+1=xk+pk,pk直接有Hk和gx得到,
拟牛顿法是先Gk和gk得到一个pk,再在一维内搜索出一个使f(xk+1)min的入k,
xk+1=xk+pk*入k...
类似牛顿法的更新Hk+1,拟牛顿法每次也需要更新Gk+1...
还有一种拟牛顿算法BFGS,稍微和DFP有点不同:
可见,算法大体思路是和DFT一致的,
只是pk的确定和正定阵(Gk+1 Bk+1)的更新有些不同...
最后的最后,总结几点:
1. 梯度下降法使用一阶导数,属于 平面拟合函数的局部曲面,它的每次x更新只考虑局部。牛顿法则考虑二阶导数,用二次曲面来拟合函数的局部曲面,考虑一阶导的变化情况(即二阶导)。利用了函数的更多的信息,能够更好的拟合局部曲面,所以收敛的速度也会加快。
2. 梯度下降法容易出现在最优点附近的“震荡”(因为学习率设置的问题),但牛顿法则不会,可以准确的到达最优点处。本质上是牛顿法使用了二阶导数的信息,它的步长在每一步是变化的,使得更新过程中它不会越过极值点,不“震荡”!
关于梯度下降算法,其中最重要的就是要确定步长μ,它的值严重的影响了梯度下降算法的表现。
接下来考虑如下公式:
f′(x+Δx)=f′(x)+f″(x)∗Δx 和 Δx=−μ∗f′(x)
结合两个式子,得到:
f′(x+Δx)=f′(x)−μ∗f″(x)∗f′(x)
μ=1/f″(x)
由此可见牛顿下降法是梯度下降法的最优情况,因此牛顿下降法的收敛的速度必然更快。
Hession 矩阵