【番外篇】Gaussian process for machine learning实战学习资料推荐整理

【番外篇】Gaussian process for machine learning实战学习资料推荐整理

本来想着一步步去科普讲解是这个Gaussian process for machine learning的,不过最近一直都有小伙伴私信问了一些具体的GP的问题,所以我就提前整理一下GP学习资料的推荐,方便已经学的差不多的小伙伴想想真正实现练手的愿望。当然,整个推荐都是面向迷茫的小白的哦,大神学霸们自然有自己的学习轨迹哦!

强调一下:这篇文章是为一些已经对GP有所了解并且打算用代码实践的小伙伴准备的哦!

  • 文献资料

首先肯定是书,说到书,目前为止最全最经典的著作一定是这本i) Carl Edward Rasmussen and Christopher K. I. Williams大神写的书《Gaussian process for machine learning》。这本书其实非常非常详细的介绍了整个GP的推导,衍生,使用和应用,理论详细,例子丰富,还有习题和推广,总之一句话:看完看懂这本书基本你就是专家了!

基于这本书的节点,若是你想要往前走,那么就有几个大神的文章不可避免,比如MacKay还有Neal,文章么,如:

Neal R M. Bayesian learning for neural networks[J]. 2012.

Neal R M. Monte Carlo implementation of Gaussian process models for Bayesian regression and classification[J]. arXiv preprint physics/9701026, 1997.

MacKay D J C. Introduction to Gaussian processes[J]. NATO ASI Series F Computer and Systems Sciences, 1998, 168: 133-166.

MacKay D J C. Gaussian processes-a replacement for supervised neural networks?[J]. 1997.

若是以那本书为节点往后,当然也有更多,不过个人感觉,最近最为practical的一个拓展就是A. G. Wilson的SM核的推出,这是一个相对传统核来讲的,特征抓取效果有着重大提升的kernel(当然,代价是超参数的个数会变多,速度会减慢)。

Wilson A G, Adams R P. Gaussian Process Kernels for Pattern Discovery and Extrapolation[J]. ICML (3), 2013: 1067-1075.

Wilson A G. Covariance kernels for fast automatic pattern discovery and extrapolation with Gaussian processes[J]. University of Cambridge, 2014.

另外,最近还发现有一个非常实用的lecture notes,超级通俗易懂的资料,关于Gaussian process regression的,来自一个法国人的 Nicolas Durrande。讲义在:


github.com/NicolasDurra

他,人比较nice哦,主要对kernel这块比较有研究哦,有具体的问题,可以发个邮件问问哦!什么?邮件地址,这个还需要问么?自己找!

哦,说到人比较nice的,还有就是Arno Solin,这个帅哥,他是芬兰的一个做高斯过程机器学习group的人哈(之后会讲个这个group的代码包),目前为止,唯一一个我看文章之后,发邮件还能给代码并与之讨论的,内牛满面啊。。。(大多数给大神的邮件都是石沉大海,要么就是说一堆自动回复的废话)

  • 代码包

其实大多数小伙伴并不会对理论有太大的兴趣,所以好用的代码包才是王道哦!下面来说说根据本人的一些经验推荐的一些GP中常用的代码包。

1. Documentation for GPML Matlab Code

毫无疑问,首先要推荐的这个肯定是应用最广的一个,也就是那本经典书的作者他们做的代码包,毕竟它是Carl他们组做的东西啊!关键关键它是matlab!内牛满面啊!

这个包的好处是有非常详尽的demo和comments,而且调用方式简单,mean, covariance,选择余地众多,倘若想要复合构造也相关简单易操作。likelihood和inference也是清晰方便选择。

目前这个toolbox已经升级到了4.0基本已经可以说是既强大又好用。

2. Matlab官方代码包Gaussian Process Regression

或许你或发现,强大的MATLAB在最新的版本中在Statistics and Machine Learning Toolbox中加入了不少的新内容,其中就包括这个我们说到的Gaussian process regression(其实在2016a中就已经加入,2016b中丰富了一些功能,比如hyperparameter的一些自优化)。当然作为商业软件的官方代码包,自然这个demo和comments是棒棒哒,而且,对于matlab这个本身速度相对其他不适很快的软件,运行自带的内容的速度提高是明显的,另外在inference方法是中,除了对了一般模型的exact的方法(就是利用高斯分布的性质直接用解析公式给出推断),还有几个一般toolbox不直接给出的Subset of Data Approximation, Subset of Regressors Approximation, Fully Independent Conditional Approximation, Block Coordinate Descent Approximation,这一些approximation的给出使得你的matlab代码会在速度上有很大的提高。

