【摘 要】 GPflow 是一个以 TensorFlow 为核心计算,以 Python 为前端的高斯过程库。其设计特别强调软件测试,并且能够利用 GPU 硬件。

【原 文】 Matthews, Alexander G. de G., Mark van der Wilk, Tom Nickson, Keisuke Fujii, Alexis Boukouvalas, Pablo León-Villagrá, Zoubin Ghahramani, and James Hensman. “GPflow: A Gaussian Process Library Using TensorFlow,” 2016. https://doi.org/10.48550/ARXIV.1610.08733.

1 现有的高斯过程库

现在有许多公开可用的高斯过程库,规模从个人项目到主要社区工具不等。因此,我们将只考虑现有库的相关子集。有影响力的 GPML 工具箱(Rasmussen 和 Nickisch,2010 年[11])使用了 MATLAB。它已被广泛 forked。对我们特别有参考价值的是 GPy 库(GPy,自 2012 年以来 [3]),它主要使用 Python 和 Numeric Python (NumPy) 编写。 GPy 有一个直观的面向对象的界面。另一个相关的高斯过程库是 GPstuff (Vanhatalo et al., 2013 [13]),它也是一个 MATLAB 库。

注:目前 python 的 scilearn、pymc3、pyro 等都有高斯过程库。

2 新库的目标

GPflow 包含一组目标:

  • (1)主要目标是提高效率,特别是在大规模数据上提高效率。
  • (2)在需要近似推断的地方,尽量保持其准确性。
  • (3)我们的目标是支持各种核函数和似然函数。
  • (4)可验证的正确性。
  • (5)直观用户界面和易用性。
  • (6)软件的可扩展性。

我们认为,有一种方法可以比现有软件包更好地满足这些同时实现的目标,并且可以在 GPflow 中实现。

3 实现目标的主要特点

为了最好地实现上述目标,我们启动了具有以下显著特征的项目:

  • 使用变分推断作为主要的近似方法,来应对非共轭和大规模的双重挑战。
  • 使用自动微分 来消除梯度方法的负担,实现相对简洁的代码。
  • 利用 GPU 硬件进行快速计算的能力。
  • 面向对象的 Python 前端

表 1 汇总了具有上述特征的一些高斯过程库。 GPflow 接口和 Python 架构深受 GPy 的影响。 GPflow 和 GPy 之间的一个重要区别是 GPflow 使用 TensorFlow 进行核心计算,而不是 numpy。 这种差异显著地影响了架构的通用性,例如 GPy 中的 GPU 功能目前仅限于 GPLVM 的 CUDA 代码(Dai 等,2014 年[2])。相比之下,GPflow 实现针对广泛的 GPU 功能。

GPflow 通过自动微分来减少用户的代码开销,从而让神经网络的使用更加容易。在可用库中,我们使用 TensorFlow(Abadi 等,2015 年[1]),这将在下一节中讨论。

表 1:在撰写本文时现有高斯过程库所具有的特征汇总。 OO 代表面向对象。在 GPU 列中,GPLVM 表示高斯过程隐变量模型,SVI 表示随机变分推理。 N\R 表示未报告。

Fig01

4 为 TensorFlow 提供高斯过程需求

在 TensorFlow(Abadi 等,2015 年[1])中,计算被描述为有向图,其中节点代表运算(简称 Ops),边代表张量。作为有向边,张量表示计算之间的某些数据流。 Ops 是可识别的数学函数,例如加法、乘法等。核(注:与高斯过程文献中的核不是一个概念)是给定 Op 在特定设备(如 CPU 或 GPU)上的实现。与几乎所有现代神经网络软件一样,TensorFlow 具有自动计算目标函数关于某些参数的梯度的能力。 TensorFlow 开源实现为大多数运算提供了丰富的 GPU 核。

在 GPflow 中,尽管我们通过使用 TensorFlow 获得了显著收益,但软件中还缺少一些我们必需的功能,因此,我们将此功能添加到 TensorFlow 中。特别是:高斯过程软件需要使用线性代数算法求解线性方程组,使用了 Cholesky 分解的计算图的微分,需要一个新的 Op 支持,我们在 Rasmus Munk Larsen 的帮助下贡献了它。代码的主要部分是 Murray (2016 [8]) 提出的 块 Cholesky 算法 的 C++ 实现。我们还贡献了支持 GPU 求解矩阵三角系统的代码,这在某些情况下是近似推断的瓶颈。

5 GPflow 详情

GPflow 在可能的情况下可以支持精确推断,并且支持各种近似方法。

高斯过程难处理的来源之一是非高斯似然,它造成非共轭的先验,因此对似然函数进行分类对于软件设计开发是有帮助的。另一个难以处理的主要来源是随着数据点规模增加,高斯过程存在扩展性问题。

为此,GPflow 采用了 “变分稀疏” 方法,这些方法确保近似值具有可扩展性,并且在 Kullback-Leibler 意义上接近后验(Matthews 等,2016 年 [7])。推断方法是否使用变分稀疏性是对其进行分类的一种方法。表 2 汇总了一些在 GPflow 中作为类实现的推断选项。请注意,所有基于 MCMC 的推断方法都支持超参数的贝叶斯先验,而所有其他方法都假设超参数是点估计。我们采用的主要 MCMC 方法是 Hamiltonian Monte Carlo (HMC) (Neal, 2010 [9])

在设计时的架构注意事项:GPflow 的整个 Python 组件本质上都是面向对象的。表 2 中各种推断方法的代码在类层次结构中构建,其中公共代码被提取到共享基类中。面向对象的范式虽然对于代码的 Python 层来说非常自然,但与更接近函数概念的计算图的重点不同。功能强大的计算图和面向对象的接口需要在 GPflow 中共存,这是通过 Param 类实现的。该类允许参数既是可以是对象的属性,也可以是 TensorFlow 计算图中的可优化变量。

