笔记

贝叶斯数据分析(6)——贝叶斯计算导论

贝叶斯数据分析(6)——贝叶斯计算导论

本笔记基于Bayesian Data Analysis Third Edition, Andrew Gelman et. al. 学习编写,由于是英文教材,可能在学习过程中一些翻译或者内容有误,如有问题或错误,可以发送至邮箱[email protected]反馈。在学习本书中,需要有一定数学基础或者数理统计的基础,并且存在很多需要计算的场景,对于每一条定理,从头开始的证明会让你更明白每一步是如何实现的。

我们之前提到的,都是一些简单模型,我们可以直接写出后验分布,但当后验分布不能解析写出时,我们如何计算贝叶斯推断需要的量?

在贝叶斯分析里,我们通常关心两类对象:

  1. 参数的后验分布:
p(θy)p(\theta\mid y)
  1. 未来观测值或者未观测量的后验预测分布:
p(y~y)p(\tilde y\mid y)

正如我们之前单参数模型和多参数模型提到的,如果我们容易得到后验分布,比如共轭先验下的二项-Beta、Poisson-Gamma、正态模型,我们可以直接写出后验分布。但是一旦模型更复杂,尤其是层级模型、高维模型、非线性模型、缺失数据模型,解析积分几乎就不可行了。因此,贝叶斯计算的本质其实为:积分

我们知道后验均值、后验方差、后验区间、后验概率、预测分布、模型检查量,几乎都可以写成某种积分:

E(h(θ)y)=h(θ)p(θy)dθE(h(\theta)\mid y)=\int h(\theta)p(\theta\mid y)d\theta

所以贝叶斯计算并不只是从后验抽样,它真正要解决的是:如何在复杂的高维概率分布下,稳定地估计这些积分

基本概念

归一化密度和未归一化密度

我们把想要模拟或者积分的分布叫做目标分布(target distribution),记为:p(θy)p(\theta\mid y)。但是在实际计算中,我们常常不直接知道归一化后的 p(θy)p(\theta\mid y),而只知道一个与其成比例的函数:q(θy)q(\theta\mid y)

其中:

p(θy)=q(θy)q(θy)dθp(\theta\mid y)=\frac{q(\theta\mid y)}{\int q(\theta\mid y)d\theta}

这里的 q(θy)q(\theta\mid y) 就是未归一化密度(unnormalized density)。在贝叶斯定理中,最典型的未归一化密度是:

q(θy)=p(θ)p(yθ)q(\theta\mid y)=p(\theta)p(y\mid \theta)

因为在贝叶斯公式里:

p(θy)=p(θ)p(yθ)p(y)p(\theta\mid y)=\frac{p(\theta)p(y\mid \theta)}{p(y)}

而边际似然:p(y)=p(θ)p(yθ)dθp(y)=\int p(\theta)p(y\mid \theta)d\theta 通常难以计算。但很多算法不需要知道 p(y)p(y),因为它只与数据 yy 有关,不随 θ\theta 改变。我们在实际应用时,我们并不追求归一化的密度。

很多抽样算法只需要比较两个参数值 θ\thetaθ\theta' 哪一个后验密度更高,此时归一化常数会抵消:

p(θy)p(θy)=q(θy)q(θy)\frac{p(\theta'\mid y)}{p(\theta\mid y)}=\frac{q(\theta'\mid y)}{q(\theta\mid y)}

这就是为什么现代贝叶斯软件通常只要求用户写出 log posterior kernel,即 logq(θy)\log q(\theta\mid y)

使用对数密度

在实际计算里,应该尽可能使用对数密度:logq(θy)\log q(\theta\mid y)

原因很简单:概率密度、似然值、后验密度常常是许多小数相乘,直接计算容易出现 underflow;有时也会因为指数项过大出现 overflow。例如,如果:

q(θy)=p(θ)i=1np(yiθ)q(\theta\mid y)=p(\theta)\prod_{i=1}^n p(y_i\mid \theta)

那么计算对数以后:

logq(θy)=logp(θ)+i=1nlogp(yiθ)\log q(\theta\mid y)=\log p(\theta)+\sum_{i=1}^n\log p(y_i\mid \theta)

乘法变成加法,数值上更稳定,不会出现数值超过计算机的最大长度。如果算法中需要计算两个密度的比值,也先计算 log ratio:

q(θy)q(θy)=exp(logq(θy)logq(θy))\begin{aligned} \frac{q(\theta'\mid y)}{q(\theta\mid y)} &=\exp\left(\log q(\theta'\mid y)-\log q(\theta\mid y)\right) \end{aligned}

现代计算中 log density 是默认语言。

Stan、PyMC、NumPyro、Turing 等概率编程系统本质上都是让用户定义一个 log density,然后由算法自动完成梯度、采样或者近似。特别是在 Hamiltonian Monte Carlo 中,算法需要 θlogq(θy)\nabla_\theta \log q(\theta\mid y),所以自动微分和 log density 几乎是现代贝叶斯计算的基础设施。

数值积分

贝叶斯推断中最常见的统计量是后验期望:

