近日,Uber AI Lab 与斯坦福大学的研究团队开源了全新概率编程语言 Pyro。该语言基于 Python 与 PyTorch 之上,专注于变分推理,同时支持可组合推理算法。Pyro 的目标是更加动态(通过使用 PyTorch)和通用(允许递归)。它有一个灵活的基元库,用于创建新的推理算法并使用概率程序。Pyro 中可组合推理的核心抽象是 poutine(Pyro Coroutine 的简称)。Pyro 的推理算法是通过将 poutine 应用于随机函数来构建的。
- 项目链接:http://pyro.ai/
- GitHub 链接:https://github.com/uber/pyro
Uber 人工智能实验室刚刚宣布开源了概率编程语言(probabilistic programming language) Pyro!Pyro 是一个深度概率建模工具,有效融合了深度学习与贝叶斯建模,其目标是加速上述技术的研究与应用,更大地惠及人工智能社区。
Uber 人工智能实验室既研究专业技术,又探索实际应用。我们整合人工智能中的多个分支,有着深度学习、贝叶斯方法、进化计算和强化学习等方面的专家。Pyro 本身汇集了最好的深度学习、贝叶斯建模和软件抽象技术,从而成为一个现代、通用的深度概率编程语言。
我们相信,解决人工智能的关键所在是世界范围不同社区的共同努力。通过开源 Pyro,我们希望促进社区协作,使得 AI 工具更灵活、开放和易于使用。我们期待当前版本(alpha!)的 Pyro 能引起一些人的极大兴趣,包括想要利用大数据集和深度网络的概率建模者,想要更容易地使用贝叶斯计算的 PyTorch 用户,以及准备探索技术新前沿的数据科学家。下文将描述创建 Pyro 的动机,概述其设计原理及执行方面的一些见解,并指明下一步开发的状况。
为何选择 Pyro?
概率是推理不确定性的数学,正如微积分是推理变化率的数学。概率语言模型能够捕捉复杂的推理,发现未知,无需监督即可揭开数据的结构。并且,概率可使得专家通过先验信念的形式把知识注入到 AI 系统。
直接指定概率模型是笨重的,其执行也容易出错。概率编程语言(PPL)通过联合概率与编程语言的表征力量来解决上述问题。概率程序是一般确定性计算和随机采样值的混合,随机计算表征了数据的生成性。这一表征中隐含着概率——没有必要去推导公式——但这一规范也是通用的:通过这种方式可以编写任意的可计算概率模型。Pyro 全部使用 Python 作为基础语言,清晰而令人熟悉。
通过观察概率程序的结果,我们可以描述推断问题,大致为:「如果随机选择有个特定观测值,那么什么为真?」概率编程系统提供了通用的推断算法,只需用户很少的介入即可执行推断。试着把这看作 PPL 的编译器:它允许我们在建模器和推断专家之间分工。
然而推断是概率建模的关键挑战,不可扩展的推理是 PPL 的主要失败模式。借助深度学习的力量,研究者最近为概率推断和 PPL 执行引入了一种新方法,其核心思想是通过第二个模型(被称作推断模型,或者 Pyro 指导/guide in Pyro)描述模型中的推断,实际上这一思想最早可追溯到 Helmholtz machine。正如模型表征了数据的生成性,指导表征了把数据转化为潜在选择的生成性。
当然,我们不能简单地写下正确的指导(这就是为什么推断如此艰难)。相反,我们使用变分法,指定一组参数化的指导,接着解决一个优化问题从而把指导推进到模型的后验分布。这一优化可通过自动微分技术实现自动化,该技术能够有效计算程序的梯度,并提供评估期望值梯度的若干技巧。
Pyro 构建在优秀的 PyTorch 库之上,后者包括使用非常快速、GPU 加速的张量数学的自动微分。PyTorch 动态构建梯度,使得 Pyro 程序包含随机控制结构,即 Pyro 程序中的随机选择能够控制其他随机选择的出现。随机控制结构是 PPL 通用的关键。因此,Pyro 能够表征任意概率模型,同时提供灵活、可扩展到大型数据集的自动优化推断。
在 Pyro 中,生成模型和推断指导都可包括深度神经网络组件。最终的深度概率模型在最近工作中表现优异,尤其是对于无监督和半监督机器学习问题。
总结:
- 为什么要概率建模?为了正确捕捉模型中的不确定性和无监督、半监督学习的预测,并提供带有陈述式先验知识的 AI 系统。
- 为什么是(通用)概率程序?为指定复杂模型提供一个清晰、高级而又完整的语言。
- 为什么是深度概率模型?为了从数据中学习生成知识,并具化如何推断的知识。
- 为什么通过优化推断?为了扩展到大数据并促进现代优化和变分推断的进步。
Pyro 的设计原则和洞察
在 Pyro 的开发过程中,我们的目标是满足四个设计原则。Pyro 的设计目标是:
- 通用性:Pyro 是一个通用性 PPL—可表征任何可计算的概率分布。如何做到呢?通过从一种通用性语言(任意的 Python 代码)开始迭代和递归,然后添加随机采样、观测和推理。
- 可扩展:只需要在原来的代码顶部添加少量的手写代码,Pyro 就可以扩展到大型数据集。如何做到呢?通过建立现代黑箱优化技术,其使用数据的小批量进行近似推理。
- 最轻量:Pyro 是灵活和可维护的。如何做到呢?Pyro 是由少量强大而可组合的抽象概念实现的。任何繁重的工作都会尽可能用 PyTorch 和其它的库完成。
- 灵活性:Pyro 的目标是根据用户意愿实现自动化和可控制。如何做到呢?Pyro 使用高级的抽象概念表达生成和推理模型,同时允许专家自定义推理。
这些原则经常使 Pyro 的实现走向互为相反的方向。例如,为了实现通用性,需要在 Pyro 的程序中允许任意的控制结构,但这种通用性会导致其很难扩展。类似地,使用最少量的抽象概念的目标函数的自动构建使其更容易构建新的原型模型,但这也会使目标计算被隐藏,给那些需要灵活修改目标的高级用户造成不便。
我们在研究过程中借用了其它 PPL 的技术(特别是 WebPPL 和 Edward)来分解这些问题,并发现了一些新方法,例如可组合效应的处理程序可清晰地从目标函数的计算中分离控制流操作。PPL 基础运算是从一个分布中采样、观测样本的值以及推理执行后的结果。然而,采样声明所需的行为依赖于所在的推理环境。例如,当计算标准的边际似然函数下界(evidence-lower-bound)目标时,指导中的采样声明需要在实际中采样新的值,而模型中的采样声明只能重用这些值。Pyro 的实现将这些依赖于具体环境的效应整合成一个「普丁」目标的集合(Poutine,Pyro Coroutine 的简称),比如 Trace、 Replay 和 Condition。每一个「普丁」提供了对 Pyro 结构的少量修改(采样、参数结构,等等)。将这些「普丁」层叠起来使我们能对不同的推理算法建立需要的操作。通过这种「普丁」式的编程逻辑,主要的推理代码都集中于构建目标和估计梯度上。
下一步
Pyro 的 alpha 版本已经足够用于研究,但在概率编程和深度学习社区的推动下,我们仍将继续在未来数月内对 Pyro 的版本进行快速迭代。
基于 Pyro 的广泛应用领域和生机勃勃的深度概率建模和推理的研究社区,Pyro 进一步扩展和提升的可能方向是多方面的。我们最优先发展的技术包括:
- 优化抽象概念以进行快速建模(例如,通过提供自动默认指导)和高级用途(例如,通过优化「普丁」目标的组成)。
- 添加附加的目标(例如,alpha divergence、infoVAE 和 GAN-based loss)和附加的技术以估计梯度的期望值。
- 添加马尔科夫链蒙特卡罗(MCMC)和序列蒙特卡罗推理,特别是哈密顿蒙特卡罗(HMC),并在变分推理目标中使用。
- 探索高斯过程的模式和诸如贝叶斯优化的应用。
在更长远的未来,我们希望 Pyro 的主要发展方向将通过应用驱动,并成为新兴的 Pyro 社区的优选项。
安装
首先安装 PyTorch:http://pytorch.org/
Pyro 的大多数功能都是在 PyTorch 0.2 版本上实现的,但其中的一些功能只能在 PyTorch 的主分支上可用(如 pyro.SVI(... enum_discrete=True) 和 pyro.SVI(..., num_particles=100) 需要高于 0.2 版本的 PyTorch)。为了正常使用这些功能,请从源文件安装 PyTorch。经开发者验证,f964105 支持所有的 Pyro 功能。
该版本可从以下地址复制:https://github.com/pytorch/pytorch.git
通过以下方法安装:
Python 2.7:
pip install pyro-ppl
Python 3.5:
pip3 install pyro-ppl
从源文件安装:
git clone git@github.com:uber/pyro.git
cd pyro
pip install .