视觉slam十四讲ch6 非线性变换
一:状态估计问题
1:批量状态估计与最大后验估计
(1)经典SLAM模型的运动方程和观测方程
-
运动方程: X k = f ( X k − 1 , U k ) + W k X_k=f(X_k-1~,U_k)+W_k Xk=f(Xk−1 ,Uk)+Wk
X X X表示相机的位姿,每个时刻位姿记为X1,X2……X(k)构成了运动的位姿, X k X_k Xk可以由 T k T_k Tk变换矩阵 S E ( 3 ) SE(3) SE(3)给出
U k U_k Uk是传感器的输入
W k W_k Wk是运动噪声, W k W_k Wk~N(0, R k R_k Rk)
运动方程解释了从k-1时刻到k时刻,机器人的位姿是如何变化的。SLAM的关键问题就是解决估计X的问题 -
观测方程: Z k = h ( Y j , X k ) + V k , j Z_k=h(Y_j,X_k)+V_k,_j Zk=h(Yj,Xk)+Vk,j
Y j Y_j Yj是对应的路标
Z k , j Z_k,_j Zk,j是对应图像的像素位置
V k , j V_k,_j Vk,j是观测噪声, V k V_k Vk~N(0, Q k , j Q_k,_j Qk,j)
(2)视觉SLAM的观测方程(由针孔模型给定):
s ∗ Z k , j = K ( R k , ∗ Y j + t k ) s*Z_k,_j=K(R_k,*Y_j+t_k) s∗Zk,j=K(Rk,∗Yj+tk)
其中:
- K为相机内参
- s为像素点距离,也是( R k ∗ t k R_k*t_k Rk∗tk)的第三个分量
若使用变换矩阵 T k T_k Tk描述位姿,则 Y j Y_j Yj必须用齐次坐标来描述,计算完成后要转换为非齐次坐标(见第五讲)
(3)视觉SLAM的问题
通过带噪声的数据 Z Z Z和 U U U推测位姿 X X X和地图 Y Y Y(以及他们的概率分布(即状态估计问题)
解决这种状态估计问题方法:
- 滤波器(增量/渐进)法:持有一个当前时刻的估计状态,然后用新的数据来更新它
- 批量法:把数据“攒”起来一并处理(例:把0-k时刻的所有输入和观测数据放在一起,在这样的输入和观测下,如何估计整个0-k时刻的轨迹与地图)------SfM(Structure from Motion) 具有不实时性,不符合SLAM的应用场景
- 滑动窗口估计法:固定一些历史轨迹,仅对当前时刻附近的一些轨迹进行优化
(4)批量方法
考虑从1到N的所有时刻,并假设有M个路标点,定义所有时刻的机器人位姿及路标点坐标
X = ( X 1 , X 2 , . . . . . . , X N ) , Y = ( Y 1 , Y 2 , . . . . . . , Y M ) X=({X_1,X_2,......,X_N}), Y=({Y_1,Y_2,......,Y_M}) X=(X1,X2,......,XN),Y=(Y1,Y2,......,YM)
- 不带下标的U代表所有时刻的输入
- Z代表所有时刻的观测数据
从概率学的角度,视觉SLAM的问题就是:已知输入数据U和观测数据Z的条件下,求状态X,Y的概率分布
当我们不知道控制输入U时候,只有一张张图片时候,即只考虑观测方程带来的数据时,相当于估计 P ( X , Y ∣ Z ) P(X,Y|Z) P(X,Y∣Z)的概率分布,此问题也称SfM,即:如何从一张张图像中重构三维空间结构
由贝叶斯法则:P(A|B)= P ( B ∣ A ) ∗ P ( A ) P ( B ) \frac{P(B|A)*P(A)}{P(B)} P(B)P(B∣A)∗P(A)
P ( X , Y ∣ Z ) = P ( Z ∣ X , Y ) ∗ P ( X , Y ) P ( Z ) ∝ P ( Z ∣ X , Y ) ∗ P ( X , Y ) P(X,Y|Z)=\frac{P(Z|X,Y)*P(X,Y)}{P(Z)}\propto P(Z|X,Y)*P(X,Y) P(X,Y∣Z)=P(Z)P(Z∣X,Y)∗P(X,Y)∝P(Z∣X,Y)∗P(X,Y)
- 其中:P(X,Y|Z)称为后验概率,P(Z|X,Y)称为似然,P(X|Y)称为先验
- 直接求解后验估计是困难的,但是求一个状态最优估计,使得在该状态下后验概率最大是可行的
( X , Y ) ∗ M A P = a r g m a x P ( X , Y ∣ Z ) = a r g m a x P ( Z ∣ X , Y ) ∗ P ( X , Y ) (X,Y)^*MAP=arg max P(X,Y|Z)=argmaxP(Z|X,Y)*P(X,Y) (X,Y)∗MAP=argmaxP(X,Y∣Z)=argmaxP(Z∣X,Y)∗P(X,Y)
- 由于P(X,Y|Z)的分母部分与待估计的状态X,Y无关,故可以忽略
- 贝叶斯法则可以得知求解最大后验概率等价于最大似然和先验的乘积
在实际现实中,我们也无法大概知道机器人的位姿或路标,此时就不知道了先验
那么就可以求解最大似然估计(Maximize Likelihood Estimation,MLE)
( X , Y ) ∗ M L E = a r g m a x P ( Z ∣ X , Y ) (X,Y)^*MLE=arg max P(Z|X,Y) (X,Y)∗MLE=argmaxP(Z∣X,Y)
-
似然:在当前的位姿和路标下,可能产生什么样的观测数据
由于观测到的数据是已知的,最大似然估计就可以理解为:“在什么样的·状态下,最可能产生现在观测到的数据”
2:最小二乘的引出
怎么求最大似然估计?
在高斯分布的前提假设下,最大似然能够有较为简单的形式:
对于某一次观测:
Z k , j = h ( Y j , X k ) + V k , j Z_k,_j=h(Y_j,X_k)+V_k,_j Zk,j=h(Yj,Xk)+Vk,j
由于噪声 V k V_k Vk~N(0, Q k , j Q_k,_j Qk,j),故观测数据的条件概率为
P ( Z j , k ∣ X k , Y j ) = N ( ( h ( Y j , X k ) , Q k , j ) P(Z_j,_k|X_k,Y_j)=N((h(Y_j,X_k),Q_k,_j) P(Zj,k∣Xk,Yj)=N((h(Yj,Xk),Qk,j)
它仍然是一个高斯分布,高斯分布的概率密度函数:
P ( X ) = 1 ( 2 π ) N d e t ( c o v ) ∗ e − 1 2 ( X − u ) T c o v − 1 ( X − u ) P(X)=\frac{1}{\sqrt{(2\pi)^Ndet(cov)}}*e^{-\frac{1}{2}(X-u)^Tcov^{-1}(X-u)} P(X)=(2π)Ndet(cov)1∗e−21(X−u)Tcov−1(X−u)
其中:
- N为分布的维度
- cov为对应的协方差矩阵,det为对应的行列式
- u是均值
考虑单次观测的最大似然估计,可以用最小负对数将高斯分布概率密度函数化简,通过求解负对数的最小值得到原函数的最大值
取负对数得:
− l n ( X ) = 1 2 l n ( 2 π ) N d e t ( c o v ) + 1 2 ( X − u ) T c o v − 1 ( X − u ) -ln(X)=\frac{1}{2}ln(2\pi)^Ndet(cov)+\frac{1}{2}(X-u)^Tcov^{-1}(X-u) −ln(X)=21ln(2π)Ndet(cov)+21(X−u)Tcov−1(X−u)
- 负对数的右侧第一项与X无关,可以略去
- 最小化右侧的二次项,即可得到对状态的最大似然估计
( X k , Y k ) ∗ = a r g m a x N ( h ( Y j , X k ) , Q k , j ) = a r g m i n ( ( Z k , j − h ( X k , Y j ) T Q k , j − 1 ( Z k , j − h ( X k , Y j ) ) (X_k,Y_k)^*=arg max N(h(Y_j,X_k),Q_k,_j)=arg min((Z_k,_j-h(X_k,Y_j)^TQ_{k,j}^{-1}(Z_k,_j-h(X_k,Y_j)) (Xk,Yk)∗=argmaxN(h(Yj,Xk),Qk,j)=argmin((Zk,j−h(Xk,Yj)TQk,j−1(Zk,j−h(Xk,Yj))
其中:
- Z k , j Z_k,_j Zk,j对应上述的自变量X
- h ( X k . Y j ) h(X_k.Y_j) h(Xk.Yj)对应均值u
- Q k , j Q_{k,j} Qk,j对应协方差cov
该式等价于:最小化误差项(即误差)的一个二次型,这个二次型称为“马哈拉诺比斯距离(Mahalanobis distance)”,又称“马氏距离”,可以看成由 Q k , j − 1 Q_{k,j}^{-1} Qk,j−1加权后的欧式距离, Q k , j − 1 Q_{k,j}^{-1} Qk,j−1也叫做信息矩阵(高斯分布协方差矩阵之逆)
现在我们考虑批量时刻的数据,通常假设:各个时刻的输入和观测是相互独立的,这意味着:各个输入之间是相互独立的,各个观测之间是也是相互独立的
依据以下结论:
-
在概率论中:若事件A和事件B是相互独立的,则:P(AB)=P(A)P(B)
-
经典SLAM运动模型:
X k = f ( X k − 1 , U k ) + W k X_k=f(X_k-1~,U_k)+W_k Xk=f(Xk−1 ,Uk)+Wk
Z k , j = h ( Y j , X k ) + V k , j Z_{k,j}=h(Y_j,X_k)+V_{k,j} Zk,j=h(Yj,Xk)+Vk,j
推出:
P ( Z , U ∣ X , Y ) = ∏ k P ( U k ∣ X k − 1 , k ) ∏ k , j P ( Z k , j ∣ X k , Y j ) P(Z,U|X,Y)=\prod_{k}{P(U_k|X_{k-1,k})\prod_{k,j}P(Z_{k,j}|X_k,Y_j)} P(Z,U∣X,Y)=k∏P(Uk∣Xk−1,k)k,j∏P(Zk,j∣Xk,Yj)
定义:各次输入和观测数据与模型之间的误差
e u , k = X k − f ( X k − 1 , U k ) e_{u,k}=X_k-f(X_{k-1},U_k) eu,k=Xk−f(Xk−1,Uk)
e Z , j , k = Z j , k − h ( X k , Y j ) e_{Z,j,k}=Z_{j,k}-h(X_k,Y_j) eZ,j,k=Zj,k−h(Xk,Yj)
最小化所有时刻估计值与真实读数之间的马氏距离,等价于求最大似然估计
利用负对数,把乘积变成求和:
m i n J ( X , Y ) = ∑ e u , k T R k − 1 e u , k + ∑ k ∑ j e Z , k , j T Q k , j − 1 e Z , k , j min J(X,Y)=\sum{e_{u,k}^{T}R_k^{-1}e_{u,k}}+\sum_k{\sum_j{e_{Z,k,j}^{T}Q_{k,j}^{-1}e_{Z,k,j}}} minJ(X,Y)=∑eu,kTRk−1eu,k+k∑j∑eZ,k,jTQk,j−1eZ,k,j
- k是对应时刻
- j是对应某个路标Y
这样就得到了一个最小二乘问题,它的解等价于状态的最大似然估计。
直观上看,由于噪声的存在,当我们将估计的轨迹与地图代入SLAM的运动,观测方程中时,它们并不会完美地成立。
这时候我们需要把对状态的估计值进行微调,使得整体的误差下降一些,使其达到一个极小值,这个就是典型的非线性优化的过程
仔细观察上式,可以发现SLAM中的最小二乘问题具有一些特定结构:
-
整个问题的目标函数由许多个误差的(加权的)二次型组成。虽然总体变量维数很高,但每个误差项都是简单的,仅与一两个状态变量有关。
例如:运动误差只与 X k − 1 , X k X_{k-1},X_k Xk−1,Xk有关,观测误差只与 X k , Y K X_k,Y_K Xk,YK有关。这种关系会让整个问题具有一种稀疏的形式
-
若用李代数表示增量,则该问题是无约束的最小二乘问题。若用旋转/变换矩阵描述位姿,则会引入旋转矩阵自身的约束( R R T = I RR^T=I RRT=I,det®=1),额外的约束会使优化变得困难,这体现了李代数的优势
-
使用二次型度量误差。误差的分布将会影响此项在整个问题中的权重
例如:若某次的观测非常准确,那么协方差矩阵将会“小”,而信息矩阵将会“大”
3:例子:批量状态估计
考虑一个非常简单的离散时间系统:
X k = X k − 1 + U k + W k X_k=X_{k-1}+U_k+W_k Xk=Xk−1+Uk+Wk W k W_k Wk~N(0, Q k Q_k Qk)
Z k = X k + n k Z_k=X_k+n_k Zk=Xk+nk n k n_k nk~N(0, R k R_k Rk)
这个可以表达一辆沿X轴前进或后退的汽车
- 第一个方程为运动方程: U k U_k Uk为输入, W k W_k Wk为噪声
- 第二个方程为观测方程: Z k Z_k Zk是对汽车位置的测量,取时间k=1,2,…3
现在希望根据已有的 V , Y V,Y V,Y进行状态估计。设初始状态 X 0 X_0 X0已知,下面推导批量状态估计的最大似然估计
首先令批量状态变量为 X = [ x 0 , x 1 , x 2 , x 3 ] T X=[x_0,x_1,x_2,x_3]^T X=[x0,x1,x2,x3]T,令批量观测为 Z = [ z 1 , z 2 , z 3 ] T Z=[z_1,z_2,z_3]^T Z=[z1,z2,z3]T, U = [ u 1 , u 2 , u 3 ] T U=[u_1,u_2,u_3]^T U=[u1,u2,u3]T
依照之前的推导,最大似然估计:
X m a p ∗ = a r g m a x P ( X ∣ U , Z ) = a r g m a x P ( U , Z ∣ X ) = ∏ k = 1 3 P ( U k ∣ X k − 1 , X k ) ∏ k = 1 3 P ( Z k ∣ X k ) X^*_{map}=arg max P(X|U,Z)=argmax P(U,Z|X)=\prod^{3}_{k=1}P(U_k|X_{k-1},X_{k})\prod^{3}_{k=1}P(Z_k|X_k) Xmap∗=argmaxP(X∣U,Z)=argmaxP(U,Z∣X)=k=1∏3P(Uk∣Xk−1,Xk)k=1∏3P(Zk∣Xk)
对于每一项:
- 运动方程: P ( U k ∣ X k − 1 , X k ) = N ( X k − X k − 1 , Q k ) P(U_k|X_{k-1},X_k)=N(X_k-X_{k-1},Q_k) P(Uk∣Xk−1,Xk)=N(Xk−Xk−1,Qk)
- 观测方程: P ( Z k ∣ X k ) = N ( X k , R k ) P(Z_k|X_k)=N(X_k,R_k) P(Zk∣Xk)=N(Xk,Rk)
构造误差变量:
e
u
,
k
=
X
k
−
X
k
−
1
−
U
k
e_{u,k}=X_k-X_{k-1}-U_k
eu,k=Xk−Xk−1−Uk
e z , k = Z k − X k e_{z,k}=Z_k-X_k ez,k=Zk−Xk
于是最小二乘的目标函数为:
m i n ∑ k = 1 3 e u , k T Q k − 1 e u , k + ∑ k = 1 3 e z , k T R k − 1 e z , k min\sum^3_{k=1}e_{u,k}^TQ_k^{-1}e_{u,k}+\sum_{k=1}^3e_{z,k}^TR_{k}^{-1}e_{z,k} mink=1∑3eu,kTQk−1eu,k+k=1∑3ez,kTRk−1ez,k
此外这个系统是线性系统,我们可以很容易地将它写成向量形式。定义向量 y = [ u , z ] T y=[u,z]^T y=[u,z]T,可以写出矩阵 H H H ,使得 y − H x = e y-Hx=e y−Hx=e~N(0, ∑ \sum ∑)
H = [ 1 − 1 0 0 0 1 − 1 0 0 0 1 − 1 0 1 0 0 0 0 1 0 0 0 0 1 ] H=\begin{bmatrix} 1&-1&0&0 \\ 0&1&-1&0\\ 0&0&1&-1 \\ 0&1&0&0 \\ 0&0&1&0\\0&0&0&1 \end{bmatrix} H= 100000−1101000−1101000−1001
且: ∑ = d i a g ( Q 1 , Q 2 , Q 3 , R 1 , R 2 , R 3 ) \sum=diag(Q_1,Q_2,Q_3,R_1,R_2,R_3) ∑=diag(Q1,Q2,Q3,R1,R2,R3)
整个问题可以写成:
x m a p ∗ = a r g m i n ( e T ∑ − 1 e ) x^*_{map}=arg min(e^T{\sum}^{-1}e) xmap∗=argmin(eT∑−1e)
这个问题的唯一解:
x m a p ∗ = ( H T ∑ − 1 H ) − 1 H T ∑ − 1 y ) x^*_{map}=(H^T{\sum}^{-1}H)^{-1}H^T{\sum}^{-1}y) xmap∗=(HT∑−1H)−1HT∑−1y)
二:非线性最小二乘
先考虑一个简单的最小二乘问题:
m i n x F ( x ) = 1 2 ∣ ∣ f ( x ) ∣ ∣ 2 2 min_{x}F(x)=\frac{1}{2}||f(x)||^2_2 minxF(x)=21∣∣f(x)∣∣22其中:
- 自变量 x ∈ R n x{\in}R^n x∈Rn
- f是任意标量非线性函数 f ( x ) : R n → R f(x):R^n{\to}R f(x):Rn→R
- 系数 1 2 \frac{1}{2} 21是无关紧要的
如何求解这样一个最小值问题?
若f是个数学形式上很简单的函数:可以直接利用求导得到能够取到极小值的点
d F d x = 0 \frac{dF}{dx}=0 dxdF=0
这个方程是否容易求解也是个问题。
-
若f的导函数是一个简单的线性函数,那么这个问题就是一个简单的线性最小二乘问题
-
若f的导函数比较复杂,我们可以采用迭代的方式==,从一个初始值出发,不断地更新当前的优化变量,使目标函数下降==
具体步骤如下:
1:给定某个初始值X_0
2:对于第k次迭代,寻找一个增量delta(X_k),使得||f(X_k+delta(X_k))||达到最小值
3:若delat(X_k)足够小,则停止
4:否则,令X_{k+1}=X_k+delta(X_k),返回第二步
这让求解导函数为零的问题变成了一个不断寻找下降增量 δ X k \delta{X_k} δXk的问题
当函数下降到增量非常小的时候,就认为算法收敛,目标函数达到了一个极小值(这个是一个局部的问题,我们只关心f在迭代处的局部性质而非全局性质)
接下来我们将考察如何寻找这个增量 δ X k \delta{X_k} δXk
1:一阶和二阶梯度法
现在考虑第k次迭代,假设在 X k X_k Xk处,想要找到增量 △ X k {\triangle}X_k △Xk,最直观的方式是将目标函数在 X k X_k Xk附近进行泰勒展开:
F ( X k + △ X k ) ≈ F ( X k ) + J ( X k ) T △ X k + 1 2 △ X k T H ( X k ) △ X k F(X_k+{\triangle}X_k){\approx}F(X_k)+J(X_k)^T{\triangle}X_k+{\frac{1}{2}}{\triangle}X_k^TH(X_k){\triangle}X_k F(Xk+△Xk)≈F(Xk)+J(Xk)T△Xk+21△XkTH(Xk)△Xk
其中:
- J ( X k ) J(X_k) J(Xk)是 F ( X ) F(X) F(X)关于 X X X的一阶导数(也叫梯度,雅可比矩阵)
- H则是二阶导数(海塞矩阵)
(1)一阶梯度法
若保留一阶梯度,那么取增量为反向的梯度,即可保证函数下降
△ X ∗ = − J ( X k ) {\triangle}X^*=-J(X_k) △X∗=−J(Xk)
这个只是一个方向,我们还要指定一个步长 λ \lambda λ。这个步长可以根据一定的条件来计算,这种方法称为“最速下降法”–只要我们沿着反向梯度的方向前进,在一阶线性近似下,目标函数必然会下降。
(2)二阶梯度法
注意以上讨论都是在第k次迭代时进行的,并不涉及其他的迭代信息,所以为了简化符号,省略下标k,并认为这些讨论对任意一次迭代都成立
保留二阶梯度信息,此时增量方程为:
△ X ∗ = a r g m i n ( F ( X ) + J ( X ) T △ X + 1 2 △ X T H △ X ) {\triangle}X^*=arg min(F(X)+J(X)^T{\triangle}X+\frac{1}{2}{\triangle}X^TH{\triangle}X) △X∗=argmin(F(X)+J(X)T△X+21△XTH△X)
右侧只含 △ X {\triangle}X △X的零次,一次,二次项。求右侧等式关于 △ X {\triangle}X △X的导数并令它等于零,得到:
J + H △ X = 0 → H △ X = − J J+H{\triangle}X=0 {\to} H{\triangle}X=-J J+H△X=0→H△X=−J
求解这个方程就得到了增量,该方法又称为==”牛顿法“ ==
(3)最速下降法和牛顿法的缺点
-
最速下降法:
过于贪心,容易走出锯齿路线,反而增加了迭代次数
-
牛顿法
需要计算目标函数的H矩阵,在问题规模比较大时,非常困难,尽量避免H的计算。
对于一般的问题,一些拟牛顿法可以得到较好的结果
2:高斯牛顿法
高斯牛顿法是最优化算法中最简单的方法之一。
它的思想:将 f ( x ) f(x) f(x)进行一阶项的泰勒展开 (注意这里不是目标函数 F ( x ) F(x) F(x),而是 f ( x ) f(x) f(x),否则就是牛顿法了)
f ( x + △ x ) ≈ f ( x ) + J ( x ) T △ x (1) f(x+{\triangle}x){\approx}f(x)+J(x)^T{\triangle}x \tag{1} f(x+△x)≈f(x)+J(x)T△x(1)
- J ( x ) T J(x)^T J(x)T为 f ( x ) f(x) f(x)关于 x x x的导数,为nx1的向量
根据前面的框架,当前的目标是寻找 △ x {\triangle}x △x,使得 ∣ ∣ f ( x + △ x ) ∣ ∣ 2 ||f(x+{\triangle}x)||^2 ∣∣f(x+△x)∣∣2达到最小
为了求
△
x
{\triangle}x
△x,需要一个线性最小二乘问题:
△
x
∗
=
a
r
g
m
i
n
1
2
∣
∣
f
(
x
)
+
J
(
x
)
T
△
x
∣
∣
{\triangle}x^*=argmin\frac{1}{2}||f(x)+J(x)^T{\triangle}x||
△x∗=argmin21∣∣f(x)+J(x)T△x∣∣
这个方程与之前的有什么不同吗?先展开目标函数的平方项:
1
2
∣
∣
f
(
x
)
+
J
(
x
)
T
△
x
∣
∣
2
=
1
2
(
f
(
x
)
+
J
(
x
)
T
△
x
)
T
(
f
(
x
)
+
J
(
x
)
T
△
x
)
=
1
2
(
∣
∣
f
(
x
)
∣
∣
2
2
+
2
f
(
x
)
J
(
x
)
T
△
x
+
△
x
T
J
(
x
)
J
(
x
)
T
△
x
)
\frac{1}{2}||f(x)+J(x)^T{\triangle}x||^2=\frac{1}{2}(f(x)+J(x)^T{\triangle}x)^T(f(x)+J(x)^T{\triangle}x)=\frac{1}{2}(||f(x)||^2_2+2f(x)J(x)^T{\triangle}x+{\triangle}x^TJ(x)J(x)^T{\triangle}x)
21∣∣f(x)+J(x)T△x∣∣2=21(f(x)+J(x)T△x)T(f(x)+J(x)T△x)=21(∣∣f(x)∣∣22+2f(x)J(x)T△x+△xTJ(x)J(x)T△x)
求上式关于 △ x {\triangle}x △x的导数,并令其等于零:
J ( x ) f ( x ) + J ( x ) J ( x ) T △ x = 0 J(x)f(x)+J(x)J(x)^T{\triangle}x=0 J(x)f(x)+J(x)J(x)T△x=0
-
令 J ( x ) J ( x ) T = H ( x ) J(x)J(x)^T=H(x) J(x)J(x)T=H(x), − J ( x ) f ( x ) = g ( x ) -J(x)f(x)=g(x) −J(x)f(x)=g(x),则上式可以改写为:
H △ x = g H{\triangle}x=g H△x=g
这个方程式关于变量 △ x {\triangle}x △x的线性方程,我们称之为增量方程,也可称为高斯牛顿方程或正规方程
高斯牛顿法将 J J T JJ^T JJT作为牛顿法中二阶矩阵H的近似,从而省略了计算H的过程
高斯牛顿的算法步骤:
1:给定初始值x_0
2:对于第k次迭代,求出当前的雅可比矩阵J(x_k)和误差f(x_k)
3:求解增量方程:H*delta(x_k)=g
4:若delta(x_k)足够小,则停止。否则,令x_k+1=x_k+delta(x_k),返回第二步
从算法步骤中可以看出,增量方程的求解占据着主要地位。只要我们能够正确解出增量,就能保证目标函数能够正确的下降
为了求解增量方程,我们需要求解 H − 1 H^{-1} H−1,这需要 H H H矩阵可逆,但实际的矩阵 J J T JJ^T JJT只有半正定性。
- 即使用高斯牛顿法时候,可能 J J T JJ^T JJT为奇异矩阵或者病态矩阵的情况,此时增量的稳定性较差,导致算法不收敛。直观来说,原函数在这个点的1局部近似不像一个二次函数。
- 更严重的是,假设 H H H非奇异也非病态,如果我们求解出来的步长 △ x {\triangle}x △x太大,也会导致我们采用的局部近似式($f(x+{\triangle}x){\approx}f(x)+J(x)^T{\triangle}x $)不够准确,这样一来我们甚至无法保证它的迭代收敛,甚至有可能让目标函数更大都是有可能的
列文伯格–马夸尔特方法在一定程度上修正了这些问题。一般认为它比高斯牛顿法更健壮,但它的收敛速度可能比高斯牛顿法更慢,被称为“阻尼牛顿法”
3:列文伯格–马夸尔特方法
高斯牛顿法中采用的近似二阶泰勒展开只能在展开点附近有较好的近似效果,所以我们很自信想到应该给 △ x {\triangle}x △x添加一个范围,称为信赖区域。在这个范围内,二阶近似是有效的,离开这个区域,近似可能会出问题,这类方法也称为“信赖区域方法”
如何确认这个信赖区域的范围呢?
如果近似模型与实际函数之间的差异越小,近似效果越好,应该扩大近似的范围;反之差异越大,近似效果越差,应该缩小近似的范围
定义一个指标来刻画近似的好坏程度:
p = f ( x + △ x ) − f ( x ) J ( x ) T △ x (6.34) p=\frac{f(x+{\triangle}x)-f(x)}{J(x)^T{\triangle}x} \tag{6.34} p=J(x)T△xf(x+△x)−f(x)(6.34)
- 分母 J ( x ) T △ x J(x)^T{\triangle}x J(x)T△x是实际下降的值
- 分子 f ( x + △ x ) − f ( x ) f(x+{\triangle}x)-f(x) f(x+△x)−f(x)是近似模型下降的值
根据 p p p的值
- p p p接近1,则近似是好的
- p p p太小,说明实际减小的值远小于近似减小的值,则认为近似比较差,需要缩小近似范围
- p p p太大,说明实际下降的值远大于近似减小的值,则需要扩大近似范围
构建一个改良版高斯牛顿法框架:
1:给定初始值x_0,以及初始优化半径u
2:对于第k次迭代,在高斯牛顿法的基础上加上信赖区域,求解min(1/2)*||f(x_k)+J(x_k)^T*delta(x)||^2,限制条件为:||D*delta(x)||^2<=u
其中u是信赖区域的半径,D是系数矩阵
3:根据式6.34计算p
4:若p>3/4,则设置u=2u
若p<1/4,则设置u=0.5u
5:如果p大于某阈值,则认为近似可行。令x_k+1=x_k+delta(x_k)
6:判断算法是否收敛。如果不收敛则返回第二步,否则结束
这里近似范围扩大的倍数和阈值都是经验值,可以替换成别的值。
可以将上述带有约束的优化问题,我们用拉格朗日乘子把约束项放入到目标函数中,构造拉格朗日函数:
L ( △ x , λ ) = 1 2 ∣ ∣ f ( x k ) + J ( x k ) T △ x ∣ ∣ 2 + λ 2 ( ∣ ∣ D △ x k ∣ ∣ 2 − u ) L({\triangle}x,\lambda)=\frac{1}{2}||f(x_k)+J(x_k)^T{\triangle}x||^2+\frac{\lambda}{2}(||D{\triangle}x_k||^2-u) L(△x,λ)=21∣∣f(xk)+J(xk)T△x∣∣2+2λ(∣∣D△xk∣∣2−u)
其中 λ \lambda λ为拉格朗日乘子,类似高斯牛顿方法,令该拉格朗日函数关于 △ x {\triangle}x △x的导数为零,它的核心仍是计算增量的线性方程:
( H + λ D T D ) △ x k = g (H+{\lambda}D^TD){\triangle}x_k=g (H+λDTD)△xk=g
相比高斯牛顿法,该办法多一项: λ D T D {\lambda}D^TD λDTD,考虑简单形式D=I的情况:
( H + λ I ) △ x k = g (H+{\lambda}I){\triangle}x_k=g (H+λI)△xk=g
- 当参数 λ \lambda λ比较小时,H占主要地位,说明二次近似模型在该范围内是比较好的
- 当参数 λ \lambda λ比较大时, λ I {\lambda}I λI占主要地位,列文伯格–马夸尔特方法更接近于一阶梯度下降法(即最速下降法),说明附近二次近似不够好
列文伯格–马夸尔特方法的求解方式,可在一定程度上避免线性方程组的系数矩阵的奇异和病态问题,提供更稳定,更准确的增量 △ x {\triangle}x △x