我在使用Tensorflow Probability实现的贝叶斯神经网络上运行示例代码。
我的问题是关于用于变分推理的 ELBO 损失的实现。ELBO 等于两项之和,即neg_log_likelihood
在kl
代码中实现。我很难理解该kl
术语的实施。
以下是模型的定义方式:
with tf.name_scope("bayesian_neural_net", values=[images]):
neural_net = tf.keras.Sequential()
for units in FLAGS.layer_sizes:
layer = tfp.layers.DenseFlipout(units, activation=FLAGS.activation)
neural_net.add(layer)
neural_net.add(tfp.layers.DenseFlipout(10))
logits = neural_net(images)
labels_distribution = tfd.Categorical(logits=logits)
以下是“kl”术语的定义:
kl = sum(neural_net.losses) / mnist_data.train.num_examples
我不确定neural_net.losses
这里返回的是什么,因为没有为neural_net
. 显然,会有一些返回值neural_net.losses
,但是我不知道返回值是什么意思。对此有何评论?
我的猜测是 L2 规范,但我不确定。如果是这样的话,我们仍然缺少一些东西。根据VAE论文附录 B,作者在先验为标准正态时推导出 KL 项。事实证明,它非常接近变分参数的 L2 范数,除了有额外的对数方差项和常数项。对此有何评论?