这节我们来说一说最近各种小伙伴们最常问到的两个问题:

「如果我的数据的输入是多维的,我改如何选择应用高斯过程模型呢?「

「我需要考虑做两个相关变数的整体预测,我应该如何使用高斯过程模型呢?「

首先,让我们来明确一下概念,以保证大家说的是同一回事哦!

输入(input)和输出(output):这个概念相信大多数小伙伴还是知道的吧,所谓输入就好比一个机器,你打算扔点什么东西进去,所谓输出就是你希望它可以吐出来点什么。

多维输入:这里有不少同义词,比如multi-input,multiple-input, multi-dimensional input等等,这些词语描述的都是一种input,也就是每一个输入点有多个属性(当然也包括多个量被考虑成为多个属性的情况)。

「好抽象呀!!!「

好吧,举个例子来说吧,如果我们用今天的上证指数去推断预测明天的中石化的收盘价,那么这里上证指数就是刚才说的输入,中石化的收盘价就是输出,由于这里只有上证指数一个输入,所以这里就是单数输入的模型,同理这也是单一输出的模型,因为只有中石化一个公司。还是刚才那个例子,如果我们用上证指数和上证成交量一起去推断预测明天的中石化收盘价,那么这就是多输入了啦,因为我们用到了前一天的成交信息,这个里的成交信息包括连个属性量,一个是指数,一个是成交量。

多维输出:当然这里更多的同义词,比如multi-output,multiple-output,multiple task, dependent output, correlated output. 所谓多维输出就是指最后我们的目标量有多个。

这里或许你会有疑问,目标量有多个的话,我们就不能一个一个考虑么?

即用所谓的输入,得到一个输出,然后在用一摸一样的输入,再建模得到另一个输出,这样不可以么?

可以呀,当然可以,只不过如此操作默认了一个事实:

「各个输出之间的是不相关的!「

这也就是解释了为什么多维输出的情况的又被经常称作是dependent output, correlated output,因为这些模型是直接考虑多输出的,即考虑其中的各个输出之间的相关性的。

如果我们试图用上证指数去一起推断预测,中石化和中石油两个股票的收盘情况,那么这个就是多输出的模型,也就是说需要考虑中石化和中石油之间相对较高的相关性。

好啦,稍稍解释完这些之后,我们来说说多输入和多输出的高斯过程吧。

事实上,对于多输入的情况,高斯过程本身就是支持的哦,回忆一下我们之前有关高斯过程这个随机过程的定义:高斯过程可以由一个mean function和一个kernel所确定

蓦风星吟:什么是Gaussian process? —— 说说高斯过程与高斯分布的关系?

zhuanlan.zhihu.com
图标

数学化之后就是下面这个定理:

这里其实只是要求了mean function和kernel定义在S上,可没有说这个S是什么哦!所以S可以是一维实数,当然也可以n维的实空间哦!反倒是这个输出,可以明显看到mean和kernel的值域都是R(实数,一维的实数空间),因此经典的高斯过程模型的输出必然只能是单输出的哦!

结论:经典的高斯过程理论天然的可以解决多输入的问题,但是无法解决多输出的问题!!!

结论:经典的高斯过程理论天然的可以解决多输入的问题,但是无法解决多输出的问题!!!

结论:经典的高斯过程理论天然的可以解决多输入的问题,但是无法解决多输出的问题!!!

重要的结论说三遍!!!

「Okay,既然你说GP可以解决这个多输入的,可到底是如何解决的呢?」

嗯,这是不错的问题!如果了解这个问题的核心,就需要观察一个这个输入究竟是与谁有关的呢?根据定义,这个输入空间将会印象到的mean和kernel,不过一般mean设置为零,所以重中之重就是kernel了哈,所以来让我们来看看这个kernel。以Squared Exponential (SE)为例(采用GPML书中的表述),

k_{SE}(x, x) = s_f^2 exp(- frac{|  x - x  |^2}{2ell^2}) (1)

之前讨论过的哦,Gaussian process 的重要组成部分——关于那个被广泛应用的Kernel的零零总总,kernel中有至关重要的一部就是距离的刻画,或者说kernel其实就是基于距离的一个量,那么自然距离的定义将直接影响到这个kernel的结果。

若是一维情况,此处的距离计算方式是就是两个数字的相减然后平方,这个毫无疑问。但如果这里的x是多维情况呢,即现在x与x』是一个向量,我们该如何办呢?

