Как я могу реализовать потерю Кульбака-Лейблера в TensorFlow?

Мне нужно свести к минимуму потерю KL в tensorflow.

Я попробовал эту функцию tf.contrib.distributions.kl(dist_a, dist_b, allow_nan=False, name=None), но у меня не получилось.

Я попытался реализовать это вручную:

def kl_divergence(p,q):
    return p* tf.log(p/q)+(1-p)*tf.log((1-p)/(1-q))

Это правильно?


person Alberto Merciai    schedule 08.04.2017    source источник
comment
Возможный дубликат KL Divergence in TensorFlow   -  person Transcendental    schedule 09.04.2017


Ответы (1)


У вас есть перекрестная энтропия, расхождение KL должно быть примерно таким:

def kl_divergence(p, q): 
    return tf.reduce_sum(p * tf.log(p/q))

Это предполагает, что p и q являются одномерными тензорами с плавающей запятой, одинаковой формы, и для каждого их значения в сумме равны 1.

Это также должно работать, если p и q являются мини-пакетами одномерных тензоров одинакового размера, которые подчиняются указанным выше ограничениям.

person Daniel Slater    schedule 08.04.2017
comment
Большое спасибо, а если p и q многомерны? - person Alberto Merciai; 08.04.2017
comment
Вы имеете в виду в случае, если p и q являются мини-пакетами дистрибутивов, которые вы хотите оптимизировать? Я думаю, что то, что у меня есть, должно подойти и для этого случая. Если это не так, то мне нужно больше контекста. - person Daniel Slater; 08.04.2017
comment
я получаю nan, когда пытаюсь вычислить деление 0/0 - person Alberto Merciai; 10.04.2017
comment
я добавляю постоянную = 0,00001 к каждому p и q, чтобы избежать nan, верно? - person Alberto Merciai; 11.04.2017
comment
@srabb, это один из вариантов, вы также можете сделать tf.max, чтобы он не изменил другие результаты, мне интересно, есть ли лучший способ - person Daniel Slater; 11.04.2017
comment
добавление небольшого const - это версия, которую я вижу в примерах tensorflow из Google, я думаю, это немного быстрее, чем делать max? - person Daniel Slater; 23.10.2017
comment
Вместо того, чтобы добавлять константу для обработки нулей, сглаживайте ее равномерным распределением. - person kauDaOtha; 25.10.2018
comment
tf.log больше не существует — скорее tf.math.log - person jtlz2; 08.04.2020