E(h(θ)y)=h(θ)p(θy)dθE(h(\theta)\mid y)=\int h(\theta)p(\theta\mid y)d\theta

这里的 h(θ)h(\theta) 可以是任意我们关心的函数。例如:

  • 如果 h(θ)=θh(\theta)=\theta,就是后验均值;
  • 如果 h(θ)=I(θ>0)h(\theta)=I(\theta>0),就是后验概率 Pr(θ>0y)\Pr(\theta>0\mid y)
  • 如果 h(θ)=(θE(θy))2h(\theta)=(\theta-E(\theta\mid y))^2,就是后验方差;
  • 如果 h(θ)h(\theta) 代表未来预测量,就是预测分布的总结。

模拟方法

如果我们可以从后验分布中抽到 SS 个样本:θ1,θ2,,θSp(θy)\theta^1,\theta^2,\ldots,\theta^S\sim p(\theta\mid y)

那么可以用样本平均估计后验期望:

E^S(h)=1Ss=1Sh(θs)\hat E_S(h)=\frac{1}{S}\sum_{s=1}^S h(\theta^s)

这里上标 ss 表示第 ss 次模拟抽样。如果 θs\theta^s 是从 p(θy)p(\theta\mid y) 独立抽出的,那么:

E(E^S(h)y)=E(1Ss=1Sh(θs)y)=1Ss=1SE(h(θs)y)=E(h(θ)y)\begin{aligned} E(\hat E_S(h)\mid y) &=E\left(\frac{1}{S}\sum_{s=1}^S h(\theta^s)\mid y\right)\\ &=\frac{1}{S}\sum_{s=1}^S E(h(\theta^s)\mid y)\\ &=E(h(\theta)\mid y) \end{aligned}

也就是说,样本平均是后验期望的无偏估计。它的方差为:

var(E^S(h)y)=var(1Ss=1Sh(θs)y)=1S2s=1Svar(h(θs)y)=var(h(θ)y)S\begin{aligned} \operatorname{var}(\hat E_S(h)\mid y) &=\operatorname{var}\left(\frac{1}{S}\sum_{s=1}^S h(\theta^s)\mid y\right)\\ &=\frac{1}{S^2}\sum_{s=1}^S\operatorname{var}(h(\theta^s)\mid y)\\ &=\frac{\operatorname{var}(h(\theta)\mid y)}{S} \end{aligned}

所以 Monte Carlo 误差大约是:

se(E^S(h))sd(h(θ)y)S\operatorname{se}(\hat E_S(h))\approx \frac{\operatorname{sd}(h(\theta)\mid y)}{\sqrt S}

这给了我们一个非常直接的判断:抽样数 SS 越大,计算误差越小,但误差下降速度只有 1/S1/\sqrt S

1/S1/\sqrt S 是 Monte Carlo 的温柔和残酷。

它温柔在于:维度再高,只要能从目标分布抽样,样本平均仍然有这个基本收敛速度。它残酷在于:如果想把误差缩小 10 倍,通常需要 100 倍的抽样量。因此真正高效的贝叶斯计算,不是盲目增加 SS,而是让每一个样本更接近有效样本。

确定性积分方法

确定性数值积分不是随机抽样,而是在若干点 θs\theta_s 上计算积分函数,并用权重 wsw_s 加权:

E(h(θ)y)s=1Swsh(θs)p(θsy)E(h(\theta)\mid y)\approx \sum_{s=1}^S w_s h(\theta_s)p(\theta_s\mid y)

如果使用未归一化密度,则更常见的形式是:

E(h(θ)y)=h(θ)q(θy)dθq(θy)dθs=1Swsh(θs)q(θsy)s=1Swsq(θsy)\begin{aligned} E(h(\theta)\mid y) &=\frac{\int h(\theta)q(\theta\mid y)d\theta}{\int q(\theta\mid y)d\theta}\\ &\approx \frac{\sum_{s=1}^S w_s h(\theta_s)q(\theta_s\mid y)} {\sum_{s=1}^S w_s q(\theta_s\mid y)} \end{aligned}

低维情况下,网格积分、Simpson 法、高斯求积等方法可能很有效。但在高维空间中,网格点数量会迅速爆炸。假设每一维取 NN 个网格点,维度为 dd,那么总网格点数就是:NdN^d.

如果 N=100,d=10N=100,d=10,那么需要 10010=1020100^{10}=10^{20} 个点,这显然不可行,出现维度爆炸的问题。在大数据的时代,这看着很鸡肋,但这放在现在仍然很有用,例如 Laplace approximation、积分嵌套拉普拉斯近似(INLA)、变分推断、稀疏网格、贝叶斯求积等。但它们往往依赖特殊结构,或者作为 MCMC 的初始化、加速、诊断工具。

分布近似

分布近似的想法是:如果真正的后验分布 p(θy)p(\theta\mid y) 太复杂,我们可以用一个更简单的分布 g(θ)g(\theta) 去近似它,然后在 g(θ)g(\theta) 下进行积分、抽样或者初始化。