当然就是把绝对值放到更高的角度来看啦,这就是范数!至于什么范数,这个只有直接wiki一下了哈,见Norm (mathematics)。所以现在这个kernel的定义该是

k_{SE}(x, x) = s_f^2 exp(- frac{ | x - x |^2}{2ell^2}) (2)

如果点了链接后的小伙伴可能还有疑问,那这个范数也有很多种, 比如0范数,1范数,2范数

事实上,这里可以采取的方法有很多,比如L1范数(又叫Taxicab norm or Manhattan norm),比如L2范数(Euclidean norm ),当然更一般的还可以是p-范数。理论上呢这些都可以成为选择, 但是实际操作中,还是以最为常见的欧式距离为主,所以一般的高斯过程中采取的也是这种欧式距离的定义哦!

当然很多情况下,公式(2)也会以下几个不同的面具

k_{SE}(x, x) =  s_f^2 exp(- frac{1}{2ell^2} sum_{i=1}^n (x_i - x_i)^2) (3)

k_{SE}(x, x) =  s_f^2 exp(- frac{1}{2ell^2} (x  -x)^{T}(x - x)) = s_f^2 exp(- frac{1}{2} (x  -x)^{T} P ^{-1}(x - x)) (4)

其中公式(3)里面的 x_i, x_i 是对应的输入的向量的各个分量,也就是说公式(3)是分量的表示方法。而公式(4)也即是对应的向量表示方法,其中这个P是个对角矩阵,而且这里对角线元素都是 ell^2

再回忆一下,Gaussian process 的重要组成部分——关于那个被广泛应用的Kernel的零零总总 这篇文章中我们提到了这里面的参数ell^2所具有的特殊意义哦!记不记得?

对,人家的名字叫做lengthscale哦!

所以依照公式(3)(4)的定义,我们可以看到这些定义方式中都肯定了一点,即

对于多维的输入,每一个分维度上的lengthscale都是一样!

这就样的定义方式就是GPML书和gpml toolbox中说到的isotropic distance measure。不过显然这样的定义方式让很多聪明的小伙伴无法全盘接受接受。为什么呢?

「你说多维是指一个输入变数具有多个不同的属性,为什么这些属性只能共用一个lengthscale呀!这个在很多情况下不合理呀!」

的确,isotropic的方式在很多情况都有局限性,当然如果输入的维度特别大的话,这样的处理唯一的好处就是计算速度快,因为这将原先许多个lengthscale考虑为了一个!

针对这个具体问题,GPML书中也提到了automatic relevance determination (ARD)的方式,即

k_{SE}(x, x) =  s_f^2 exp(- frac{1}{2} sum_{i=1}^n frac{(x_i - x_i)^2}{ell_i^2}) (5)

k_{SE}(x, x) =  s_f^2 exp(- frac{1}{2} (x  -x)^{T} P ^{-1}(x - x)) (6)

这里同样(5)是分量表示法而(6)是向量表示法,只不过此时的(6)中P是一个对角线元素并不相同的对角矩阵,即对角元素为 ell^2_i 。这里ell^2_i就是对应不同维度上分量的lengthscale。

或许聪明的你又会问,如此操作一顿后,虽然看上去的确漂亮了不少,可到底有什么意义呢?

当然,这里的意义就是在于目前机器学习中非常重要的一点,feature selection, 也是一些神经网路方法中想要努力处理的一点。那么这个ARD方法如何就做到了所谓的特征选择了呢?

在之前的文章Gaussian process 的重要组成部分——关于那个被广泛应用的Kernel的零零总总,我们实验中可以看到,如果这个lengthscale越大,sample的曲线越平坦,可以试想一下,如果这个lengthscale足够大,那么sample曲线将会变成一条平的直线,也就是说此时,该输入分量的变动并不会改变kernel,从某种意义上可以说,此时kernel是独立于该分量的,即删除了该分量也无所谓哦!

因而,ARD的kernel的引入使得高斯过程模型自然自带feature selection的能力,这就是GP相对于其他机器学习模型的有优势之一!

当然说了那么多,或许许多小伙伴更关注的或许是如何实现吧!其实既然多输入是GP天然自然的属性,那么实现肯定不是问题呀!比如经典的gpml toolbox中都是妥妥的好工具,而且本文上述的描述都是妥妥的遵守gpml包中的描述方式的哦!

比如:gpml包中的isotropic核都在cov文件夹下面,并且以iso结尾(当然意思是不算".m"这样的后缀名)。同样的如果是ard的核的话,那么都是以ard结尾的哦。

