https://www.yuque.com/docs/share/61fb4428-e631-4b96-b531-b3b09cdb1a44?# 《【系统】透彻理解SLAM中的非线性优化问题-理论》
A:SLAM问题实质上是一个由各种观测估计传感器运动(位姿)的状态估计(后验估计)问题。换个说法就是,在传感器观测数据构建的约束中,寻找一个传感器的最优位姿估计。在这个大问题下,不同的传感器有不同的观测模型,有不同的约束构建方法,但最后都是通过观测数据去求位姿这样一个过程。求解的方法有基于优化的,基于滤波的方法。对于基于优化的方法来说,一般的SLAM系统都是非线性的,而非线性最小二乘法就是非线性优化问题的一个求解方法,也是现在SLAM系统中采用比较多的方法。基于滤波的方法,滤波是用于估计当前的状态,如果我们之前的数据出现错误,是没有办法进行修正的,所以这个方法的整体效果并不是特别好。
定义如下形式为最小二乘法的表示:
上式中,x为状态量,f(x)为关于x的残差函数,我们的目的是找到合适的x*使得F(x*)最小;
现在有两种情况:
第二种情况,显然是SLAM系统更关心的问题,也是本文的重点。
也就是说,我们要利用迭代法来求解我们构建的非线性最小二乘问题。
迭代法,就是从一个初始值出发,通过不断的更新当前的优化变量,使目标函数不断下降,达到一定阈值的时候,可以用当前的优化变量大小近似代替最优的变量值,这样就问题从对F(x)求导,转换到了不断寻找dx使得F(x+dx) < F(x)这样一个过程了
迭代法的步骤:
根据上面的步骤,我们能看出,迭代法的几个关键核心问题:
对于第一个问题,不同的问题有不同的解决方法,会有一些估计值作为初始值,一些算法对初始值比敏感,SLAM算法的配准时,就涉及到初始值的问题,目前还未过于关注,后面补充.
第三个问题解决的方法主要有判断dx大小,和dF两种
第二个问题便是众多不同方法的最主要的区别,就是\Delta{}x该如何获得,下面就来说一下不同的方法.
Q:那这样的处理是否就不用对F(x)求导了呢?
A:并不是,还是需要求导,只不过不再关系F(x)的全局性质
1.1中说来优化变量的更新方程是x_{k+1}=x_k + \Delta{x_k},实际上,一些算法还会给求得的\Delta{}x乘上一个步长\alpha
,用来更加灵活的控制每次的增量大小.同时也有一些选择\alpha
的方法,这里说一个line-search的方法,
*line-search:
前提:\Delta{}x已经确定
F(x+\alpha*d) \approx F(x) +\alpha{}Jd-----(一阶泰勒展开)
使
F(x+\alpha{d}) < F(x)
=>
\alpha{}Jd<0=>Jd<0
后面的各种方法也都是最速下降法的一种改良,其核心思想没变,这里重点讲一下最速下降法,后面的主要说改良的地方.
前面提到过,求解\frac{dF}{dx}=0问题时,需要知道F(x)的全局性质,这一般不可行,所以我们换种思路,在x附近利用泰勒展开,将F(x)表示为如下的形式:
上式J为F(x)关于其变量x的一阶导数,即雅可比矩阵,也叫梯度,H为二阶导数海塞矩阵.
换种方式表达,可能更好理解:
l(\Delta{x})=||f(x_k)||_2^2+J(x_k)\Delta{x}+\frac{1}{2}\Delta{x}^TH(x_k)\Delta{x}
即上面的雅可比与海塞矩阵在某一次迭代过程中为常数,优化函数变成了关于\Delta{}x线性函数(只保留一阶项时),或者二次函数(保留二阶项时),这也是我们为什么要使用泰勒展开的原因:
我们通过泰勒展开将目标函数在当前x附近拟合成线性或者二次函数,方便我们求得\Delta{}x.
取增量为反向的梯度即可保证函数下降:
类似于二次函数求极小值,对l(dx)关于dx求导并令其等于0,可以得到:
求解上面的方程就得到了增量
再说GN之前,再明确一下符号含义:
\min \limits_{x}F(x) = \frac{1}{2}||f(x)||^2
F(x)表示待优化的目标函数,f(x)表示残差函数,一二阶梯度法是对F(x)进行泰勒展开,而高斯牛顿的核心思想是对f(x)进行泰勒展开:
此时,我们的优化问题变为了寻找下降矢量 ∆x,使得||f (x + ∆x)∥^2 达到最小:
而:
上式右侧为关于dx的二次函数,又转换成了求二次函数极小值的问题,只需要对上述函数关于dx求导并令其等于0,可得:
即:
解方程可得增量,对比于牛顿法,GN使用f(x)的J^TJ近似替代了牛顿法中F(x)的H
牛顿法的增量方程为:
\Delta{x}=\argmin \limits_{\Delta{x}}(F(x)+J\Delta{x}+\frac{1}{2}\Delta{x}^TH\Delta{x})
阻尼牛顿法的改进是在,待优化函数后面加一个惩罚项:
\Delta{x}=\argmin \limits_{\Delta{x}}(F(x)+J\Delta{x}+\frac{1}{2}\Delta{x}^TH\Delta{x})+\frac{1}{2}\mu\Delta{x}^T\Delta{x}) ---(\mu>=0)
对上式右侧关于dx求导,并令其为0,有:
J+H\Delta{x}+\mu\Delta{x}=0\\
\\
(H+\mu I)\Delta{x}=-J
阻尼因子\mu可以根据dx的值进行调整,他有比较多的好处,在下节讲.
类似于阻尼牛顿法,LM可以看作是阻尼高斯牛顿法下面直接给出LM方法的增量方程:
(J^TJ+\mu I)\Delta{x} = -J^Tf(x_k)
那这个阻尼因子有什么好处呢?
也就是说,除了保证正定外,通过调节阻尼因子可以在不同的阶段分别利用不同方法的优点,保证算法的效率和收敛
那么如何调节阻尼因子呢?
方法 |
增量方程H\Delta{x}=g |
优点 |
缺点 |
最速下降法 |
\Delta{x}^*=-J(x_k) |
计算简单 |
容易震荡导致收敛慢 |
牛顿法 |
H(x_k)\Delta{x}^*=-J(x_k) |
拟合更加准确 |
H的计算比较困难 |
高斯牛顿法 |
J(x_k)J^T(x_k)\Delta{x}^*=-J(x_k)f(x_k) |
不用计算H |
JTJ可能半正定,导致病态 |
L-M |
(JJ^T+\mu I)\Delta{x}^*=-J(x_k)f(x_k) |
动态调整阻尼,拥有上面的优点 |
表达形式复杂 |