Что представляют собой потери свойств байесовских слоев TensorFlow Probability?

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


person rort1989    schedule 27.04.2018    source источник


Ответы (1)


Атрибут losses слоя TensorFlow Keras Layer представляет собой побочный эффект. вычисление, такое как штрафы регуляризатора. В отличие от штрафов регуляризатора для конкретных переменных TensorFlow, здесь losses представляет вычисление расхождения KL. Ознакомьтесь с а также пример : rel="nofollow norestring

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

person Dustin Tran    schedule 27.04.2018
comment
Эй, Дастин, в примерах TFP байесовские потери вычисляются как neg_log_likelihood = -tf.reduce_mean(input_tensor=labels_distribution.log_prob(labels)), что, кажется, более точно соответствует потерям ELBO, чем softmax xent. Это эквивалентно? - person stuart; 31.10.2019