首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tensorflow MCMC不进化链状态

Tensorflow MCMC不进化链状态
EN

Stack Overflow用户
提问于 2020-12-30 05:24:05
回答 1查看 61关注 0票数 0

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

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

代码语言:javascript
复制
    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)

似然函数如下所示:

代码语言:javascript
复制
@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_modelinfnan值。我认为解决这个问题的最简单的方法是把一个非常简单的数值梯度函数写到似然函数中,因为这个模型在解析上是不可微的。_tf_lnlike现在返回一些合理的渐变,但我仍然有与采样器相同的问题。老实说,我对tf还不够熟悉,甚至不能诊断为什么它不能工作,所以对于故障排除的一些建议将不胜感激!

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

EN

回答 1

Stack Overflow用户

发布于 2021-01-07 02:25:32

在不了解_tf_model内部内容的情况下,很难说太多。如果它有inf或nan值或渐变,这可能会很麻烦,正如您已经看到的。但是,如果可能性的曲率(二阶导数)非常尖锐,那么对数可能性对任何移动都非常敏感,因此任何建议都将被拒绝。对theta是否有任何限制(必须是正的,等等)?如果是这样的话,您可能想要使用TransformedTransitionKernel来强制执行这些规则。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65498947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档