一般来说,我是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)其中_tf_model是一个相当复杂的函数(所以我不在这里发布它)。这实际上是在尝试拟合一些输入数据(即tf.constant)。我检查的第一件事是渐变,它有来自_tf_model的inf或nan值。我认为解决这个问题的最简单的方法是把一个非常简单的数值梯度函数写到似然函数中,因为这个模型在解析上是不可微的。_tf_lnlike现在返回一些合理的渐变,但我仍然有与采样器相同的问题。老实说,我对tf还不够熟悉,甚至不能诊断为什么它不能工作,所以对于故障排除的一些建议将不胜感激!
编辑:经过一些尝试之后,它似乎与模型函数是否在任何时候调用tf.reduce_sum有关。
发布于 2021-01-07 02:25:32
在不了解_tf_model内部内容的情况下,很难说太多。如果它有inf或nan值或渐变,这可能会很麻烦,正如您已经看到的。但是,如果可能性的曲率(二阶导数)非常尖锐,那么对数可能性对任何移动都非常敏感,因此任何建议都将被拒绝。对theta是否有任何限制(必须是正的,等等)?如果是这样的话,您可能想要使用TransformedTransitionKernel来强制执行这些规则。
https://stackoverflow.com/questions/65498947
复制相似问题