为什么要定期跳过更新 MCMC 中的参数?

机器算法验证 贝叶斯 马尔可夫链蒙特卡罗 大都会黑斯廷斯
2022-03-25 16:04:05

我正在查看一位教授对进行 Metropolis-Hastings 更新的 MCMC 代码。是矩阵。(θ,α,β)θβ

在他的代码中,

1) 他两次θ(α,β)

2)每次更新β时,他只更新一小部分。ββ

这些技术有什么用?由于我不知道这种技术的名称,搜索一直没有结果。欢迎任何参考。

for (i in 1:S) { # Start big MCMC loop
  theta <- update_theta(alpha, beta, data, theta)

  if (i % 2 ==0) { # Only update beta and theta after update theta twice
    alpha <- update_alpha(theta, beta, data)
    beta <- update_beta(theta, alpha, data)
}

update_beta(theta, alpha, data) {
  # Only consider 25% of the beta matrix for update
  which_beta_to_update <- ifelse( runif(length(beta)) <= .25, 1, 0 )
  deviation <- matrix(runif(length(beta), -1, 1) * which_beta_to_update, nrow = nrow(beta)
  betastar <- beta + deviation

  # After this, calculate MH acceptance ratio and update beta
}
1个回答

这种类型的微调 (Gibbs) MCMC 适用于一个条件分布比问题中的其他条件分布最“粘性”的情况。例如,当更新整个向量导致高拒绝率或非常小的移动时关于混合多个 MCMC 步骤的早期参考资料是Tierney (1994)(Gareth Roberts 和 Jeff Rosenthal 也写了几篇关于比较 MCMC 步骤的混合的论文。)β

但是,使用给定所有其他参数的完整条件分布连续两次更新相同参数是浪费计算时间,因为这意味着从完全相同的分布模拟两次。代码的写法,好像是这样的:

theta <- update_theta(alpha, beta, data)

因为该update函数不依赖于 的当前值theta但是,当使用 Metropolis-Hastings 移动时,如果移动幅度有限,则使用多次迭代而不是一次迭代是有意义的。类似地,如果迭代调用update只修改整个参数的一部分theta,并且这些部分是随机选择的,这就是随机块吉布斯采样的一种形式。这是完全有效的。这是这种策略的一个例子还有一个老的(在Christophe Andrieu 的一篇更早的论文中,我们研究了块大小的自适应选择,如果不是给定块的移动次数。但这也可以合并到自适应 MCMC 算法中。)

推荐阅读:几天前出现在 arXiv 上的一篇最相关的论文是我昨天在博客上评论的 Luca Martino、Victor Elvira 和 Gustau Camps-Valls的 The Recycling Gibbs Sampler for Efficient Learning