Python 3.x tensorflow概率中非负参数的负值

Python 3.x tensorflow概率中非负参数的负值,python-3.x,tensorflow-probability,Python 3.x,Tensorflow Probability,我试着用张量流概率来拟合一个简单的Dirichlet多项式模型。浓度参数是gamma,我对它们进行了gamma(1,1)先验分布。这是一个模型,其中S是类别数,N是样本数: def dirichlet_model(S, N): gamma = ed.Gamma(tf.ones(S)*1.0, tf.ones(S)*1.0, name='gamma') y = ed.DirichletMultinomial(total_count=500., concentration=gamma

我试着用张量流概率来拟合一个简单的Dirichlet多项式模型。浓度参数是
gamma
,我对它们进行了gamma(1,1)先验分布。这是一个模型,其中S是类别数,N是样本数:

def dirichlet_model(S, N):
    gamma = ed.Gamma(tf.ones(S)*1.0, tf.ones(S)*1.0, name='gamma')
    y = ed.DirichletMultinomial(total_count=500., concentration=gamma, sample_shape=(N), name='y')
    return y

log_joint = ed.make_log_joint_fn(dirichlet_model)
但是,当我尝试使用HMC对此进行采样时,接受率为零,
gamma
的初始绘制包含负值。我做错什么了吗?浓度参数的负面建议不应该自动被拒绝吗?下面是我的采样代码:

def target_log_prob_fn(gamma):
  """Unnormalized target density as a function of states."""
  return log_joint(
    S=S, N=N,
    gamma=gamma,
    y=y_new)

num_results = 5000
num_burnin_steps = 3000

states, kernel_results = tfp.mcmc.sample_chain(
  num_results=num_results,
  num_burnin_steps=num_burnin_steps,
  current_state=[
    tf.ones([5], name='init_gamma')*5,
],
kernel=tfp.mcmc.HamiltonianMonteCarlo(
    target_log_prob_fn=target_log_prob_fn,
    step_size=0.4,
    num_leapfrog_steps=3))

gamma = states

with tf.Session() as sess:
  [
    gamma_,
    is_accepted_,
  ] = sess.run([
    gamma,
    kernel_results.is_accepted,
  ])

num_accepted = np.sum(is_accepted_)
print('Acceptance rate: {}'.format(num_accepted / num_results))

尝试减小步长以提高接受率。HMC的最佳接受率约为.651()。不知道为什么会看到负值。可能是接近零的浮点错误?您可以发布一些跑步日志吗?

尝试减小步长以提高接受率。HMC的最佳接受率约为.651()。不知道为什么会看到负值。可能是接近零的浮点错误?你能发布一些跑步记录吗?

啊,是的,我应该想到这一点——减小步长确实解决了这个问题,而且样本不再是负数。但是,了解为什么初始样本可能包含负值是很有意义的。我怎么得到日志呢?哦,所谓“日志”,我指的是当你看到负值时你打印的任何东西。IIRC Gamma容易受到小参数值周围数值稳定性问题的影响,但如果不深入研究,我还没有一个完整的理论来解释如何由此产生负值。啊,是的,我应该想到这一点——减小步长确实解决了这一问题,而且样本不再是负值。但是,了解为什么初始样本可能包含负值是很有意义的。我怎么得到日志呢?哦,所谓“日志”,我指的是当你看到负值时你打印的任何东西。IIRC Gamma容易受到围绕小参数值的数值稳定性问题的影响,但如果不深入挖掘,我还没有一个完整的理论来解释如何由此产生负面影响。