最经典的是正态近似。设:

θ^=argmaxθlogq(θy)\hat\theta=\arg\max_\theta \log q(\theta\mid y)

也就是后验众数。对 logq(θy)\log q(\theta\mid y)θ^\hat\theta 附近做二阶 Taylor 展开:

logq(θy)logq(θ^y)+(θθ^)Tlogq(θ^y)+12(θθ^)T2logq(θ^y)(θθ^)+o(θ)=logq(θ^y)12(θθ^)TH(θθ^)\begin{aligned} \log q(\theta\mid y) &\approx \log q(\hat\theta\mid y) +(\theta-\hat\theta)^T\nabla \log q(\hat\theta\mid y)+\frac{1}{2}(\theta-\hat\theta)^T\nabla^2\log q(\hat\theta\mid y)(\theta-\hat\theta) + o(\theta)\\ &=\log q(\hat\theta\mid y) -\frac{1}{2}(\theta-\hat\theta)^T H(\theta-\hat\theta) \end{aligned}

其中:

H=2logq(θ^y)H=-\nabla^2\log q(\hat\theta\mid y)

如果 HH 是正定矩阵,则:

p(θy)N(θ^,H1)p(\theta\mid y)\approx \operatorname{N}(\hat\theta,H^{-1})

这就是 Laplace approximation 的基本形式。归一化常数也可以近似为:

q(θy)dθq(θ^y)exp[12(θθ^)TH(θθ^)]dθ=q(θ^y)(2π)d/2H1/2\begin{aligned} \int q(\theta\mid y)d\theta &\approx \int q(\hat\theta\mid y) \exp\left[-\frac{1}{2}(\theta-\hat\theta)^T H(\theta-\hat\theta)\right]d\theta\\ &=q(\hat\theta\mid y)(2\pi)^{d/2}|H|^{-1/2} \end{aligned}

分布近似的优点和代价。

正态近似快、清楚、容易解释,但是它会压平偏态、厚尾和多峰结构。对于简单、数据量大、后验接近正态的问题,它可能很好;对于层级模型、弱识别模型、混合模型,它可能非常误导。因此分布近似常常在一开始接触数据的时候使用,可能更多的看成一个预实验的角度出发去检验数据分布。

另外,这个在参数估计方法里也经常用到,比如Delta法

粗略估计:先获得后验的位置感

在使用复杂算法之前,先用简单方法得到目标分布的大致位置。

例如:

  • 在层级模型中,先粗略估计超参数 ϕ\phi,再估计条件后验中的参数 γϕ,y\gamma\mid \phi,y
  • 在缺失数据问题中,先用简单插补获得初始值;
  • 在复杂回归模型中,先拟合简化模型,观察参数数量级和方向;
  • 在高维模型中,先找到后验众数或者近似均值,作为抽样算法的起点。

直接模拟

在简单模型中,我们可以直接从后验分布抽样。例如在共轭模型中:

θy某个标准分布\theta\mid y\sim \text{某个标准分布}

此时只需要调用对应的随机数生成器。

更复杂一点的情况是例如多参数模型里把联合后验分解为若干部分。例如:

p(θ,ϕy)=p(θϕ,y)p(ϕy)p(\theta,\phi\mid y)=p(\theta\mid \phi,y)p(\phi\mid y)

如果我们可以先从 p(ϕy)p(\phi\mid y) 抽样,再从 p(θϕ,y)p(\theta\mid \phi,y) 抽样,那么就可以得到联合后验抽样:

ϕsp(ϕy),θsp(θϕs,y)\phi^s\sim p(\phi\mid y),\qquad \theta^s\sim p(\theta\mid \phi^s,y)

这个思想在后续的层级模型中非常重要。它本质上是利用模型的条件结构,把一个难抽的联合分布拆成更容易处理的部分。

网格近似和离散抽样

对于低维参数,可以在一组网格点上计算目标密度:

θ1,θ2,,θN\theta_1,\theta_2,\ldots,\theta_N

然后用离散分布近似连续后验:

Pr(θ=θiy)q(θiy)j=1Nq(θjy)\Pr(\theta=\theta_i\mid y) \approx \frac{q(\theta_i\mid y)}{\sum_{j=1}^N q(\theta_j\mid y)}

如果网格点不是等间距,更合理的做法是把每个点代表的体积也放进权重:

Pr(θ=θiy)q(θiy)Δij=1Nq(θjy)Δj\Pr(\theta=\theta_i\mid y) \approx \frac{q(\theta_i\mid y)\Delta_i}{\sum_{j=1}^N q(\theta_j\mid y)\Delta_j}

一旦有了离散概率,就可以通过**逆 CDF **方法抽样:先抽一个 UUniform(0,1)U\sim \operatorname{Uniform}(0,1),再找到使累计概率超过 UU 的网格点。

网格法适合学习,不适合高维通用计算。

网格法适合帮助我们理解后验形状,尤其是 1 维或 2 维参数。但它不适合高维模型,因为维度灾难会让计算量迅速爆炸。现代实践中,网格更常用于可视化、低维的敏感性分析,或者用于检查更复杂算法是否给出合理结果。

