对几个经典方法的整理和比较
手打一下公式
梯度下降法:面向任何函数,收敛速度一阶,有发散可能。梯度下降法考虑函数的一阶梯度(一阶泰勒展开),找到一个合理的迭代方向,但是不能确定步长。
只利用了当前点的切线(一阶梯度)的信息
$x = x_0 - lambda abla{f(x)}$
牛顿法:面向任何函数,收敛速度二阶,有发散可能。使用了二阶的梯度,
对导数泰勒一阶展开(相当于对原函数二阶展开) $f'(x) approx f'(x_0) + (x-x_0)f''(x_0) $
令 $f'(x_0) + (x-x_0)f''(x_0) = 0$, 可得$ x = x_0 - frac{f'(x_0)}{f''(x_0)}$。其中f'就是梯度$ abla{f(x)}$, f''就是海森阵$H$, 也是二阶梯度$ abla^2{f(x)}$
每次可以获得一个点!而不是一个方向。因为利用了二阶梯度的信息,相当于把原函数展开成一个二次函数,求解最小值,收敛速度也比梯度下降快。同样有发散的可能性,计算二阶梯度计算量很大。
阻尼牛顿法:增加一维的步长搜索
拟牛顿法:简化对二阶梯度的计算
高斯牛顿法:针对目标函数有最小二乘的形式。简化海森阵H的计算,利用雅可比矩阵的信息。计算量变小了,同样需要一阶搜索来确定步长
$ x = x_0 - [J^TJ^{-1}]J^Tf(x)$
缺点
若二次项的值比较大,会导致难以忽略,高斯牛顿法的收敛速度会很慢,甚至无法收敛。
Levenberg–Marquardt算法
增加一个系数μ,用它来控制算法的收敛。
算法刚刚运行的时候,接近于梯度下降法,收敛到极小值附近。算法运行到后面,接近于高斯牛顿法,避免震荡。
约束!