在张量流概率变分推断中使用后验均匀(0,1)自定义DenseLocalReparameterization层

时间:2019-08-13 05:33:07

标签: python tensorflow inference tensorflow-probability bernoulli-probability

我正在尝试为我的体系结构自定义Tensorflow概率的DenseLocalReparameterization层。 基本上,我想将Bernoulli变量添加到该图层以将权重相乘。我想用0到1之间的均匀分布来初始化这些伯努利变量的概率,然后对这些概率进行变分推断(后验分布函数仍将是统一的,与先前相同)以进行变量选择。问题是,当我想评估这些变量的后验时,我得到了负数,所以很明显有些东西不起作用。我不确定如何使其工作,将不胜感激!

当前,我使用以下命令初始化另一组名为“ spike”的变量:

spike_posterior_fn=tfd.Uniform(low=0.0, high=tf.math.log(1.0)),
spike_posterior_tensor_fn=lambda d: d.sample(),
spike_prior_fn=tfd.Uniform(low=0.0, high=tf.math.log(1.0)),
spike_divergence_fn=lambda q, p, ignore: tfd.kl_divergence(q, p),

其他变量:

kernel_posterior_fn=tfp_layers_util.default_mean_field_normal_fn(),
kernel_posterior_tensor_fn=lambda d: d.sample(),
kernel_prior_fn=tfp_layers_util.default_multivariate_normal_fn,
kernel_divergence_fn=lambda q, p, ignore: tfd.kl_divergence(q, p),

包括偏见:

bias_posterior_fn=tfp_layers_util.default_mean_field_normal_fn(
is_singular=True),
bias_posterior_tensor_fn=lambda d: d.sample(),
bias_prior_fn=None,
bias_divergence_fn=lambda q, p, ignore: tfd.kl_divergence(q, p)

然后,在“ _apply_variational_kernel”方法下,我执行以下操作:

self.bernoullis=tfd.Bernoulli(logits=
self.spike_posterior.distribution.loc)
self.kernel_posterior_affine = tfd.Normal(loc=self._matmul(inputs, 
self.bernoullis*self.kernel_posterior.distribution.loc), 
scale=tf.sqrt(self._matmul(tf.square(inputs),tf.square(self.bernoullis*self.kernel_posterior.distribution.scale))))

self.kernel_posterior_affine_tensor = (self.kernel_posterior_tensor_fn(self.kernel_posterior_affine)) 

self.kernel_posterior_tensor = None
self.spike_posterior_tensor = None

最后,当我要评估“峰值”变量的后验时,我会这样做:

self.model.layers[-1].spike_posterior.distribution.loc

我希望得到0到1之间的值。这应该表示我的权重和联系的后验包含概率。但是,我到处都有数字,包括负值。 显然,我对DenseLocalReparameterization的修改不起作用,但我不知道出什么问题了。

我该如何解决?

谢谢。

0 个答案:

没有答案