这里要敲黑板的是

超参数的个数!!!

许多小伙伴发信息来说:「哎呀,我的代码出问题了,问题在哪里呀?」

其实很多的问题就在于你的超数数给的个数不对,无论iso还是ard都需要在设置的时候回到cov文件夹下面找到对应的文件,查看确认是一下总共需要几个超参数,尤其是对以多维的输入的情况,记得数数能力要过关哦!

至于如果是自己写的实现方式的话,个人感觉也不太需要我这里说什么了吧,毕竟打算自己写了,对这里的认识和了解也该是不比偶少了哈。这里放上我们组的一点点折腾起来的小米加步枪(基于python下的TensorFlow)

predictive-analytics-lab/UniversalGP?

github.com
图标

总的来说,其实多维的输入真的不是什么大问题,好好看书,仔细些代码,运行gpml基本没有问题哦(当然初始超参数的选择这里还是有不少的门门道道的,这个之后再细说哦,如[6])

说完了多维的输入,我们再来简单说说多维的输出。

由于多维输出并不是GP天然可以做到的事情,因而其中的实现就需要运用目前暂时无法详细描述的方法,如果有兴趣的小伙伴可以先直接去看对应的paper哦!这里就简单说说基本架构吧 (不是很明白的小伙伴也有两个选择,第一去看对应的paper,第二,直接忽略叙述,直接去找给出的代码包)

第一步:所有training output构成矩阵后(因为每一个点是一个向量,所以堆叠后所有training可以构成矩阵)向量化,当然也可以说直接就把每个点直接堆叠构成一个更长的向量。只不过这个一个更长的向量的可以分为d段,每一段对应这一个output。

第二部:核函数重构,即采取kronecker product的方式将核函数与output相关性矩阵结合,构造一个新的大的covariance matrix。

第三部:首先回归或是分类

这里可以参考的文献有[2][3][4][5],都有比较详细的介绍。

最近经常有人问到这个多输出的GP如何实现呢?

当然,最好的办法自然是好好看paper,然后自己去实现,不过更多小伙伴还是想著直接调包啦!

这里主要还是之前【番外篇】Gaussian process for machine learning实战学习资料推荐整理中推荐的Sheffield Machine Learning Software (ML@SITraN)中的一些内容,

比如基于Matlab的SheffieldML/multigp,基于Python的GPy(以前记得没有的哈,不过最近在其中发现了gp_multiout_regression.py, 因而想必也是可以多维输出的哦!由于写著是回归,想必应该也是只能做多维输出的回归吧!), 另外理论上基于GPy的GPflow应该也是可以的哈!不过没有亲测哦!

另外就是最近有小伙伴推荐的一个MTGP - A multi-task Gaussian Process Toolbox,同样也木有用过,不过看上去还不错呢,至少功能明确。

除此之外,根据一些矩阵代数的内容,偶也自己写个toolbox,功能明确,不过还处于试验阶段,文章在[6],代码在

Magica-Chen/gptp_multi_output?

github.com
图标

不过目前功能还不是很完善,有关于初始超参仍有一些问题,外加局限于回归以及还没有实现加入一些对于大dataset的加速的方法。不过打算近期抽时间调整一下框架然后逐渐加入一些内容,欢迎各位大牛小伙伴们多多指正, 熟悉github的小伙伴也可以直接动手!轻踩哦!

Reference

[1] Rasmussen, Carl Edward, and Christopher KI Williams.Gaussian process for machine learning. MIT press, 2006.

[2] Bonilla, Edwin V., Kian M. Chai, and Christopher Williams. "Multi-task Gaussian process prediction."Advances in neural information processing systems. 2008.

[3] Boyle, Phillip, and Marcus Frean. "Dependent gaussian processes."Advances in neural information processing systems. 2005.

[4] Alvarez, Mauricio A., Lorenzo Rosasco, and Neil D. Lawrence. "Kernels for vector-valued functions: A review."Foundations and Trends? in Machine Learning4.3 (2012): 195-266.

[5] Wang, Bo, and Tao Chen. "Gaussian process regression with multiple response variables."Chemometrics and Intelligent Laboratory Systems142 (2015): 159-165.

[6] Chen, Zexun, and Bo Wang. "How priors of initial hyperparameters affect Gaussian process regression models."Neurocomputing275 (2018): 1702-1710.


推荐阅读:
相关文章