后验预测分布的模拟

一旦我们已经从后验分布得到样本:

θ1,θ2,,θSp(θy)\theta^1,\theta^2,\ldots,\theta^S\sim p(\theta\mid y)

后验预测分布就很容易模拟。对每一个 θs\theta^s,从条件预测分布中抽一个:

y~sp(y~θs)\tilde y^s\sim p(\tilde y\mid \theta^s)

于是:y~1,y~2,,y~S\tilde y^1,\tilde y^2,\ldots,\tilde y^S 就可以看作来自 p(y~y)p(\tilde y\mid y) 的模拟样本,其背后的积分是:

p(y~y)=p(y~,θy)dθ=p(y~θ,y)p(θy)dθ=p(y~θ)p(θy)dθ\begin{aligned} p(\tilde y\mid y) &=\int p(\tilde y,\theta\mid y)d\theta\\ &=\int p(\tilde y\mid \theta,y)p(\theta\mid y)d\theta\\ &=\int p(\tilde y\mid \theta)p(\theta\mid y)d\theta \end{aligned}

最后一个等号使用的是条件独立:给定参数 θ\theta 后,未来数据 y~\tilde y 与已经观测到的数据 yy 独立。如果我们只用 θ^\hat\theta 去预测,那么忽略了参数不确定性。后验预测分布会把两层不确定性都放进去:一层是 θ\theta 的后验不确定性,另一层是即使 θ\theta 已知,未来观测 y~\tilde y 也有随机波动。

拒绝采样

拒绝采样(rejection sampling)用于从目标分布 p(θy)p(\theta\mid y) 中产生独立样本。它需要一个容易抽样的近似函数 g(θ)g(\theta),并要求存在一个常数 MM,使得:

p(θy)Mg(θ)p(\theta\mid y)\le M g(\theta)

直觉上,Mg(θ)Mg(\theta) 是覆盖目标密度 p(θy)p(\theta\mid y) 的上包络函数。且应注意,g(θ)dθ=C\int g(\theta) d\theta = C

拒绝采样示意图

图中上方曲线是 Mg(θ)Mg(\theta),下方曲线是目标密度 p(θy)p(\theta\mid y)。在某个候选点处,接受概率等于下方高度与上方高度的比值。

拒绝采样算法可以写成:

  1. 从与 g(θ)g(\theta) 成比例的分布中抽取候选值 θ\theta

  2. 以概率 p(θy)Mg(θ)\frac{p(\theta\mid y)}{Mg(\theta)} \\ 接受这个 θ\theta

  3. 如果拒绝,就回到第一步。

接受后的样本服从目标分布,假设 g(θ)g(\theta) 本身已经是归一化密度。候选值为 θ\theta 且被接受的联合密度正比于:

g(θ)p(θy)Mg(θ)g(\theta)\frac{p(\theta\mid y)}{Mg(\theta)}

因此:

p(θaccepted,y)=g(θ)p(θy)Mg(θ)g(u)p(uy)Mg(u)du=1Mp(θy)1Mp(uy)du=p(θy)\begin{aligned} p(\theta\mid \text{accepted},y) &=\frac{g(\theta)\frac{p(\theta\mid y)}{Mg(\theta)}} {\int g(u)\frac{p(u\mid y)}{Mg(u)}du}\\ &=\frac{\frac{1}{M}p(\theta\mid y)} {\frac{1}{M}\int p(u\mid y)du}\\ &=p(\theta\mid y) \end{aligned}

即证明了拒绝采样的正确性。

如果 g(θ)g(\theta) 只是未归一化函数,设:

G=g(θ)dθ,r(θ)=g(θ)GG=\int g(\theta)d\theta,\qquad r(\theta)=\frac{g(\theta)}{G}

那么从 gg 成比例的分布抽样就是从 rr 抽样,推导只是多了一个常数 GG,最终仍然会抵消。

拒绝采样的效率

拒绝采样的接受率为:

Pr(accepted)=g(θ)p(θy)Mg(θ)dθ=1M\begin{aligned} \Pr(\text{accepted}) &=\int g(\theta)\frac{p(\theta\mid y)}{Mg(\theta)}d\theta\\ &=\frac{1}{M} \end{aligned}

这里假设 gg 是归一化密度。如果 MM 很大,接受率就很低。理想情况下,g(θ)g(\theta)p(θy)p(\theta\mid y) 成比例,此时可以用很小的 MM,几乎所有候选点都会被接受。

拒绝采样的优点是样本独立,且算法“自我监控”:如果接受率很低,我们马上知道近似函数 gg 不好。缺点是高维问题中很难找到合适的包络函数,MM 往往巨大,导致大量候选样本被浪费。

如果用一个近似分布 gg 来帮助计算,gg 必须覆盖目标分布的重要区域,尤其不能尾部太薄。

重要性采样

重要性采样(importance sampling)不是直接从目标分布抽样,而是从一个容易抽样的近似分布 g(θ)g(\theta) 中抽样,然后用权重修正。

