一阶梯度法、二阶段梯度法、牛顿法

目标

有一个函数 f ( x ) f(x) ,我们要求得函数的最小值(或者最大值),由于最值点一般也是极值点,所以求出所有极值点,然后进行对比就能得到我们要的最值,可以理解为一个最小二乘的问题 min x 1 2 f ( x ) 2 2 \min_x \frac {1}{2}\| f(x)\|^2_2

解法

最暴力的方法,直接求解 d 1 2 f ( x ) 2 2 d x = 0 \frac {d \frac{1}{2}\|f(x)\|^2_2} {dx} =0
当然,如果能够直接解出结果,那就很好了,但是大多数情况下很难解。当没法求解的时候,可以采用迭代的方法:

  1. 给定某个初始值 x 0 x_0
  2. 对于第k次迭代,寻找一个增量 Δ x \Delta x ,使得 f ( x k + Δ x ) 2 2 \|f(x_k+\Delta x)\|^2_2 达到极小值。
  3. Δ x \Delta x足够小,则停止
  4. 否则,令 x k + 1 = x k + Δ x k x_{k+1}=x_k+\Delta x_k ,返回第2步。

下面介绍一下几个迭代的方法,都是在找 Δ x \Delta x

一阶梯度法

f ( x ) f(x) 在x附近进行泰勒展开 f ( x + Δ x ) 2 2 f ( x ) 2 2 + J ( x ) Δ x + 1 2 Δ x T H Δ x \|f(x+\Delta x)\|^2_2\approx\|f(x)\|^2_2+J(x)\Delta x+\frac{1}{2}\Delta x^TH\Delta x
x是常量,同时也是个向量; Δ x \Delta x 才是变量, J ( x ) J(x) 是雅可比矩阵, H H 是海塞矩阵,可以将J(x)理解为矩阵形式的一阶导数, H H 理解为矩阵形式的二阶导数

导数:指的是函数值增加的速度,速度是个向量(有大小,有方向),在一维的情况下,也是一样的,可以这样理解,假设 f ( x ) = 1 2 x 2 f(x)=\frac{1}{2}x^2 ,则 f ( x ) = x f^{&#x27;}(x)=x , f ( x ) f(x) 是关于y轴对称,最小值在原点的函数,当x<0的时候,导数也是<0的,当x>0的时候,导数是>0的,可以把±号看成方向。

梯度:梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。
设f(x)是一个多元函数,则梯度是向量 ( d f ( x ) d x 1 , d f ( x ) d x 2 , , d f ( x ) d x n , ) (\frac{d f(x)}{d x_1},\frac{d f(x)}{d x_2},…,\frac{d f(x)}{d x_n},…)

雅可比矩阵:设 y = f ( x ) y=f(x) ,x和y都是一个向量,则对应的雅可比矩阵为
J = [ d y 1 d x 1 d y 1 d x 2 d y 1 d x n d y 2 d x 1 d y 2 d x 2 d y 2 d x n d y m d x 1 d y m d x 2 d y m d x n ] J=\begin{bmatrix} \frac{d y_1}{d x_1} &amp; \frac{d y_1}{d x_2} &amp; … &amp;\frac{d y_1}{d x_n}\\ \\ \frac{d y_2}{d x_1} &amp; \frac{d y_2}{d x_2} &amp; … &amp;\frac{d y_2}{d x_n}\\\\ … &amp;…&amp;…&amp;… \\ \\ \frac{d y_m}{d x_1} &amp; \frac{d y_m}{d x_2} &amp; … &amp;\frac{d y_m}{d x_n}\end{bmatrix}
在y是标量的情况下, J T J^T 便是梯度,在y是高维的情况下, J T J^T 每个列向量都是对应的 y i y_i 的梯度

由于沿着梯度的方向是增长最快的方向,那么反方向就是下降最快的方法,所以 Δ x = J T ( x ) \Delta x^*=-J^T(x)
通常 Δ x \Delta x 前面会加一个步长 λ \lambda ,即 Δ x = λ J T ( x ) \Delta x^*=-\lambda J^T(x)

二阶梯度法

牛顿迭代法

假设我们要求解一个方程 f ( x ) = 0 f(x)=0 ,然而我们解不出来,但是我们可以得到它在 x 0 x_0 处的导数,可以对它在 x 0 x_0 进行泰勒展开 f ( x ) f ( x 0 ) + f ( x 0 ) ( x x 0 ) = 0 f(x)\approx f(x_0)+f^{&#x27;}(x_0)(x-x_0)=0
整理可以得到 x = x 0 + Δ x = x 0 + ( f ( x 0 ) f ( x 0 ) ) x=x_0+\Delta x=x_0+(- \frac {f(x_0)}{f^{&#x27;}(x_0)})
由于泰勒展开式要无穷多项加起来才能等价于 f ( x ) f(x) ,这里只用了两项做近似,所以得到的解并不是真正的解,但是 x 0 + Δ x x_0+\Delta x x 0 x_0 更加接近真正的解,之后进行迭代,直到 f ( x ) &lt; r |f(x^*)|&lt;r (r指允许误差),此时的 x x^* 便是要求的解。

在一阶梯度法中我们只用到一阶梯度信息,如果继续使用二阶梯度信息,则
f ( x + Δ x ) 2 2 f ( x ) 2 2 + J ( x ) Δ x + 1 2 Δ x T H Δ x \|f(x+\Delta x)\|^2_2\approx\|f(x)\|^2_2+J(x)\Delta x+\frac{1}{2}\Delta x^TH\Delta x
为了更加简单的表示,我们设 f ( x ) = f ( x ) 2 2 f(x)=\|f(x)\|^2_2 ,则
f ( x 0 + Δ x ) f ( x 0 ) + J ( x 0 ) Δ x + 1 2 Δ x T H Δ x f(x_0+\Delta x)\approx f(x_0)+J(x_0)\Delta x+\frac{1}{2}\Delta x^TH\Delta x
我们的目的是得到 f ( x ) = 0 f(x)^{&#x27;}=0 的解,我们只要得到 f ( x ) f(x)^{&#x27;} 的表示形式,便可以将问题用牛顿迭代法求解

因为 f ( x 0 ) f(x_0) J ( x 0 ) J(x_0) H = H ( x 0 ) H=H(x_0) 都是常数,变量是 Δ x \Delta x ,我们对 f ( x 0 + Δ x ) f(x_0+\Delta x) 求导可以得到
f ( x 0 + Δ x ) = J ( x 0 ) T + 1 2 ( H Δ x + H T Δ x ) = J ( x 0 ) T + H Δ x f(x_0+\Delta x)^{&#x27;}=J(x_0)^T+\frac {1}{2}(H\Delta x+H^T\Delta x)=J(x_0)^T+H\Delta x
这里用到了一些性质
1.矩阵求导
2.黑塞矩阵(Hessian Matrix):如果函数 f ( x ) f(x) 在 区域内二阶连续可导,那么 f f 黑塞矩阵 H ( f ) H(f) 在D内为对称矩阵。

f ( x 0 + Δ x ) = 0 f(x_0+\Delta x)^{&#x27;}=0 ,可以得到 Δ x = H 1 J T \Delta x=-H^{-1}J^T


参考书籍:《视觉SLAM十四讲》
链接:https://blog.csdn.net/luoleicn/article/details/6527049

猜你喜欢

转载自blog.csdn.net/Dang_boy/article/details/84068159
今日推荐