11

我在使用Tensorflow Probability实现的贝叶斯神经网络上运行示例代码。

我的问题是关于用于变分推理的 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 范数,除了有额外的对数方差项和常数项。对此有何评论?

4

1 回答 1

4

TensorFlow Keras 层losses属性表示副作用计算,例如正则化器惩罚。与特定 TensorFlow 变量的正则化惩罚不同,这里的代表 KL 散度计算。查看此处的实现以及文档字符串的示例losses

我们用变分推理来说明贝叶斯神经网络,假设数据集为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 散度最小化为一个常数,也称为负证据下限。它由两项之和组成:预期负对数似然,我们通过蒙特卡洛近似;和 KL 散度,它是通过作为层参数的正则项添加的。

于 2018-04-27T17:31:17.067 回答