Press "Enter" to skip to content

函数分布视角下的神经过程

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.


作者:KasparMärtens
编译:Bot
编者按:几个月前,Deepmind在ICML上发表了一篇论文《Neural Processes》,提出了一种兼具神经网络高效性和高斯过程灵活性的方法——,被称为是高斯过程的深度学习版本。虽然倍受关注,但目前真正能直观解读神经过程的文章并不多,今天论智带来的是牛津大学在读PHD Kaspar Märtens的一篇可视化佳作。
在今年的ICML上,研究人员提出了不少有趣的工作,其中神经过程(NPs)引起了许多人的注意,它基于神经网络概率模型,但又可以表示随机过程的分布。这意味着NPs结合了两个领域的元素:

  • 深度学习:神经网络是灵活的非线性函数,可以直接训练
  • 高斯过程:GP提供了一个概率框架,可用于学习非线性函数的分布

两者都有各自的优点和缺点。当数据量有限时,由于本身具备概率性质可以描述不确定性,GP是首选(这和非贝叶斯神经网络不同,后者只能捕捉单个函数,而不是函数分布);而当有大量数据时,训练神经网络比GP推断更具扩展性,因此优势更大。
神经过程的目标就是实现神经网络和GP的优势融合。

什么是神经过程?

NP是一种基于神经网络的方法,用于表示函数的分布。下图展示了如何建立NP模型,以及训练模型背后的一般想法:

给定一系列观察值  ,把它们分成“context points”和“target points”两组。现在,我们要根据“context points”中已知的输入输出对  ,其中  ,和“target points”中的未知输入  ,其中  ,预测其相应的函数值  。
我们可以把NP看作是根据“context points”中的“target points”建模的模型,相关信息通过潜在空间 从左侧流向右侧,从而提供新的预测。右侧本质上是从 映射到 的有限维嵌入,而 是个随机变量,这就使NP成了概率模型,能捕捉函数的不确定性。一旦模型完成训练,我们就可以用 的近似后验分布作为测试时进行预测的先验。
乍看之下,这种分“context points”和“target points”的做法有点类似把数据集分成训练集和测试集,但事实并非如此,因为“target points”集也是直接参与NP模型训练的——这意味着模型的(概率)损失函数在这个集上有明确意义。这样做也有助于防止模型过拟合和提供更好的泛化性。在实践中,我们还需要反复把训练数据通过随机采样分为“context points”中的“target points”,以获得更全面的概括。
让我们来思考以下两种情况:

  • 基于单个数据集推断函数的分布
  • 当存在多个数据集且它们之间存在某种相关性时,推断函数的分布

对于情况一,常规的(概率)监督学习就能解决:给定一个包含N个样本的数据集,比如  ,其中  。假设确实存在一个函数 ,它能产生  ,我们的目标就是学习 的后验分布,然后用它预测测试集上某点的函数值  。

对于情况二,我们则需要从元学习的角度去观察。给定D个数据集,其中  ,每个数据集包含  个数据对  。如果我们假设每个数据集都有自己的基函数  ,输入 后,它们有  ,那么在这种情况下,我们就可能想要了解每个  的后验分布,然后把经验推广到新数据集  上。
对于数据集很多但它们的样本很少的情况,情况二的做法特别有用,因为这时模型学到的经验基于所有  ,它的内核、超参数是这些函数共享的。当给出新的数据集  时,我们可以用后验函数作为先验函数,然后执行函数回归。
之所以要举着两个例子,是因为一般来说,GP适用于情况一,即便N很小,这种做法也很有效。而NP背后的思路似乎主要来自元学习——在这种情况下,潜在的z可以被看作是用于不同数据集间信息共享的机制。但是,NP同样具有概率模型的特征,事实上,它同时适用于以上两种情况,具体分析请见下文。

NP模型是怎么实现的?

下面是NP生成模型的详细图解:

如果要逐步分解这个过程,就是:

  • 首先,“context points”里的数据  通过神经网络 映射,获得潜在表征 
  • 其次,这个向量  经聚合(操作:平均)获得单个值 (和每个  具有相同的维数)
  • 这个 的作用是使 的分布参数化,例如
  • 最后,为了预测输入  后的函数值,对 采样并将样本与  组成数对,用神经网络 映射  获得预测分布中的样本  。

NP的推断是在变分推断(VI)框架中进行的。具体来说,我们介绍了两种近似分布:

  • 让  去近似条件先验 
  • 去近似于各自的,其中

