这三个优化算法,实在是太过经典,以至于很多文章都在说这个算法。这里主要就写一写我自己的感悟吧。剩下的再集成一下别的感觉比较好的博客中的方法。
梯度下降
将
f(x)
一阶泰勒展开:
f(x)=f(x0)+(x−x0)f′(x0)
f(x)=f(x0)+Δxf′(x0)
如果当前处于 x0 节点,要使得前进同样的距离使得 f(x) 变的最小,则 Δx=−δf′(x) 时
f(x)=f(x0)−δf′2(x0)
新的 f(x) 能够取得下一步的最小值
这也是梯度下降算法为什么沿着梯度进行下降能够取得最小值的证明。
用梯度下降法,每次 xn=xn−1−δf′(x)
在多元函数中:
xn=xn−1−δ∇f(x)
牛顿法
将
f(x)
二阶泰勒展开:
f(x)=f(x0)+Δxf′(x0)+12Δx2f′′(x0)
因为要使得 f(x) 取得最小值,则 f′(x) 在最小值点必为0,将上式两边同时求导得到【其实直接对 f′(x) 进行一阶泰勒展开也可以】
f′(x)=f′(x0)+Δxf′′(x0)
取 f′(x)=0 得到
f′(x0)+Δxf′′(x0)=0
Δx=−f′(x0)f′′(x0)
所以用牛顿法,每次取得
xn=xn−1−f′(x0)f′′(x0)
在多元函数中
xn=xn−1−(∇2f(x0))−1∇f(x0)
其中 ∇2f(x0) 就是 f(x0) 的海森矩阵【二阶梯度矩阵】
其实,牛顿法在数值分析里面,是用来求解
f(x)=0
的解的问题的,相较于二分法求值的一阶收敛速度,牛顿法是一个二阶收敛速度。
用牛顿法求解
f(x)=0
的问题的时候,只用一阶导数就好
不过在最优化问题中,需要求解的是最值点,所以找的是其
f′(x)=0
的点,所以就用到了二阶导数。
拟牛顿法
拟牛顿法直接看下面参考文献吧
大体思路上来说用牛顿法需要计算Hessian矩阵的逆矩阵,运算复杂度太高(
O(n3)
级别的)。因此,很多牛顿算法的变形出现了,这类变形统称拟牛顿算法。
BFGS是用迭代法去近似计算海森矩阵。
而BFGS需要额外储存近似的那个海森矩阵,这时L-BFGS就出现了,它每次是计算出要计算近似海森矩阵就好。详细的看下面的参考文献吧。