我们希望计算:

E(h(θ)y)=h(θ)q(θy)dθq(θy)dθE(h(\theta)\mid y)=\frac{\int h(\theta)q(\theta\mid y)d\theta}{\int q(\theta\mid y)d\theta}

如果从 g(θ)g(\theta) 抽样,那么:

E(h(θ)y)=h(θ)q(θy)dθq(θy)dθ=h(θ)q(θy)g(θ)g(θ)dθq(θy)g(θ)g(θ)dθ\begin{aligned} E(h(\theta)\mid y) &=\frac{\int h(\theta)q(\theta\mid y)d\theta}{\int q(\theta\mid y)d\theta}\\ &=\frac{\int h(\theta)\frac{q(\theta\mid y)}{g(\theta)}g(\theta)d\theta} {\int \frac{q(\theta\mid y)}{g(\theta)}g(\theta)d\theta} \end{aligned}

其中重要性权重为:

w(θs)=q(θsy)g(θs)w(\theta^s)=\frac{q(\theta^s\mid y)}{g(\theta^s)}

g(θ)g(\theta) 中抽取 θ1,,θSg(θ)\theta^1,\ldots,\theta^S\sim g(\theta)

则有自归一化重要性采样估计量:

E^IS(h)=1Ss=1Sh(θs)w(θs)1Ss=1Sw(θs)=s=1Sh(θs)w(θs)s=1Sw(θs)\begin{aligned} \hat E_{\operatorname{IS}}(h) &= \frac{\frac{1}{S}\sum_{s=1}^S h(\theta^s)w(\theta^s)} {\frac{1}{S}\sum_{s=1}^S w(\theta^s)}\\ &= \frac{\sum_{s=1}^S h(\theta^s)w(\theta^s)} {\sum_{s=1}^S w(\theta^s)} \end{aligned}

归一化重要性权重为:

w~(θs)=w(θs)s=1Sw(θs)\tilde w(\theta^s)=\frac{w(\theta^s)}{\sum_{s'=1}^S w(\theta^{s'})}

则估计量可以写成更直观的加权平均:

E^IS(h)=s=1Sw~(θs)h(θs)\hat E_{\operatorname{IS}}(h)=\sum_{s=1}^S \tilde w(\theta^s)h(\theta^s)

重要性采样的有效样本量

如果所有权重都相等,那么每个样本贡献一样,重要性采样接近普通 Monte Carlo。如果少数样本权重极大,那么估计几乎由少数点决定,实际有效样本量会很低。

有效样本量近似:

Seff=1s=1Sw~(θs)2S_{\operatorname{eff}}=\frac{1}{\sum_{s=1}^S \tilde w(\theta^s)^2}

若所有权重相等,w~s=1/S\tilde w_s=1/S,则:(这里等权重会导致信息丢失和纳入重复抽样,但即便如此,这也很方便进行计算)

Seff=1s=1S(1/S)2=1S1/S2=S\begin{aligned} S_{\operatorname{eff}} &=\frac{1}{\sum_{s=1}^S(1/S)^2}\\ &=\frac{1}{S\cdot 1/S^2}\\ &=S \end{aligned}

如果只有一个样本权重几乎为 1,其余几乎为 0,则:

Seff1S_{\operatorname{eff}}\approx 1

也就是说,虽然你抽了 SS 个样本,但实际上只有一个样本在发挥作用。

权重尾部问题

重要性采样最怕的是:大多数权重很小,但偶尔出现极大权重。此时估计量可能看似稳定,实际上漏掉了罕见但极重要的区域。

尤其当目标分布 q(θy)q(\theta\mid y) 的尾部比近似分布 g(θ)g(\theta) 更厚时,重要性权重:

w(θs)=q(θsy)g(θs)w(\theta^s)=\frac{q(\theta^s\mid y)}{g(\theta^s)}

可能出现极端大值。此时估计方差可能很大,甚至不存在。

重要性分布的尾部必须足够厚。

如果 gg 的尾部比目标分布更薄,那么它很少抽到目标分布尾部的重要区域;但一旦抽到,权重会巨大。一个实用原则是:作为 proposal 的 gg 应该覆盖目标分布的所有重要区域,尾部宁可厚一点,不要薄。(即给予尾部一定的密度)

重要性重采样

重要性采样得到的是带权样本。如果我们想得到等权样本,可以做重要性重采样(importance resampling,也叫 sampling-importance resampling, SIR)。

步骤如下:

  1. g(θ)g(\theta) 中抽取候选样本:θ1,,θS\theta^1,\ldots,\theta^S

  2. 计算权重:

w(θs)=q(θsy)g(θs)w(\theta^s)=\frac{q(\theta^s\mid y)}{g(\theta^s)}
  1. 按照概率:
w~(θs)=w(θs)s=1Sw(θs)\tilde w(\theta^s)=\frac{w(\theta^s)}{\sum_{s'=1}^S w(\theta^{s'})}

从候选样本中重采样。

