高斯过程简析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/heyijia0327/article/details/88640241

前言

SLAM 方向对 Gaussian Process (GP)的需求不大,但这两年有好几篇 IROS,ICRA 的论文用高斯过程来拟合轨迹,拟合误差模型等,因此这篇笔记对高斯过程概念和原理进行简单梳理,理清楚 GP 是怎么来的,以及怎么用它。如果想更进一步系统学习下,推荐 MIT 出版的 Gaussian Processes for Machine Learning.

高斯过程是什么

高斯过程可以通俗的认为是函数拟合或回归近似,即给出变量 x\boldsymbol{x}, 能预测出 f(x)f(\boldsymbol{x})。高斯分布是针对向量 x\boldsymbol{x} ,高斯过程则是对函数 f(x)f(\boldsymbol{x})。更学术一点的描述,高斯过程认为是一个服从均值是函数 m(x)m(\boldsymbol{x}),方差也是函数 k(x,x)k\left(\boldsymbol{x}, \boldsymbol{x}^{\prime}\right) 的高斯分布 ,其中对任意变量 x,x\boldsymbol{x}, \boldsymbol{x}^{\prime}m(x)=E[f(x)] , k(x,x)=Cov(f(x),f(x))m(\boldsymbol{x})=\mathbb{E}[f(\boldsymbol{x})] \text { , } k\left(\boldsymbol{x}, \boldsymbol{x}^{\prime}\right)=\operatorname{Cov}\left(f(\boldsymbol{x}), f\left(x^{\prime}\right)\right)

举个简单的例子,一个函数 f()f(\cdot) 的任意有限子集 f(x1),,f(xn)f\left(\boldsymbol{x}_{1}\right), \ldots, f\left(\boldsymbol{x}_{n}\right) 服从多元高斯分布,则称 f()f(\cdot) 是一个高斯过程,其中输入 {xn}n=1N\left\{\boldsymbol{x}_{n}\right\}_{n=1}^{N} 是任意维的向量。比如,{xn}n=1365\left\{\boldsymbol{x}_{n}\right\}_{n=1}^{365} 表示 365 天,f(xn)f\left(\boldsymbol{x}_{n}\right) 表示某天的温度。

对于 N 组 D 维的输入数据 XRN×D\boldsymbol{X} \in \mathbb{R}^{N \times D},每一行表示一个输入(如24个小时时间点),协方差矩阵写为:
KXX=(k(x1,x1)k(x1,xN)k(xN,x1)k(xN,xN)) \boldsymbol{K}_{\boldsymbol{X X}}=\left( \begin{array}{ccc}{k\left(\boldsymbol{x}_{1}, \boldsymbol{x}_{1}\right)} & {\cdots} & {k\left(\boldsymbol{x}_{1}, \boldsymbol{x}_{N}\right)} \\ {\vdots} & {\ddots} & {\vdots} \\ {k\left(\boldsymbol{x}_{N}, \boldsymbol{x}_{1}\right)} & {\cdots} & {k\left(\boldsymbol{x}_{N}, \boldsymbol{x}_{N}\right)}\end{array}\right)
k(x,x)k\left(\boldsymbol{x}, \boldsymbol{x}^{\prime}\right) 为核函数,通常只要求这个核函数是正定函数,好让 KXX\boldsymbol{K}_{\boldsymbol{X X}} 符合协方差矩阵的性质。比如对于服从零均值的 1 维变量 {xn}\left\{x_{n}\right\} ,通常会用如下的核函数 (rational quadratic covariance function, RQ):
k(x,x)=h2(1+(xx)22αl2)α k\left(x, x^{\prime}\right)=h^{2}\left(1+\frac{\left(x-x^{\prime}\right)^{2}}{2 \alpha l^{2}}\right)^{-\alpha}
其中 h,α,lh,\alpha, l 为正实数,我们称之为超参数,需要通过数据来训练得到。