3. Sheffield Machine Learning Software (ML@SITraN)

这是University of Sheffield的machine learning group做的东西,之前去summer school了解到的,看上去内容非常多哦,而且设置好的不少,关键关键主要代码还是当今application中最为流行的python哦,虽然我并不太喜欢python,毕竟因为python需要解决太多跟程序本身没有关系的东西。

这个代码包中包含很多,有基础的GPy,还有一个专门用来做优化问题的GPyOpt,并且配合用Jupter notebook做的tutorial,细致而强大,另外这里还有一些Neil D. Lawrence(现在去了Amazon)他们团队以及他们的学生的一些特定问题的特定代码。


当然,最近他们也给出了一些基于matlab和R的代码包,没有试过,不过个人而言,matlab都有那么多那么好用的,何必还要。。。

另外Neil D. Lawrence早期还有一些基于C++的代码,SheffieldML/GPc,有兴趣也可以去看看。

4. GPstuff

这是一个芬兰的machine learning团队写的代码包,最新版本是4.7,也加入了贝叶斯优化问题的一些具体内容,主要代码是基于MATLAB的,当然也有基于R的。个人感觉内容不少,只是注释并不是十分充分,demo也一般。不过,不过重要的一点是这个代码包易于修改和推广!这点对于研究模型的小伙伴会非常有用。个人之前要从Gaussian process模型推广到T process模型中,修改gpml的toolbox死活就是容易出问题,但是这个包就好了很多,外加还可以相应的发邮件问到原创人员的,Arno Solin。这个代码包是基于他们之前的两个toolbox而发展来的: MCMCStuff-toolbox (1998-2006), Netlab-toolbox (1996-2001)。

文献在这里:Jarno Vanhatalo, Jaakko Riihimäki, Jouni Hartikainen, Pasi Jylänki, Ville Tolvanen, Aki Vehtari (2013). GPstuff: Bayesian Modeling with Gaussian Processes. Journal of Machine Learning Research, 14(Apr):1175-1179.

5. GPfitjstatsoft.org/article/v

这是个基于R的toolbox,唯一一个本人没有亲自用过的,不过这个似乎是我可以在网上找到的一个比较完善的一个R代码包。当然之前提到的Nicolas Durrande,他的github上也有一个Gaussian processes in TensorFlow via R,不过看着名字就知道是个中转啊!

最后再贴一个从gpml官网可以找到的其他包的合影!

  • 总结

总的来讲的话,若是你只需要应用成熟的GP模型去做一些东西的话,gpml和matlab自带的东西就足以满足你的要求!方便还快捷。若是你真的需要从根本上来改变模型的一些东西,那么无论哪一个toolbox都是你学习的例子,然后你需要做的就是用一个你熟悉的语言,写一个属于你的代码包哦!

对了,这里最后说的一点是,很多小伙伴关注的multi-output的regression,一般的toolbox都是没有,需要自己去写,当然若是你已经明白了理论的话,你也可以去看看Neil D. Lawrence的在这里写的包SheffieldML/multigp。虽然没有用过,但是这毕竟是我见到的唯一一个关于多维输出的问题有完整代码包的。

这里的代码包Neil Lawrence他们用的是经典方法,基于kronecker product构造新的covariance function来处理multi-output问题的方案。这种方法理解上可能有点难度,不过代码倒也不是很复杂。当然你也可以利用matrix alegbra的只是,一体化直接matrix处理之后的所有东西,不过在超参数优化中需要自己推导很多东西,这样的话,理解起来可能会方便很多,并且推导完公式后代码也会显得简单不少,有兴趣的小伙伴可以试一试。具体的方法在:[1703.04455] Multivariate Gaussian and Student$-t$ Process Regression for Multi-output Prediction中有一定的介绍。至于代码么,额,额,写的不是那么好看,暂时就不。。。如果有兴趣可以私信讨论讨论哈!

%-------2017/05/30 更新--------------------------------------------------------------------------------------------

如果不是十分巨大的数据量的话,这里还有一个可以凑合着用的MATLAB包,可以一般化的实现一维多维的输入输出的GPR,当然顺带还可以实现后面要讲的Student-t process regression (TPR)。代码在GitHub:Magica-Chen/gptp_multi_output

编辑于 2017-12-03 22:22