什么时候阻塞的 Metropolis 采样效率更高?

机器算法验证 采样 马尔可夫链蒙特卡罗 大都会黑斯廷斯
2022-04-08 10:25:10

考虑抽样问题p(x,y)使用 Metropolis 或 Metropolis-Hastings (MH) 算法。我可以提出样品p(x,y)直接,或者我可以做一个被阻止的版本,并交替提出样本p(xy)p(yx),我相信它也被称为Metropolis-within-Gibbs

我试图更好地理解后者在哪些条件下会更有效(在统计意义上;让我们暂时忽略计算考虑)。

例如,在(阻塞)吉布斯抽样中,接受概率始终为 1,直接从p(x,y),因为我们已经在第一步中获得了一个完美的样本,而对条件进行采样可能需要对变量进行多次迭代才能获得一个好的样本。

但是,如果我有一个不太完美的提案分布并且只有弱依赖关系xy,那么情况可能会有所不同。直觉上,如果我试图同时拒绝/接受它们,那么它们都必须是好的建议,这样我才能接受它们。所以接受提议可能是有意义的x并拒绝提议的y.

我做了一个小实验,我假设p(x,y)=p(x)p(y)是高斯分布和建议分布q(x,y)=q(x)q(y)也是高斯的。然后我要么尝试一次(联合)要么独立地接受这两个样本。下图中不同的线代表不同的proposal分布方差。独立接受它们似乎更有效。

我想用一些理论来支持我的直觉和数值实验。您将如何证明一种抽样策略比另一种更有效?指向讨论此问题的一些参考资料的指针将不胜感激。谢谢!

自相关

这是创建图形的代码的基本部分(这里XY意思不是xy)。

### JOINT ACCEPT/REJECT

X = randn(dim, num_samples)

for i in range(1, num_samples):
    # propose step
    X[:, i] = X[:, i - 1] + sigma * X[:, i]

    # accept/reject step
    if rand() > exp(0.5 * (sum(square(X[:, i - 1]), 0) - sum(square(X[:, i]), 0))):
        X[:, i] = X[:, i - 1]

### INDEPENDENT ACCEPT/REJECT

Y = randn(dim, num_samples)

for i in range(1, num_samples):
    # propose steps
    Y[:, i] = Y[:, i - 1] + sigma * Y[:, i]

    # accept/reject steps
    for j in range(dim):
        if rand() > exp(0.5 * (square(Y[j, i - 1]) - square(Y[j, i]))):
            Y[j, i] = Y[j, i - 1]
1个回答

不幸的是,我手头没有参考资料,但一般来说,两者之间的依赖程度越高XY,联合更新它们的效率越高。在你的例子中XY是独立的;如果,例如,XY仍然是联合高斯,但相关性为 0.99,单独更新它们会更糟。除非您的提案分布与您从中采样的分布具有大致相同的形状,否则联合更新它们也不会非常有效,这推动了自适应 MCMC 方法的开发,这些方法会随着时间的推移改变提案分布。这方面最著名的论文是Haario 等人。(2001 年),但从那时起,该领域开展了大量工作。通过良好的提案分布(通过使其自适应或仅仅通过幸运的猜测),高度相关情况下的联合更新与独立情况下的联合更新一样有效,而个体更新仍然非常缓慢。