如果不放回抽取 k<Sk<S 个样本,可以减少少数高权重点被重复抽中的问题;如果放回抽样,则更接近传统的重采样思想。

PSIS 是重要性采样的现代版本之一。

在BDA3 里提示了 Pareto-smoothed importance resampling。现在更常用的是 Pareto smoothed importance sampling(PSIS):它会对最大的一批重要性权重拟合 generalized Pareto distribution,并平滑极端权重。Vehtari et al. 的 PSIS 论文已在 2024 年发表于 JMLR,并提出 Pareto k^\hat k 作为权重尾部稳定性的诊断量。直观地说,k^\hat k 越大,说明权重尾部越危险,重要性采样估计越不可靠。

Pareto-k^\hat k diagnostic

重要性采样的问题是右尾太危险:大部分权重很小,少数权重极大,最后期望估计几乎被少数样本支配。PSIS 的想法是:不要只看权重的均值或者方差,而是直接检查最大一批权重的尾部形状。

在极值理论中,超过高阈值的尾部超额分布常常可以用 generalized Pareto distribution(GPD)近似。PSIS 正是对最大的若干个重要性权重拟合 GPD,并用估计出来的形状参数 k^\hat k 判断尾部有多厚。

标准化的 GPD 可以写作:

Fk(x)={1(1+kx)1/k,k0,1exp(x),k=0,x0F_k(x)= \begin{cases} 1-(1+kx)^{-1/k}, & k\neq 0,\\ 1-\exp(-x), & k=0, \end{cases} \qquad x\ge 0

对应密度为:

fk(x)={(1+kx)1/k1,k0,exp(x),k=0.f_k(x)= \begin{cases} (1+kx)^{-1/k-1}, & k\neq 0,\\ \exp(-x), & k=0. \end{cases}

广义 Pareto 分布的尾部和形状参数 k

图中右侧使用 log-scale 展示尾部概率。可以看到,kk 越大,尾部下降越慢,也就越容易出现极端大的重要性权重。如果尾部近似满足 GPD 且 k>0k>0,那么阶数为 mm 的矩存在大致要求 m<1/km<1/k,等价于 k<1/mk<1/m。因为尾部密度满足类似幂律衰减:

E(Xm)AxmCx1/k1dx=CAxm1/k1dx<m1k1<1m<1kk<1m\begin{aligned} E(X^m) &\approx \int_A^\infty x^m Cx^{-1/k-1}dx\\ &=C\int_A^\infty x^{m-1/k-1}dx\\ &<\infty \quad \Longleftrightarrow \quad m-\frac{1}{k}-1<-1\\ &\Longleftrightarrow m<\frac{1}{k} \quad \Longleftrightarrow \quad k<\frac{1}{m} \end{aligned}

因此可以得到几个非常重要的判断:

  • k<1k<1:权重分布的均值有限;
  • k<1/2k<1/2:权重分布的方差有限;
  • kk 越接近或者超过 1,重要性采样对期望的估计越不稳定,甚至均值本身都可能无法良好定义。

这也是为什么 Pareto-k^\hat k diagnostic 对所有依赖期望的估计都很重要。重要性采样、PSIS-LOO、prior/likelihood sensitivity 这类方法,最后通常都要计算某个加权期望。如果权重尾部太厚,那么“期望”这个目标本身就会变得非常脆弱。

早期实践中经常使用固定经验阈值:k^<0.5\hat k<0.5 很好,0.5<k^<0.70.5<\hat k<0.7 还可以谨慎使用,k^>0.7\hat k>0.7 通常要警惕。现在 loo 文档采用更细的样本量相关阈值:

k^<min(11log10(S),0.7)\hat k < \min\left(1-\frac{1}{\log_{10}(S)},0.7\right)

时,PSIS 估计和相应 MCSE 通常被认为可靠。若 k^\hat k 低于 0.7 但高于样本量相关阈值,增加有效样本量可能有帮助;若 k^0.7\hat k\ge 0.7,估计常有较大偏差,单纯增加样本未必解决问题;若 k^1\hat k\ge 1,目标权重分布估计为均值不有限,PSIS 估计和 MCSE 都不应被信任。 当 k^\hat k 接近 0.5 时,更多有效抽样通常有助于降低 k^\hat k 估计本身的不确定性,从而判断真实尾部是否确实处在 k<0.5k<0.5 的方差有限区间;但如果真实尾部很厚,增加样本只会更清楚地暴露问题,而不会从根本上修复 proposal 与目标分布不匹配。

在 PSIS-LOO 中的用途

PSIS-LOO 想用完整数据后验 p(θy)p(\theta\mid y) 的样本,近似留一后验 p(θyi)p(\theta\mid y_{-i})。对第 ii 个观测,原始重要性权重大致与下式成比例:

ris1p(yiθs)r_i^s\propto \frac{1}{p(y_i\mid \theta^s)}

如果某个观测 yiy_i 对后验影响很大,那么完整数据后验和留一后验差异会很大,risr_i^s 的尾部就会很厚,Pareto k^i\hat k_i 会升高。于是 k^i\hat k_i 不只是一个数值诊断,它也可以解释为观测影响力诊断:哪些点一旦被留出,模型后验会明显改变。

当 PSIS-LOO 中出现高 k^\hat k 时,常见处理方式包括:

  • 使用 moment matching 改善重要性采样;
  • 对问题观测做 exact LOO 或者 K-fold cross-validation;
  • 检查是否有异常值、高影响点、模型错设;
  • 使用更稳健的 likelihood 或更合理的层级结构。

模拟样本数量计算

后验模拟通常用于报告:

  • 后验中位数;
  • 后验均值;
  • 50% 或 95% 后验区间;
  • 某个事件的后验概率;
  • 后验预测分布;
  • 后验预测检查量。

不同目标需要的模拟样本数不同。

后验均值的 Monte Carlo 误差

设标量参数 θ\theta 的后验标准差为 σθ\sigma_\theta,用 SS 个独立后验样本估计后验均值:

θˉ=1Ss=1Sθs\bar\theta=\frac{1}{S}\sum_{s=1}^S \theta^s

则:

sd(θˉy)=var(1Ss=1Sθsy)=1S2s=1Svar(θsy)=σθS\begin{aligned} \operatorname{sd}(\bar\theta\mid y) &=\sqrt{\operatorname{var}\left(\frac{1}{S}\sum_{s=1}^S\theta^s\mid y\right)}\\ &=\sqrt{\frac{1}{S^2}\sum_{s=1}^S\operatorname{var}(\theta^s\mid y)}\\ &=\frac{\sigma_\theta}{\sqrt S} \end{aligned}

实际中用样本标准差 sθs_\theta 代替 σθ\sigma_\theta

MCSE(θˉ)sθS\operatorname{MCSE}(\bar\theta)\approx \frac{s_\theta}{\sqrt S}

如果我们关心的是参数本身的不确定性,后验标准差是 σθ\sigma_\theta;如果再加上有限模拟导致的计算误差,总标准差近似为:

σθ2+σθ2S=σθ1+1S\begin{aligned} \sqrt{\sigma_\theta^2+\frac{\sigma_\theta^2}{S}} &=\sigma_\theta\sqrt{1+\frac{1}{S}} \end{aligned}

S=100S=100 时:

1+11001.005\sqrt{1+\frac{1}{100}}\approx 1.005

因此对于粗略后验总结,100 个独立样本已经可能够用。但是样本必须接近独立,且我们关心的是普通后验总结,而不是极端尾部或罕见事件。

后验概率的 Monte Carlo 误差

如果我们关心事件 AA 的后验概率:

p=Pr(Ay)p=\Pr(A\mid y)

用模拟估计:

p^=1Ss=1SI(θsA)\hat p=\frac{1}{S}\sum_{s=1}^S I(\theta^s\in A)

那么:

var(p^y)=var(1Ss=1SI(θsA)y)=p(1p)S\begin{aligned} \operatorname{var}(\hat p\mid y) &=\operatorname{var}\left(\frac{1}{S}\sum_{s=1}^S I(\theta^s\in A)\mid y\right)\\ &=\frac{p(1-p)}{S} \end{aligned}

所以:

se(p^)p^(1p^)S\operatorname{se}(\hat p)\approx \sqrt{\frac{\hat p(1-\hat p)}{S}}

pp 接近 0.5 时,S=100S=100 的标准误约为:

0.5(10.5)100=0.05\sqrt{\frac{0.5(1-0.5)}{100}}=0.05

如果希望标准误约为 0.01,则需要:

S0.250.012=2500S\approx \frac{0.25}{0.01^2}=2500

分位数和罕见事件需要更多样本

后验分位数的 Monte Carlo 误差通常比均值更难稳定。设 ξα\xi_\alpha 是后验的 α\alpha 分位数,后验密度在该点为 f(ξα)f(\xi_\alpha),则样本分位数的近似标准误为:

se(ξ^α)α(1α)Sf(ξα)\begin{aligned} \operatorname{se}(\hat\xi_\alpha) &\approx \frac{\sqrt{\alpha(1-\alpha)}}{\sqrt S f(\xi_\alpha)} \end{aligned}

如果 α=0.025\alpha=0.0250.9750.975,并且尾部密度 f(ξα)f(\xi_\alpha) 很小,那么分位数估计会比中位数更不稳定。

罕见事件也类似。如果某事件真实概率是 0.00030.0003,那么 S=200S=200 个样本很可能一个都看不到,于是简单估计会给出 0。这不是事件不可能发生,而是模拟样本太少。

抽样数和有效样本量

BDA3 书本里为了说明概念,说很多例子中 100 到 2000 个模拟样本已经够表达主要推断。但在现代 MCMC 实践中,样本之间通常相关,所以应该看 effective sample size(ESS)、Monte Carlo standard error(MCSE)、R^\hat R、能量诊断、divergence 等指标,而不是只看总 draws 数。ArviZ 当前诊断接口就包括 ESS、rank-normalized split R^\hat R、MCSE 和 BFMI 等指标。

编程计算

Stan

Stan 的设计目标是用更高效的通用算法拟合连续参数贝叶斯模型。它使用 Hamiltonian Monte Carlo(HMC)及其自适应版本 No-U-Turn Sampler(NUTS),并通过自动微分计算 log density 的梯度。

现代概率编程生态

现在的贝叶斯计算生态已经比 BDA3 出版时丰富很多。常见工具包括:

  • Stan:强调稳定的 HMC/NUTS、静态模型语言、C++ 后端;
  • PyMC:Python 生态,常与 ArviZ 一起做诊断和可视化;
  • NumPyro 和 BlackJAX:基于 JAX,强调自动微分、加速和可组合采样内核;
  • Turing.jl:Julia 生态中的概率编程框架;
  • INLA:适合某些 latent Gaussian models 的快速确定性近似;
  • 变分推断工具:用于大数据或需要快速近似的场景。

贝叶斯计算的调试

贝叶斯计算需要调试。不是只有代码会出 bug,模型也会出 bug,数据也会出 bug,算法也可能被几何结构卡住。

假数据调试

假数据调试的基本步骤是:

  1. 选择一个合理的真实参数值 θ\theta
  2. 如果是层级模型,先选择超参数,再从条件先验中生成下层参数;
  3. 从数据生成模型中模拟假数据:
yfakep(yθ)y^{\operatorname{fake}}\sim p(y\mid \theta)
  1. 用同一个模型对 yfakey^{\operatorname{fake}} 做后验推断;
  2. 比较后验推断是否能覆盖或者恢复真实 θ\theta

如果模型和计算都正确,那么后验区间应当有合适的覆盖性质。例如一个 50% 后验区间,在重复模拟下应该大约 50% 的时候覆盖真实参数。

这个性质可以这样理解。设 Cα(y)C_\alpha(y) 是一个后验概率为 α\alpha 的区间,即:

Pr(θCα(y)y)=α\Pr(\theta\in C_\alpha(y)\mid y)=\alpha

如果 θp(θ)\theta\sim p(\theta)yp(yθ)y\sim p(y\mid \theta),则:

Pr(θCα(y))=I(θCα(y))p(θ)p(yθ)dθdy=p(y)[I(θCα(y))p(θy)dθ]dy=p(y)αdy=α\begin{aligned} \Pr(\theta\in C_\alpha(y)) &=\int \int I(\theta\in C_\alpha(y))p(\theta)p(y\mid \theta)d\theta dy\\ &=\int p(y)\left[\int I(\theta\in C_\alpha(y))p(\theta\mid y)d\theta\right]dy\\ &=\int p(y)\alpha dy\\ &=\alpha \end{aligned}

残差图和覆盖率检查

如果模型参数很多,比如层级模型中有许多 θj\theta_j,可以对每个参数比较:

errorj=θjtrueE(θjyfake)\text{error}_j=\theta_j^{\operatorname{true}}-E(\theta_j\mid y^{\operatorname{fake}})

然后画 errorj\text{error}_j 对后验均值的图。如果计算正确,误差会围绕 0,且没有明显的聚集。

更直接的方法是检查:真实值落在 50%、80%、95% 后验区间中的比例是否接近对应概率。

SBC 是假数据调试的现代形式。

Simulation-Based Calibration(SBC)为假数据检查系统化。基本思想是:从先验抽真实参数 θ(0)\theta^{(0)},再模拟数据 yy,然后从 p(θy)p(\theta\mid y) 抽后验样本。如果计算正确,真实参数在后验样本中的 rank 应该近似均匀分布。Talts et al. 将 SBC 作为验证贝叶斯推断算法和模型实现的一般程序。2025 年还有 posterior SBC 的新进展,尝试在已观测数据条件下检查推断是否可靠;这类方法仍在发展中,但方向很重要。

这一节的计算方法可以整理成一张方法表格:

方法 核心思想 优点 主要风险
直接模拟 从后验或条件后验直接抽样 精确、简单 只适合结构简单或可分解模型
网格积分 在网格点上计算密度并归一化 直观、适合低维 维度灾难
分布近似 用正态、Laplace、变分族等近似后验 快,可用于初始化 可能低估不确定性、漏掉多峰和厚尾
拒绝采样 用包络分布 MgMg 覆盖目标分布 接受样本独立、正确性清楚 高维下接受率很低
重要性采样 gg 抽样,用 q/gq/g 加权 可重用已有样本,适合轻微目标变化 权重尾部可能极不稳定
PSIS/Pareto-k^\hat k 平滑最大重要性权重并估计尾部形状 可诊断 PSIS-LOO、priorsense 等期望估计是否可靠 k^\hat k 表示 proposal 与目标差异太大
重要性重采样 按重要性权重从候选样本中重采样 得到等权样本 少数高权重点可能支配结果
MCMC/HMC/NUTS 构造以目标分布为平稳分布的马尔可夫链 适合复杂高维后验 样本相关,需要诊断
假数据/SBC 用模拟数据检查计算是否校准 能发现实现错误和算法偏差 成本较高,设计检查量很重要