高斯过程(转)
http://36kr.com/p/5114423.html
http://bridg.land/posts/gaussian-processes-1
http://www.gaussianprocess.org/
http://www.360doc.com/content/17/0810/05/43535834_678049865.shtml
大数据文摘作品,编译:丁慧、文明、Katherine Hou、云舟
高斯过程可能不是当前机器学习最火的研究方向,但仍然在很多前沿的研究中被使用到——例如,最近在AlphaGo Zero中自动调整MCTS超参数就使用了它。在建模能力和进行不确定性估计方面,它们具有非常高的易用性。
然而,高斯过程很难掌握,尤其是当你习惯了深度学习中其他常见的模型之后。所以本文希望在具备相当少的ML知识背景下,对高斯过程提供一个直观的理论介绍,请学习者下载notebook并实现本文中提到的所有代码。
Jupyter notebook 版本:
https://gist.github.com/Bridgo/429594942ff51037ecc703905e40c562
什么是高斯过程,为什么使用它?
高斯过程(Gaussian process, GP)是一个强大的模型,可以用来表示函数的分布。机器学习中的大多数现代技术都倾向于通过参数化函数,然后对这些参数(例如线性回归中的权重)进行建模来避免这种情况。
然而,GP是直接对函数建模的非参模型。这种方法带来的一个非常重要的好处是:不仅可以拟合任何黑箱函数,还可以拟合我们的不确定性。量化不确定性是非常有价值的——例如,如果允许我们随意探索(需要更多的数据),我们就可以选择尽可能高效地探索最不确定的领域。这是贝叶斯优化背后的主要思想。
如果你给我几张猫和狗的照片作为学习资料,然后给我一张新的猫的照片让我分类——我应该给出一个置信度相当高的预测。但是如果你给我一张鸵鸟的照片,强迫我判断它是猫还是狗——我最好还是给出一个置信度非常低的预测。
——Yarin Gal
对于这个介绍,我们将考虑一个没有噪声的简单回归模型设置(但GP可以扩展到多维和噪声数据):
假设我们需要拟合某个隐函数f:R—> R
已知数据X = [x1,…,xN]T,Y = [y1,…,yN]T,其中yi= f(xi)
我们要预测一些新的未观测点x*的函数值
使用高斯拟合函数
GP背后的关键思想是可以使用无限维多元高斯分布拟合函数。换句话说,输入空间中的每个点与一个随机变量相关联,并将多元高斯分布用来拟合这些点的联合分布。
那么,这究竟意味着什么呢?让我们从一个更简单的情况开始:一个二维高斯。已知:
通常它是高度表示概率密度的3D钟形曲线。但是,假如不是表示整个分布,我们只需要从分布中抽样。然后我们将得到两个值,我们可以绘制点d并在它们之间画一条线。
观察图中的这些直线,看起来像我们仅仅抽取了10个线性函数样本……如果我们现在使用20维的高斯函数,依次连接每个样本点,会发生什么样的变化呢?
这些绝对看起来像多个函数,但相对于我们的目的,它们看起来噪声太大所以不可用。让我们进一步考虑可以从这些样本中得到什么,以及如何改变分布从而获得更好的样本……
多元高斯有两个参数,即均值和协方差矩阵。如果我们改变了均值的话,我们只会改变整体趋势(即如果均值是上升的整数,如np.arange(D),那么样本会呈现出整体正向线性趋势),但是仍然会出现锯齿形的噪声形状。出于这个原因,我们将GP的均值设置为0——它们实际上已经足够强大,可以在不改变均值的情况下拟合各种函数。
相反,我们需要一些平滑的概念:即如果两个输入点彼此邻近,那么我们期望这些点的函数值是相似的。就我们的模型而言,对用于相邻点的随机变量在它们的联合分布(即高斯协方差)下采样时应该具有相似的值。
这些点的协方差被定义为高斯的协方差矩阵。假设我们有N维高斯模型y0,…yN,协方差矩阵Σ是N╳N维且它的第(i,j)个元素是Σij= cov(yi,yj)。换句话说,Σ是对称的而且存储着所有随机变量的联合模型的成对协方差。
用核技巧进行平滑处理
那么如何定义我们的协方差函数呢?这时大量关于核的文献可以派上用场。我们将选择平方指数核(最简单的形式)来达到我们的目的,定义如下:
当x = x’时,函数值(我们刚刚绘制的)为1并且随着点的不同而趋于0
我们可以绘制这个核函数来展示它在x = x’时是最大的,然后随着两个输入的不同开始平滑的下降
因此,为了得到我们想要的那种平滑性,我们将考虑在xi和xj处绘制两个随机变量yi和yj,来得到它们的协方差cov(yi,yj) = k(xi,xj) ——它们越接近,它们的协方差越高。
使用上面的核函数我们可以得到k(xs,xs)这个矩阵。现在我们试着从20维高斯中抽取另外10个样本,但是这次使用新的协方差矩阵。当我们这样做时,我们可以得到:
现在我们有了一些开始看起来像一个(有用的)函数分布。而且我们可以看到,随着维数趋于无穷大,我们不再需要连接这些点,因为我们可以为每一个可能的输入指定一个点。
让我们使用更多维度,并在更大范围的输入中查看他的外形:
用先验和观测进行预测
现在我们有了函数的分布,我们如何通过训练数据拟合隐函数从而进行预测?
首先,我们需要获取训练数据。 这可以通过构造我们的秘密函数f来生成数据。
目标函数
本教程中我们使用一个五次多项式:
我选择它是因为这个函数有个漂亮的波浪图形。当然,我们也可以用其它的函数。
数学推导
现在我们已经进入高斯过程的核心了。这需要更多的数学知识,不过不用担心,我们只需要巩固已有的知识就行,然后用一个小技巧在观测数据上决定我们的联合概率分布:
到目前为止,我们已知能够用多元正态分布来模拟p(y|x)了。
其中,
这是一个先验分布,它表示在没有任何观测数据的情况下,出现时,出现的概率。
现在,我们有了训练集,其训练得到的模型输入为输出当有新样本其预测值为
回顾之前高斯过程的定义,我们将拟合和的联合概率分布。
其中和前面一样,我们将均值设为0.
但是,这是在拟合而我们仅需要的分布。
条件多元高斯
与其从头开始计算的分布,我们可以使用标准结果。如果我们有了前面提到过的和的联合概率分布,而要得到的条件概率分布,可以用如下的公式:
现在我们就可以用先验分布和观测数据计算后验分布了
注意:下面给的代码在实际过程中并没有用到,因为K通常处于较差条件,所以它的逆通常不准确。在本教程第二部分中我们将给出一个更好的方法。
这就是上面公式的代码实现! 现在就可以用这两个参数从条件概率分布中采样了。我们将它们与真实函数(虚线)画在一起对比。因为我们用的是高斯过程,它包含有不确定性信息,这种不确定性信息以随机变量的方差形式表示出来。我们知道第i个随机变量的方差为∑*ii,换句话说,方差就是∑*的对角线值。下图中的样本包含了标准方差为±2的不确定性。
接下来讲什么?高斯过程回归和噪声数据处理
实际上,我们需要做更多的工作才能得到更好的预测结果。你可能已经注意到核中包含两个参数-σ和l。如果你在采样过程中试着改变这两个参数,你会发现σ影响纵坐标的变化而l影响横坐标的范围。
因此,我们需要改变它们来反映我们对隐函数的先验置信度。譬如,如果我们希望隐函数有更大的输出范围(一个我们感兴趣的范围),那么我们需要相应的增加的值(试着将隐函数返回的值放大100倍,看会出现什么,然后将sigma设置为100再看)。事实上,任何用到核的函数,我们都可以通过改变核得到一个完全不一样的函数(例如,周期函数)。
核的选择需要人工进行,但参数可以通过最小化损失函数来自动优化。这就是高斯过程回归的内容。
最后,我们需要考虑怎么处理含有噪声的数据,例如,在实际过程中我们可能无法获得符合隐函数的标准数据。在这种情况下我们需要将这种不确定性纳入模型中以获得更好的泛化能力。
参考资料:
《Machine Learning - A Probabilistic Perspective》第十五章,作者 Kevin P. Murphy
YouTube上Nando de Freitas 发布的Introduction to Gaussian processes视频