首页 > 解决方案 > Tensorflow MCMC 不会演化链状态

问题描述

总的来说,我对 tensorflow 和 MCMC 还很陌生。我正在用不同的模型做一些基本的计算,最基本的模型没有问题地收敛,并且从 MCMC 计算中得到了很好的结果。但是,当我使用更高级的模型时,我遇到了一个问题,即链状态永远不会从初始状态演变而来。

我通过以下代码调用采样器:

    nkernel = tfp.mcmc.HamiltonianMonteCarlo(
            target_log_prob_fn=_tf_lnlike,
            num_leapfrog_steps=5,
            step_size=0.1)
    adapt_kernel = tfp.mcmc.SimpleStepSizeAdaptation(
        inner_kernel=nkernel,
        num_adaptation_steps=num_burnin_steps,
        target_accept_prob=0.75)
    chains_states = tfp.mcmc.sample_chain(
        num_results=nresults,
        num_burnin_steps=num_burnin_steps,
        current_state=initial_state,
        kernel=adapt_kernel,
        trace_fn=None)

似然函数如下所示:

@tf.function
def _tf_lnlike(theta):
    y0 = tf.tensordot(tf.ones(theta.shape[0], dtype=dtype), data, axes=0)
    y0_err = tf.tensordot(tf.ones(theta.shape[0], dtype=dtype), data_err, axes=0)
    y_model = _tf_model(theta)
    return tf.math.reduce_sum(-0.5*((y_model-y0)/y0_err)**2, axis=1)
    

where_tf_model是一个相当复杂的函数(所以我不会在这里发布)。这本质上是试图拟合一些输入数据(它们是tf.constant)。我检查的第一件事是渐变,它的infnan来自_tf_model. 我认为解决该问题的最简单方法是将一个非常简单的数值梯度函数写入似然函数,因为该模型不可解析微分。_tf_lnlike现在返回一些合理的渐变,但我仍然对采样器有同样的问题。老实说,我对 tf 还不够熟悉,甚至无法诊断它为什么不工作,所以一些故障排除建议将不胜感激!

编辑:经过一番玩弄之后,它似乎与模型函数是否tf.reduce_sum在任何时候调用有关。

标签: pythontensorflowmcmctensorflow-probability

解决方案


如果不了解里面的内容,很难说太多_tf_model。如果它有 inf 或 nan 值或梯度,那可能会很麻烦,正如您已经看到的那样。但是,如果似然的曲率(二阶导数)非常尖锐,则对数似然对任何移动都非常敏感,因此任何提议都会被拒绝。是否有任何限制theta(必须是积极的等)?如果是这样,您可能希望使用TransformedTransitionKernel这些来强制执行。


推荐阅读