Tensorflow概率的贝叶斯层的性质损失代表了什么



我正在使用TensorFlow概率实现的贝叶斯神经网络上运行示例代码。

我的问题是关于用于变异推理的ELBO损失的实施。Elbo等于两个术语的求和,即neg_log_likelihoodkl在代码中实现。我很难理解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规范,除了还有其他日志方差项和恒定项。对此有任何评论吗?

Tensorflow keras层的losses属性表示副作用计算,例如正常器惩罚。与对特定张量变量的正规剂处罚不同,在此,losses代表KL差异计算。在此处查看实现以及Docstring的示例:

我们说明了一个带有变异推理的贝叶斯神经网络,假设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)

它使用翻转梯度估计器将kullback-leibler差异最小化至常数(也称为负面证据下限(。它由两个术语的总和组成:预期的负模样,我们通过Monte Carlo近似;kl差异是通过常规术语添加的,这是该层的参数。

最新更新