下图是近似后验  的具体推断过程。也就是说,我们用相同的神经网络 映射两个数据集,获得聚合的 ,再把 映射到  和  ,使后验被参数化。

变分下界包含两个项(下式),其中第一项是target集上的预期对数似然,即先从上采样(上图左侧),然后用这个 在target set上预测(上图右侧)。

第二项是个正则项,它描述了和  之间的KL散度。这和常规的  有点不同,因为我们的生成模型一开始就把  当做条件先验,不是  ,而这个条件先验又依赖于神经网络 ,这就使我们没法得到确切值,只能用一个近似值  。

实验

NP作为先验
我们先来看看把NP作为先验的效果,也就是没有观察任何数据,模型也没有经过训练。初始化权重后,对  进行采样,然后通过  值的生成先验预测分布并绘制函数图。
和具有可解释内核超参数的GP相反,NP先验不太明确,它涉及各种架构选择(如多少隐藏层,用什么激活函数等),这些都会影响函数空间的先验分布。
例如,如果我们用的激活函数是sigmoid,调整z的维数为{1, 2, 4, 8}。

如果用的是ReLU:

在一个小数据集上训练NP
假设我们只有5个数据点:

由于NP模型需要context set和target set两个数据集,一种方法是选取固定大小的context set,另一种方法则是用不同大小的context set,然后多迭代几次(1个点、2个点……以此类推)。一旦模型在这些随机子集上完成训练,我们就可以用它作为所有数据的先验和条件,然后根据预测结果绘制图像。下图展示了NP模型训练时的预测分布变化。

可以发现,NP似乎已经成功学习了这5个数据点的映射分布,那它的泛化性能如何呢?我们把这个训练好的模型放在另一个新的context set上,它的表现如下图所示:

这个结果不足为奇,数据量太少了,模型结果差可以理解。为了更好地提高模型泛化性,我们再来试试更大的函数集。
在一小类函数上训练NP
上文已经用单个(固定)数据集探索了模型的训练情况,为了让NP像GP一样通用,我们需要在更大的一类函数上进行训练。但在准备复杂函数前,我们先来看看模型在简单场景下的表现,也就是说,这里观察的不是单个函数,而是一小类函数,比如它们都包含  ,其中  。
我们的目标是探究:

  • NP能不能捕捉这些函数?
  • NP能不能概括这类函数以外的函数?

下面是具体步骤:

  • 设 满足均匀分布: 
  • 定义  ,其中
  • 把数据对  随机分成context set和target set两个数据集,并进行优化
  • 重复上述步骤

为了方便可视化,这里我们用了二维 ,具体图像如下所示:

从左往右看,模型似乎编码了参数 ,如果这幅图不够直观,下面是调整某一潜在维度(  或  )的动态可视化:

需要注意的是,这里我们没有用任何context set里的数据,只是为了可视化指定了具体的  值。接下来,就让我们用这个模型进行预测。
如下左图所示,当context set数据集里只包含  一个点时,模型覆盖了一个较宽的范围,包含不同a取值下  的值域(虽然  ,但训练时并没有完全用到)。

往context set数据集里添加第二个点  后,可视化如中图所示,相比左图,它不再包含 为负数的函数值情况。右图是继续添加的点后的情况,这时模型后验开始接近函数的真实分布情况。
这之后,我们就可以开始探究NP模型的泛化性,以2.5sin(x)和|sin(x)|为例,前者需要在a⋅sin(x)的基础上做一些推断,而后者的值始终是个正数。

如上图所示,模型的值域还是和训练期间一样,但它在两种情况下都出现了符合函数分布的一些预期。需要注意的是,这里我们并没有给NP提供足够多的不确定性,所以它预测不准确也情有可原,毕竟比起易于解释的模型,这种自带黑盒特性的模型更难衡量。
之后,作者又比较了GP和NP的预测分布情况,发现两者性能非常接近,只是随着给出的数据点越来越多时,NP会因为架构选择(神经网络过小、低纬度z)出现性能急剧下降。对此,以下几个改进方法可以帮助解决问题:

  • 2维z适合用于学习理解,在实际操作中,可视情况采用更高的维度
  • 让神经网络h和g变得更深,扩大隐藏层
  • 在训练期间使用更多样化的函数(更全面地训练NP超参数),可提高NP模型泛化性

结论

虽然NP号称结合了神经网络和GP,能预测函数的分布,但它从本质上看还是更接近神经网络模型——只需优化架构和训练过程,模型性能就可以大幅提高。但是,这些变化都是隐含的,使得NP更难被解释为先验。

Be First to Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注