梯度下降、牛顿法、高斯牛顿&L-M算法比较

本文梳理一下常见的几种优化算法:梯度下降法,牛顿法、高斯-牛顿法和L-M算法,优化算法根据阶次可以分为一阶方法(梯度下降法),和二阶方法(牛顿法等等),不同优化算法的收敛速度,鲁棒性都有所不同。一般来讲,二阶方法要比一阶方法有更快的收敛速度。

梯度下降法

梯度下降法是一种简洁直观的寻找极小值的迭代算法,它总是沿着负梯度方向进行搜索,直到梯度为0才收敛。它的迭代公式为:
x k + 1 = x k − α f ′ ( x k ) \bm x_{k+1} = \bm x_k - \alpha f'(\bm x_k) xk+1=xkαf(xk)
其中 α \alpha α为搜索步长,是一个需要人为给定的值,当然你也可以设计一种自适应的给定 α \alpha α的算法。 α \alpha α的选择会影响梯度下降法的收敛速度。下图是从(1,1)出发在 f ( x ) = x 2 f(x)=x^2 f(x)=x2上寻找最小值点的搜索路径。

梯度下降、牛顿法、高斯牛顿&L-M算法比较_第1张图片 梯度下降、牛顿法、高斯牛顿&L-M算法比较_第2张图片

左图和右图分别为 α = 0.3 \alpha =0.3 α=0.3 α = 0.7 \alpha=0.7 α=0.7时的效果。梯度下降法是一阶方法,其收敛速度通常不如二阶方法,如牛顿法。

牛顿法

所有二阶方法都源自二阶泰勒展开:
f ( x + δ x ) ≈ f ( x ) + g ⊤ δ x + 1 2 δ x ⊤ H δ x f(\bm x + \delta\bm x) \approx f(\bm x)+\bm g^\top\delta\bm x+\dfrac{1}{2}\delta\bm x^\top\bm H\delta\bm x f(x+δx)f(x)+gδx+21δxHδx
其中 g = d f d x ( x ) \bm g = \frac{df}{d\bm x}(\bm x) g=dxdf(x) H = d f 2 d x 2 ( x ) \bm H = \frac{df^2}{d\bm x^2}(\bm x) H=dx2df2(x)。假定 H \bm H H是正定的,于是在 x x x领域内的函数就可以看成是一个有唯一最小值的二次函数,那么求解增量就可以设
d f d x ( x + δ x ) ≈ H δ x + g = 0 \dfrac{df}{d\bm x}(\bm x+\delta\bm x)\approx\bm H\delta x+\bm g=0 dxdf(x+δx)Hδx+g=0
解得
δ x = − H − 1 g \delta\bm x=-\bm H^{-1}\bm g δx=H1g
(这里的 g \bm g g其实需要转置一下,为了简洁就没有转置)
这就是牛顿法求得的更新步长,通过迭代就构成了标准的牛顿法。牛顿法具有二阶收敛速度,对于二次函数,只需要经过一次迭代就能得到最小值。然而,要想快速收敛,前提是合理地设置步长。尽管牛顿法公式简洁且性能优秀,它仍然有以下缺点:

  • 为了保证收敛,必须添加合理控制步长的逻辑。
  • 对于一个系数矩阵为稠密矩阵的系统,计算 n × n n\times n n×n的牛顿步长方程的算法复杂度是 O ( n 3 ) O(n^3) O(n3),这对于Bundle Ajustment来说太慢了,由于求解增量方程比较复杂,实际执行起来还没一阶方法速度快。
  • 对于复杂的目标函数,计算hessian矩阵 H \bm H H需要大量运算,然而相比于一阶方法带来的精度提升又很有限,费力不讨好。
  • 总体而言,牛顿法只需很少的迭代次数就能接近收敛,然而计算中间变量消耗了大量运算。

高斯-牛顿法

