Я запускаю пример кода в Байесовской нейронной сети реализовано с использованием вероятности Tensorflow.
Мой вопрос касается реализации потери 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 вариационных параметров, за исключением того, что есть дополнительные члены логарифмической дисперсии и постоянный член. Есть комментарии по этому поводу?