目标
有一个函数
f(x),我们要求得函数的最小值(或者最大值),由于最值点一般也是极值点,所以求出所有极值点,然后进行对比就能得到我们要的最值,可以理解为一个最小二乘的问题
xmin21∥f(x)∥22
解法
最暴力的方法,直接求解
dxd21∥f(x)∥22=0
当然,如果能够直接解出结果,那就很好了,但是大多数情况下很难解。当没法求解的时候,可以采用迭代的方法:
- 给定某个初始值
x0。
- 对于第k次迭代,寻找一个增量
Δx,使得
∥f(xk+Δx)∥22达到极小值。
- 若
Δx足够小,则停止。
- 否则,令
xk+1=xk+Δxk,返回第2步。
下面介绍一下几个迭代的方法,都是在找
Δx
一阶梯度法
将
f(x)在x附近进行泰勒展开
∥f(x+Δx)∥22≈∥f(x)∥22+J(x)Δx+21ΔxTHΔx
x是常量,同时也是个向量;
Δx才是变量,
J(x)是雅可比矩阵,
H是海塞矩阵,可以将J(x)理解为矩阵形式的一阶导数,
H理解为矩阵形式的二阶导数
导数:指的是函数值增加的速度,速度是个向量(有大小,有方向),在一维的情况下,也是一样的,可以这样理解,假设
f(x)=21x2,则
f′(x)=x,
f(x)是关于y轴对称,最小值在原点的函数,当x<0的时候,导数也是<0的,当x>0的时候,导数是>0的,可以把±号看成方向。
梯度:梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。
设f(x)是一个多元函数,则梯度是向量
(dx1df(x),dx2df(x),…,dxndf(x),…)
雅可比矩阵:设
y=f(x),x和y都是一个向量,则对应的雅可比矩阵为
J=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡dx1dy1dx1dy2…dx1dymdx2dy1dx2dy2…dx2dym…………dxndy1dxndy2…dxndym⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
在y是标量的情况下,
JT便是梯度,在y是高维的情况下,
JT每个列向量都是对应的
yi的梯度
由于沿着梯度的方向是增长最快的方向,那么反方向就是下降最快的方法,所以
Δx∗=−JT(x)
通常
Δx前面会加一个步长
λ,即
Δx∗=−λJT(x)
二阶梯度法
牛顿迭代法
假设我们要求解一个方程
f(x)=0,然而我们解不出来,但是我们可以得到它在
x0处的导数,可以对它在
x0进行泰勒展开
f(x)≈f(x0)+f′(x0)(x−x0)=0
整理可以得到
x=x0+Δx=x0+(−f′(x0)f(x0))
由于泰勒展开式要无穷多项加起来才能等价于
f(x),这里只用了两项做近似,所以得到的解并不是真正的解,但是
x0+Δx比
x0更加接近真正的解,之后进行迭代,直到
∣f(x∗)∣<r(r指允许误差),此时的
x∗便是要求的解。
在一阶梯度法中我们只用到一阶梯度信息,如果继续使用二阶梯度信息,则
∥f(x+Δx)∥22≈∥f(x)∥22+J(x)Δx+21ΔxTHΔx
为了更加简单的表示,我们设
f(x)=∥f(x)∥22,则
f(x0+Δx)≈f(x0)+J(x0)Δx+21ΔxTHΔx
我们的目的是得到
f(x)′=0的解,我们只要得到
f(x)′的表示形式,便可以将问题用牛顿迭代法求解
因为
f(x0)、
J(x0)和
H=H(x0)都是常数,变量是
Δx,我们对
f(x0+Δx)求导可以得到
f(x0+Δx)′=J(x0)T+21(HΔx+HTΔx)=J(x0)T+HΔx
这里用到了一些性质
1.矩阵求导
2.黑塞矩阵(Hessian Matrix):如果函数
f(x)在 区域内二阶连续可导,那么
f黑塞矩阵
H(f)在D内为对称矩阵。
令
f(x0+Δx)′=0,可以得到
Δx=−H−1JT
参考书籍:《视觉SLAM十四讲》
链接:https://blog.csdn.net/luoleicn/article/details/6527049