在Tensorflow概率贝叶斯神经网络中实现的-ELBO变分推断损失

时间:2018-04-27 14:40:50

标签: tensorflow tensorflow-probability

我在使用Bayesian Neural Network实施的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规范,但我不确定。如果是这种情况,我们仍然遗漏了一些东西。根据{{​​3}}论文附录B,作者在先验标准正常时得出KL术语。事实证明它非常接近变分参数的L2范数,除了有额外的对数方差项和常数项。对此有何评论?

1 个答案:

答案 0 :(得分:3)

TensorFlow Keras Layerlosses属性表示副作用计算,例如正则化惩罚。与特定TensorFlow变量的正则化惩罚不同,此处losses表示KL散度计算。查看implementation here以及docstring's example

  

我们用[变分推理]来说明贝叶斯神经网络(   https://en.wikipedia.org/wiki/Variational_Bayesian_methods),
  假设数据集为featureslabels

  import tensorflow_probability as tfp
  model = tf.keras.Sequential([
      tfp.layers.DenseFlipout(512, activation=tf.nn.relu),
      tfp.layers.DenseFlipout(10),
  ])
  logits = model(features)
  neg_log_likelihood = tf.nn.softmax_cross_entropy_with_logits(
      labels=labels, logits=logits)
  kl = sum(model.losses)
  loss = neg_log_likelihood + kl
  train_op = tf.train.AdamOptimizer().minimize(loss)
     

它使用Flipout梯度估计器来最小化
  Kullback-Leibler分歧达到一个常数,也称为   负面证据下界。它由两个术语的总和组成:
  预期的负对数似然,我们通过Monte估计   卡罗;和KL分歧,通过正则条款添加   这是图层的参数。