第8章 推断引擎

“首要原则是你一定不要欺骗自己,你自己正是最容易被欺骗的人。”

——理查德·费曼(Richard Feynman)

到目前为止,我们的重点是模型的建立、结果的解释和模型的评价。我们曾依靠pm.sample函数的“魔力”来计算后验分布。接下来重点学习这个函数背后的推断引擎的一些细节。概率编程工具(如PyMC3)的目的是,用户不应该关心如何进行采样,而是了解如何从后验数据中获取样本。这对于充分理解推理过程很重要,也可以帮助我们了解这些方法什么时候失败、是如何失败的以及如何应对。如果你对理解后验样本的近似计算方法不感兴趣,你可以跳过本章的大部分内容,但我强烈建议你至少阅读8.4节,因为这一节提供了一些指导,可以帮助你检查后验样本是否可靠。

计算后验分布的方法有很多。在本章中,我们将讨论一些通用的办法,并将重点关注PyMC3中实现的方法上。

在本章中,我们将学习以下主题。

变分法。

梅特罗波利斯-黑斯廷斯算法。

哈密顿蒙特卡洛。

序贯蒙特卡洛。

样本诊断。

8.1 简介

贝叶斯方法虽然概念简单,但在数学和数值上都具有挑战性。主要原因是,边缘似然,即贝叶斯定理[见式(1.4)]中的分母,通常采用难以处理或计算量大的积分形式来求解。为此,后验通常是使用马尔可夫链蒙特卡洛(MCMC)家族的算法或最近的变分算法来进行数值估计。这些方法有时被称为推断引擎,因为至少在原则上,它们能够近似任何概率模型的后验分布。即使在实践中推理并不总是那么有效,这些方法的存在也推动了概率编程语言(如PyMC3)的发展。

概率编程语言的目标是将模型构建过程与推理过程分开,以简化模型构建、评估和模型修改/扩展的迭代步骤(如第1章和第2章所述)。通过把推理过程(而不是模型构建过程)视为黑盒,概率编程语言(如PyMC3)的用户可以自由地专注于特定的问题,让PyMC3为他们处理计算细节。这就是我们目前正在做的。所以,你可能会片面地认为这是“现成”的方法。但需要注意的是,在概率编程语言出现之前,做概率模型的人也习惯于编写自己的采样方法,这些方法通常是为他们的模型定制的,或者他们习惯于简化模型,使之适用于某些数学近似。事实上,这在一些学术界仍然是正确的。这种定制的方法可以更优雅,甚至可以提供一种更有效的方法来计算后验,但它也容易出错,而且非常耗时,即使对于专家也是如此。此外,定制的方法不适用于大多数对用概率模型解决问题感兴趣的实践者。像PyMC3这样的软件允许有着广泛背景的人们来使用概率模型,降低了数学和计算的门槛。我个人认为这是非常棒的,它允许我们学习更多关于统计建模的良好实践,所以我们应该尽量使用它。前几章主要是关于贝叶斯建模的基础知识。现在我们要学习在概念层面上自动推理是如何实现的,什么时候失败,为什么失败,失败后怎么办。 ...

Get Python贝叶斯分析(第2版) now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.