**所以,给定一堆已有数据,怎么预测其他数据呢?**对于给定的输入 XRN×D\boldsymbol{X} \in \mathbb{R}^{N \times D} 以及对应的输出 fRn\boldsymbol{f} \in \mathbb{R}^{n}, 当给定新的数据 X\boldsymbol{X}_{*} 时,我们要能预测出对应的 f\boldsymbol{f}_{*}. 将训练集和测试集联合起来,得到多元高斯分布:
(ff)N((mXmX),(KXXKXXKXXKXX)) \left( \begin{array}{c}{\boldsymbol{f}} \\ {\boldsymbol{f}_{*}}\end{array}\right) \sim \mathcal{N}\left(\left( \begin{array}{c}{\boldsymbol{m}_{\boldsymbol{X}}} \\ {\boldsymbol{m}_{\boldsymbol{X}_{*}}}\end{array}\right), \left( \begin{array}{c}{\boldsymbol{K}_{\boldsymbol{X X}} \quad \boldsymbol{K}_{\boldsymbol{X}\boldsymbol{X}_{*}}} \\ {\boldsymbol{K}_{\boldsymbol{X}_{*}\boldsymbol{X}} \quad \boldsymbol{K}_{\boldsymbol{X}_{*}\boldsymbol{X}_{*}}}\end{array}\right)\right)
对于熟悉 SLAM 的同学来说,要从这个分布中计算出 f\boldsymbol{f}_{*}, 采用舒尔补就行。从联合分布中计算 f\boldsymbol{f}_{*}, 也就是算条件概率:
p(fX,X,f)=N(mX+KXXKXX1(fmX),KXXKXXKXX1KXX) p\left(\boldsymbol{f}_{*} | \boldsymbol{X}_{*}, \boldsymbol{X}, \boldsymbol{f}\right)=\mathcal{N}\left(\boldsymbol{m}_{\boldsymbol{X}_{*}}+\boldsymbol{K}_{\boldsymbol{X}_{*} \boldsymbol{X}} \boldsymbol{K}_{\boldsymbol{X} \boldsymbol{X}}^{-1}\left(\boldsymbol{f}-\boldsymbol{m}_{\boldsymbol{X}}\right), \boldsymbol{K}_{\boldsymbol{X}_{*} \boldsymbol{X}_{*}}-\boldsymbol{K}_{\boldsymbol{X}_{*} \boldsymbol{X}} \boldsymbol{K}_{\boldsymbol{X} \boldsymbol{X}}^{-1} \boldsymbol{K}_{\boldsymbol{X}\boldsymbol{X}_{*}}\right)
对于不熟悉高斯分布这个操作的,可以参考这个回答。假设你已从训练数据中,得到了超参数,那就能用上述公司得到预测函数的分布,从而对于给定的 X\boldsymbol{X}_{*}, 采样出 f\boldsymbol{f}_{*}.

需要注意的是,训练的时候我们是用有噪声的数据 yn=f(xn)+ϵny_{n}=f\left(\boldsymbol{x}_{n}\right)+\epsilon_{n} 来作为观测模型,其中 ϵnN(0,σϵ2)\epsilon_{n} \sim \mathcal{N}\left(0, \sigma_{\epsilon}^{2}\right)。而之前的核函数并没有假设这个噪声,因此可以将这个噪声加到协方差 KXX\boldsymbol{K}_{\boldsymbol{X X}} 的对角元素上。

高斯过程怎么训练

有了上述铺垫,训练其实就是最小二乘拟合那些超参数了。如有如下高斯过程,
fGP(m,k)m(x)=ax2+bx+c, and k(x,x)=σy2exp((xx)222)+σϵ2δii \begin{aligned} f & \sim \mathcal{G P}(m, k) \\ m(x) &=a x^{2}+b x+c, \quad \text { and } \quad k\left(x, x^{\prime}\right)=\sigma_{y}^{2} \exp \left(-\frac{\left(x-x^{\prime}\right)^{2}}{2 \ell^{2}}\right)+\sigma_{\epsilon}^{2} \delta_{i i^{\prime}} \end{aligned}
其中,超参数为 θ={a,b,c,σy,σn,}\theta=\left\{a, b, c, \sigma_{y}, \sigma_{n}, \ell\right\},对于训练集,可以最大化似然概率:
L=logp(yx,θ)=12logK12(ym)K1(ym)n2log(2π) L=\log p(\mathbf{y} | \mathbf{x}, \theta)=-\frac{1}{2} \log |K|-\frac{1}{2}(\mathbf{y}-\boldsymbol{m})^{\top} K^{-1}(\mathbf{y}-\boldsymbol{m})-\frac{n}{2} \log (2 \pi)
然后使用高斯牛顿或者共而梯度法求解就行,只是其中涉及到求偏导数:
Lθm=(ym)Σ1mθmLθk=12trace(K1Kθk)+12(ym)KθkK1Kθk(ym) \begin{aligned} \frac{\partial L}{\partial \theta_{m}} &=-(\mathbf{y}-\boldsymbol{m})^{\top} \Sigma^{-1} \frac{\partial m}{\partial \theta_{m}} \\ \frac{\partial L}{\partial \theta_{k}} &=\frac{1}{2} \operatorname{trace}\left(K^{-1} \frac{\partial K}{\partial \theta_{k}}\right)+\frac{1}{2}(\mathbf{y}-\boldsymbol{m})^{\top} \frac{\partial K}{\partial \theta_{k}} K^{-1} \frac{\partial K}{\partial \theta_{k}}(\mathbf{y}-\boldsymbol{m}) \end{aligned}
通常采用数值求导或者自动微分就可以了。

结语

主要是 17 年, 1GA9 年 ICRA 有两篇关于高斯过程学习里程计误差模型的论文,以及 GTSAM 那边 Jing Dong 也有几篇把高斯过程用在 SLAM 里的,所以才有了兴趣大致梳理下这个知识。

  1. 2019 ICRA, Learning Wheel Odometry and Imu Errors for Localization.
  2. 2017 ICRA,Gaussian Process Estimation of Odometry Errors for Localization and Mapping

这篇博客主要参考了:

  1. http://keyonvafa.com/gp-tutorial/
  2. https://www.cs.ubc.ca/~hutter/EARG.shtml/earg/papers05/rasmussen_gps_in_ml.pdf

没有更多推荐了,返回首页