Какие потери связаны со свойством потерь байесовских слоев в TensorFlow Probability?

Уровни вероятности TensorFlow (например, DenseFlipout) имеют losses метод (или свойство), который получает «потери, связанные с этим слоем». Может кто-нибудь объяснить, что это за потери?

После просмотра Flipout paper, я думаю, что потери связаны с расхождением Кульбака-Лейблера между предыдущими и апостериорное распределение веса и смещений. Если кто-то более осведомлен в этих вещах, чем я, пожалуйста, поправьте меня.


person smith    schedule 09.01.2019    source источник


Ответы (1)


Ваше подозрение верно, хотя и плохо задокументировано. Например, в фрагменте кода ниже

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) # Losses are summed

# The negative log-likelihood and the KL term are combined
loss = neg_log_likelihood + kl 

train_op = tf.train.AdamOptimizer().minimize(loss)

в документации уровня DenseFlipout losses являются суммируются, чтобы получить член KL, а член логарифмической вероятности вычисляется отдельно и объединяется с термином KL для формирования ELBO.

Вы можете увидеть добавляемую потерю здесь, который после нескольких косвенных указаний показывает, что используется {kernel,bias}_divergence_fn, и что, в свою очередь, по умолчанию используется lambda, который вызывает tfd.kl_divergence(q, p).

person Chris Suter    schedule 10.01.2019
comment
Почему потери суммируются, а не усредняются? Интуитивно мне кажется, что мы должны усреднить их, а затем разделить это среднее на количество примеров в мини-партии, прежде чем добавлять результат к окончательной потере. В случае с Керасом, знаете ли вы, как именно расхождение KL каждого слоя добавляется к окончательной потере? - person nbro; 16.01.2020