python - 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
)。我检查的第一件事是渐变,它的inf
值nan
来自_tf_model
. 我认为解决该问题的最简单方法是将一个非常简单的数值梯度函数写入似然函数,因为该模型不可解析微分。_tf_lnlike
现在返回一些合理的渐变,但我仍然对采样器有同样的问题。老实说,我对 tf 还不够熟悉,甚至无法诊断它为什么不工作,所以一些故障排除建议将不胜感激!
编辑:经过一番玩弄之后,它似乎与模型函数是否tf.reduce_sum
在任何时候调用有关。
解决方案
如果不了解里面的内容,很难说太多_tf_model
。如果它有 inf 或 nan 值或梯度,那可能会很麻烦,正如您已经看到的那样。但是,如果似然的曲率(二阶导数)非常尖锐,则对数似然对任何移动都非常敏感,因此任何提议都会被拒绝。是否有任何限制theta
(必须是积极的等)?如果是这样,您可能希望使用TransformedTransitionKernel
这些来强制执行。
推荐阅读
- javascript - 单击从数组javascript中获取按钮值?
- android - 在 CentOS 无头(无 GUI)服务器中运行 android 模拟器
- powershell - 平均 powershell中单个磁盘的磁盘写入队列长度性能计数器
- c++ - SDL2 未定义对“SDL_CreateWindowAndRenderer”的引用
- c++ - 如何验证字符串以确保没有小于或等于 1 的非数字和整数?
- kotlin - 快速排序越界 (Kotlin)
- reactjs - NextJS:关于下一个/链接预取的问题
- go - 恐慌:反映:在接口值上调用 reflect.Value.FieldByName
- python - Python Pandas 从每天开始的时差
- php - 过时的 WordPress 主题选项;jQuery 错误