已采取许多步骤来确保项目质量和可用性。所有 GPflow 源代码都可以在 GitHub 上公开获得,网址为 https://github.com/GPflow/GPflow 。该网页使用持续集成来运行自动化测试套件。GPflow 的测试代码覆盖率高于发布代码覆盖率统计数据的同类包,达到了 99% 的水平(表 1)。大家可以在 https://gpflow.readthedocs.io 找到用户手册。

表 2:显示 GPflow 中推断类的表格。相关参考文献有 VGP (Opper and Archambeau, 2009 [10])、SGPR (Titsias, 2009 [12])、SVGP (Hensman et al., 2013 [4], 2015b [6]) 和 SGPMC (Hensman et al., 2015a [5])。

tag02

6 时间实验

作为一个场景,我们研究了使用随机变分推断在 MNIST 上进行多分类高斯过程分类器的训练(Hensman 等,2015b [6],2015a [5])。我们与 GPy 进行了比较。所讨论的其他库目前都不支持该算法。在功能上,GPflow 和 GPy 中的算法几乎相同。我们进行了一系列试验,测量每个包执行 5050 次算法迭代所花费的时间。这些试验包括一组 CPU 实验,其中我们改变了两个包可用的线程数。对于 GPflow,我们还测量了在所考虑的最大 CPU 线程数之上添加 GPU 的效果。 GPy 目前没有此算法的 GPU 实现。我们使用主频为 3.40GHz 的 Linux 工作站 Intel Core I7-4930K CPU 和 NVIDIA GM200 Geforce GTX Titan X GPU。

时间实验的结果如 图 1 所示。对于 CPU 实验,GPflow 和 GPy 的速度相似。但加入 GPU 后对速度的提升相当可观。这些收获可能会对研究人员在该主题上的工作流程产生重大影响。根据我们所做的测量,使用具有 6 个 CPU 线程的 GPflow 进行训练大约需要 41 小时或不到 2 天,而添加 GPU 目前可以将训练时间减少到大约 5 小时。

Fig01

图 1:GPflow 和 GPy 在 MNIST 数据集上每秒执行随机变分推断迭代次数的比较。误差条表示了从五次重复实验计算的标准偏差。

参考文献

  • [1] Martın Abadi, Ashish Agarwal, Paul Barham, Eugene Brevdo, Zhifeng Chen, Craig Citro, Greg S. Corrado, Andy Davis, Jeffrey Dean, Matthieu Devin, Sanjay Ghemawat, Ian Goodfellow, Andrew Harp, Geoffrey Irving, Michael Isard, Yangqing Jia, Rafal Jozefowicz, Lukasz Kaiser, Manjunath Kudlur, Josh Levenberg, Dan Man ́e, Rajat Monga, Sherry Moore, Derek Murray, Chris Olah, Mike Schuster, Jonathon Shlens, Benoit Steiner, Ilya Sutskever, Kunal Talwar, Paul Tucker, Vincent Vanhoucke, Vijay Vasudevan, Fernanda Vi ́egas, Oriol Vinyals, Pete Warden, Martin Wattenberg, Martin Wicke, Yuan Yu, and Xiaoqiang Zheng. TensorFlow: Large-scale machine learning on heterogeneous systems, 2015.
  • [2] Zhenwen Dai, Andreas Damianou, James Hensman, and Neil Lawrence. Gaussian process models with parallelization and GPU acceleration. arXiv preprint 1410.4984, 2014.
  • [3] GPy. GPy: A Gaussian process framework in Python. http://github.com/SheffieldML/ GPy, since 2012.
  • [4] James Hensman, Nicolo Fusi, and Neil D Lawrence. Gaussian processes for Big Data. In UAI, July 2013.
  • [5] James Hensman, Alexander G. de G. Matthews, Maurizio Filippone, and Zoubin Ghahramani. MCMC for variationally Sparse Gaussian Processes. In NIPS, December 2015a.
  • [6] James Hensman, Alexander G. de G. Matthews, and Zoubin Ghahramani. Scalable Variational Gaussian Process Classification. In AISTATS, May 2015b.
  • [7] Alexander G. de G. Matthews, James Hensman, Richard E. Turner, and Zoubin Ghahramani. On Sparse variational methods and the Kullback-Leibler divergence between stochastic processes. In AISTATS, May 2016.
  • [8] I. Murray. Differentiation of the Cholesky decomposition. arXiv preprint 1602.07527, February 2016.
  • [9] Radford M. Neal. MCMC using Hamiltonian dynamics. Handbook of Markov Chain Monte Carlo, pages 113–162, 2010.
  • [10] Manfred Opper and Ce ́dric Archambeau. The variational Gaussian approximation revisited. Neural Computation, 21(3):786–792, 2009.
  • [11] C. E. Rasmussen and H. Nickisch. Gaussian Processes for machine learning (GPML) toolbox. Journal of Machine Learning Research, 11:3011–3015, 11 2010.
  • [12] Michalis K. Titsias. Variational learning of inducing variables in sparse Gaussian processes. In AISTATS, April 2009.
  • [13] Jarno Vanhatalo, Jaakko Riihim ̈aki, Jouni Hartikainen, Pasi Jyl ̈anki, Ville Tolvanen, and Aki Vehtari. GPstuff: Bayesian modeling with Gaussian processes. Journal of Machine Learning Research, 14(1):1175–1179, 2013.