高斯-牛顿法是牛顿法的一种近似,它作为一种二阶方法,只需要计算一阶导数,省去了对复杂的hessian矩阵的计算,因此比标准的牛顿法更快速。下面我们在上述牛顿法的基础上推导高斯-牛顿法。
设目标函数为误差的加权平方和:
f ( x ) = 1 2 Δ z ( x ) ⊤ W Δ z ( z ) f(\bm x) = \frac{1}{2}\Delta\bm z(\bm x)^\top\bm W\Delta\bm z(\bm z) f(x)=21Δz(x)WΔz(z)
其中 Δ z ( x ) = z − z ( x ) \Delta\bm z(\bm x) = \bm z - \bm z(\bm x) Δz(x)=zz(x)为预测的误差, W \bm W W是权值矩阵,然后我们计算 d f d x \frac{df}{d\bm x} dxdf d 2 f d x 2 \frac{d^2f}{d\bm x^2} dx2d2f,也就是 g \bm g g H \bm H H。令 J = d z d x \bm J = \dfrac{d\bm z}{d\bm x} J=dxdz,根据矩阵求导公式可以得到:
(A) g = d f d x = 1 2 ( Δ z ⊤ W d z d x + Δ z ⊤ W d z d x ) = Δ z ⊤ W J \bm g=\frac{df}{d\bm x}=\frac{1}{2}(\Delta\bm z^\top\bm W\frac{d\bm z}{d\bm x}+\Delta\bm z^\top\bm W\frac{d\bm z}{d\bm x}) =\Delta\bm z^\top\bm W\bm J \tag{A} g=dxdf=21(ΔzWdxdz+ΔzWdxdz)=ΔzWJ(A)
(B) H = d 2 f d x = d g d x = Δ z ⊤ W d J d x + J ⊤ W d Δ z d x = J ⊤ W J + Δ z ⊤ W d J d x \bm H=\frac{d^2f}{d\bm x}=\frac{d\bm g}{d\bm x}=\Delta\bm z^\top\bm W\frac{d\bm J}{d\bm x}+\bm J^\top\bm W\frac{d\Delta\bm z}{d\bm x}\\=\bm J^\top\bm W\bm J+\Delta\bm z^\top\bm W\frac{d\bm J}{d\bm x} \tag{B} H=dxd2f=dxdg=ΔzWdxdJ+JWdxdΔz=JWJ+ΔzWdxdJ(B)
式B中的 Δ Z ⊤ W d J d x \Delta\bm Z^\top\bm W\frac{d\bm J}{d\bm x} ΔZWdxdJ相对于 J ⊤ W J \bm J^\top\bm W\bm J JWJ是一个极小项,因此可以认为 H ≈ J ⊤ W J \bm H\approx\bm J^\top\bm W\bm J HJWJ。通过这种近似,牛顿步长的预测方程就变成了高斯-牛顿方程(这里需要把 g \bm g g转置一下):
( J ⊤ W J ) δ x = − J ⊤ W Δ z (\bm J^\top\bm W\bm J)\delta\bm x=-\bm J^\top\bm W\Delta\bm z (JWJ)δx=JWΔz
高斯-牛顿法经常被用于求解非线性最小二乘问题,在求解Bundle Adjustment中也经常用到,它最大的优点是易于实现,形式简单。
当然它也有一定的问题:

  • H \bm H H中被忽略不计的项 Δ z ⊤ W d J d x \Delta\bm z^\top\bm W\dfrac{d\bm J}{d\bm x} ΔzWdxdJ并没有“很小”时,高斯-牛顿法的收敛速度会变慢。这种收敛速度情况在当前步骤有一些比较大的残差项时经常出现。比如,当优化向量靠近鞍点的时候,高斯-牛顿近似就不是准确的。为了避免这种情况,需要进行合理的参数化以及去除错误约束(outliers)。以及使用鲁棒核函数(损失函数)来减小极端残差对优化过程的影响。
  • 高斯牛顿法没有控制步长的逻辑,从而对病态的雅可比 J \bm J J比较敏感。

L-M算法

L-M全称Levenberg–Marquardt,相比于高斯-牛顿法增加了控制步长的逻辑,是高斯牛顿法和梯度下降法的结合。其增量方程为:
( J ⊤ W J + λ I ) δ x = − J ⊤ W Δ z (\bm J^\top\bm W\bm J+\lambda\bm I)\delta\bm x=-\bm J^\top\bm W\Delta\bm z (JWJ+λI)δx=JWΔz
L-M算法的重点是参数 λ \lambda λ的选择,从公式可以看出,当 λ → ∞ \lambda\to\infty λ时,相当于梯度下降法,当 λ → 0 \lambda\to 0 λ0时,相当于高斯牛顿法。
λ \lambda λ的作用体现在总的代价函数不降反升的情况。Marquardt建议首先设置一个初始的 λ 0 \lambda_0 λ0,和一个系数 v > 1 v>1 v>1,然后分别以 λ = λ 0 \lambda=\lambda_0 λ=λ0 λ = λ 0 / v \lambda=\lambda_0/v λ=λ0/v进行更新并计算代价函数,如果代价函数增大了,那就令连续乘以 v v v直到找到一个使代价函数减小的值 λ 0 v k \lambda_0v^k λ0vk
如果使用 λ / v \lambda/v λ/v能够降低代价函数,那么就更新 λ \lambda λ并且继续迭代,如果用 λ / v \lambda/v λ/v让代价函数增大而 λ \lambda λ能够减小代价函数,那么 λ \lambda λ就保持不变。
L-M算法要比高斯-牛顿法更鲁邦,即使初始点离局部最优点比较远,也能够到达最优点,收敛速度上相比于高斯-牛顿法要稍微慢一点点。

你可能感兴趣的:(数值优化)