Потеря -ELBO вариационного вывода, реализованная в вероятности тензорного потока Байесовская нейронная сеть

Я выполняю пример кода на Байесовской нейронной сети, реализованный с использованием вероятности Tensorflow. Мой вопрос касается реализации потери -ELBO, используемой для вариационного вывода. -ELBO равно суммированию двух слагаемых, а именно 'neg_log_likelihood' и '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, но я не уверен. Если это так, мы все еще что-то упускаем. Согласно Приложению B к статье VAE, авторы вывели термин KL, когда предшествующее является стандартным нормальным. Оказывается, она довольно близка к норме L2 вариационных параметров, за исключением того, что имеются дополнительные логарифмические члены и постоянный член. Есть комментарии по этому поводу?

1 ответ

Решение

losses Атрибут слоя TensorFlow Keras представляет вычисление побочного эффекта, такого как штрафы регуляризатора. В отличие от штрафов регуляризатора для определенных переменных TensorFlow, здесь losses представляют вычисление расхождения KL. Проверьте реализацию здесь, а также пример документации:

Мы иллюстрируем байесовскую нейронную сеть с помощью [вариационного вывода] ( https://en.wikipedia.org/wiki/Variational_Bayesian_methods),
предполагая, что набор данных features а также labels,

  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, чтобы минимизировать
Расхождение Кульбака-Лейблера до постоянной, также известной как
Отрицательное доказательство Нижняя граница. Он состоит из суммы двух слагаемых:
ожидаемое отрицательное логарифмическое правдоподобие, которое мы приближаем через Монте-Карло; и дивергенция KL, которая добавляется через термины регуляризатора, которые являются аргументами для уровня.

Другие вопросы по тегам