PyMC:过去、现在和未来#
在 2020 年 PyMCon 会议上,Chris Fonnesbeck 在他的演讲 “PyMC:过去、现在和未来”中讨论了 PyMC 的历史和未来。
在演讲中,他讨论了 2000 年代初期概率编程的更广泛背景,概述了早期开发的挑战和成功,并提供了对项目未来方向的见解。
背景#
什么是 PyMC?#
PyMC 是一个强大且广泛使用的概率编程框架,允许用户在 Python 中实现最先进的贝叶斯模型。该项目由 Chris Fonnesbeck 于 2003 年在佐治亚大学读研究生时启动,此后已发展到近 400 名贡献者。
什么是概率编程语言?#
概率编程语言是一种采用 随机 原语的语言。正如我们在大多数语言中都有整数、字符串和浮点数一样,概率编程语言将具有 随机变量 或 概率分布。
为什么?这些随机原语用作构建贝叶斯模型的构建块。它们使我们能够在非常高的级别上指定概率模型。
通过抽象掉许多随机数抽样和其他形式的推断的底层机制,概率编程使那些不是软件开发人员或统计学家的人更容易进行贝叶斯推断。
2000 年初期#
在 2000 年,Chris Fonnesbeck 是佐治亚大学的一名生物学研究生。凭借 SAS 的统计经验,他开始使用 WinBUGS 和 OpenBUGS 试验贝叶斯模型。
WinBUGS 于 1997 年发布,是第一个为贝叶斯模型提供手动编码采样器替代方案的软件。但是,它有许多限制:它仅在没有虚拟机的情况下在 Windows 上受支持,它是闭源的,并且调试起来可能非常困难。
该项目最终通过 OpenBUGS 成为开源项目,但根据其开发者 Andrew Thomas 的说法,它“仅在只读意义上是开源的”。此外,它是用 Component Pascal 编写的,需要专有的仅 Windows IDE(集成开发环境)来构建,并且源代码不是纯文本。
尽管存在这些挑战,WinBUGS 和 OpenBUGS 为贝叶斯建模初学者提供了宝贵的经验,并为 PyMC 以及其他使贝叶斯推断方法更容易实现的工具的开发铺平了道路。
2003-2005#
2003 年,Chris Fonnesbeck 开始编写 PyMC 的第一个版本,目标是能够在 Python 中构建贝叶斯模型。
第一个版本是基于数字包的马尔可夫链蒙特卡洛 (MCMC) 的面向对象实现,并且深受 Chris 之前在 Java 方面的经验的影响。
PyMC 1.0 于 2005 年发布,并被一小群与佐治亚大学相关的常规用户使用。它最终出现在 SourceForge 上,社区中的其他人开始贡献。这导致生物学家 Anand Patil 和 David Heward 于 2006 年加入该项目。
2006–2013 年#
2006 年,Anand Patil 和 David Heward 开始扩展和重构 PyMC 2.0 的大量代码,PyMC 2.0 成为一个全面的概率编程库,其中包括各种统计分布。
2.0 版本基于一组 Fortran 函数,这些函数使用 F2PY 编译到 Python 中,从而提高了性能。它还使用了 NumPy 库,提供了对 Python 3 的支持,实现了高斯过程,并提供了收敛诊断。在 2013 年 10 月发布后,它吸引了生态学和天文学等应用领域用户的兴趣。
2011-2015#
Metropolis-Hastings 和 Gibbs 采样器这两种算法用于从非归一化概率模型中抽取样本,对于大型或复杂模型执行速度缓慢。
下一代贝叶斯推断方法旨在解决这些问题——即基于梯度的 MCMC 或哈密顿蒙特卡洛 (HMC)。
No-U-Turn-Sampler(NUTS 算法),由 Matt Hoffman 和 Andrew Gelman 于 2011 年开发,使用有关对数后验密度梯度的信息来识别较高概率的区域,以帮助其快速收敛于大型问题。这比传统的采样方法快得多。
John Salvatier 开发了 mcex 包来试验基于梯度的 MCMC 样本,第二年他被团队邀请重新设计 PyMC。他没有依赖 Fortran,而是使用 Theano 包(最初为实现神经网络模型而开发的深度学习库)完成了这项工作。
Theano 的使用允许构建和编译到 C 的图。这实现了优化、在 GPU 上的使用和自动微分。
后来,由于 Taku Yoshioka 和 Max Kochurov 的努力,PyMC 中添加了其他几种方法,例如变分推断方法。
与 2.0 版本相比,PyMC 3.0 的用户数量显着增加,并广泛应用于许多应用程序中。
一些著名用户的例子包括海洋生物学家 Aaron McNeil,他使用 PyMC 模拟大堡礁上棘冠海星的蔓延,以及 Instagram 创始人 Kevin Systrom 和开发者 Thomas Vladick,他们使用 PyMC 模拟美国不同州的 COVID-19 的基本再生数 (Rt)。这使他们能够提供有关病毒传播的实时信息。
2016#
2016 年,PyMC 成为 NumFOCUS 下的赞助项目,NumFOCUS 是一个非营利组织,为开源项目提供可持续性和支持。通过加入 NumFOCUS,PyMC 能够访问教育计划和活动以及其他资源,以帮助确保其持续发展和成功。
这种支持对于让 PyMC 继续在开源领域发展壮大,以及扩展社区和多元化工作至关重要。
2017-2020#
2017 年 10 月,蒙特利尔大学 Mila 团队负责 PyMC 用作其计算后端的 Theano 框架,由于其他良好支持的框架的可用性,决定停止该项目。
这给 PyMC 带来了挑战,因为它严重依赖 Theano。PyMC 团队花费了一年多的时间评估其他计算后端,包括 MXNet、TensorFlow 和 PyTorch,然后才决定尝试 TensorFlow。TensorFlow 一直支持 PyMC,并且正在开发 TensorFlow Probability,其中包括对 PyMC 有用的组件。但是,TensorFlow 的快速变化带来了许多挑战。
2020 年,在从事符号 PyMC 项目时,Brandon Willard 有一个将 Theano 链接到 JAX 作为计算后端的想法。这将使 Theano 能够利用 JAX 的 autograd 和线性代数加速功能,而不会受到深度学习框架的约束。Willard 成功开发了 Theano 的 JAX 链接器,并使用它创建了 Theano-PyMC 库(后来重命名为 Aesara),用作 PyMC 的后端。
第一届 PyMCon 于 2020 年 10 月举行。Chris Fonnesbeck 在演讲结束时感谢所有为使会议成为现实而努力的人,包括执行董事 Thomas Wiecki 和 Ravin Kumar。您可以在此处查看演示文稿,或在 YouTube 上的 PyMCon 播放列表上查看完整演讲。
2020#
我们从 2000 年初期走了多远?
正如 Chris Fonnesbeck 所说,我们目前正处于“概率编程的黄金时代”——现在有很多选项可以在不同的平台上实现贝叶斯模型。
今天,当您在 PyMC 中构建模型时,界面旨在直观且易于使用。PyMC 旨在使编码模型就像在白板上写下模型一样容易
您只需运行 pymc.sample()
函数来拟合您的模型,该函数会自动执行该过程中涉及的许多决策。这使您只需一行代码即可生成 MCMC 结果,而无需担心算法的技术细节。创始人开发人员之一 Thomas Wiecki 将此称为“自动推断按钮”。Chris 的演示文稿是在 2020 年 10 月。以下是自主题演讲以来 PyMC 库的更新。
2022 年(6 月)#
PyMC v4.0 于 2020 年 6 月发布,其中包含以下主要更改
PyMC3 重命名为 PyMC
PyMC 后端现在使用 Aesara,Theano 的一个分支
JAX 后端用于更快的采样
动态形状支持
新网站设计:www.pymc.io/
2022 年(12 月)#
下一步是什么?#
想开始使用贝叶斯分析吗?
现在是开始为 PyMC 贡献的最佳时机!查看 PyMC Devs 日历 或 PyMC Meetup 小组,并关注我们的办公时间,或从我们的 贡献页面开始。
或者,加入我们的 PyMC Discourse 并与贝叶斯社区联系!
了解更多#
PyMC 在行动!💥 查看我们 示例库中的以下页面
与 PyMC 联系#
通过以下方式与 PyMC 联系
网站: pymc.io
Discourse: discourse.pymc.io
YouTube: PyMCDevelopers
Star GH 仓库: pymc-devs/pymc
加入 Meetup: pymc-online-meetup
Twitter: @pymc_devs
LinkedIn: @pymc