Логарифмическое правдоподобие Tensorflow для двух векторов вероятности, которые могут содержать нули

Предположим, у меня есть два тензора, p1 и p2 в тензорном потоке одинаковой формы, которые содержат вероятности, некоторые из которых могут быть равны нулю или единице. Является ли их элегантный способ вычисления логарифмической вероятности точечным: p1*log(p2) + (1-p1)*log(1-p2)?

Реализация его наивно с использованием функций тензорного потока

p1*tf.log(p2) + (1-p1)*tf.log(1-p2)

рискует вызвать 0*tf.log(0), что даст nan.


person patapouf_ai    schedule 09.05.2017    source источник


Ответы (2)


В качестве первоначального хака (наиболее лучшее решение) я добавляю эпсилон внутри log:

eps = 1e-10
p1*tf.log(p2+eps) + (1-p1)*tf.log(1-p2+eps)

что предотвращает log(0).

person patapouf_ai    schedule 09.05.2017

Пожалуйста, взгляните на CRF. Он содержит реализацию логарифмического правдоподобия. В частности, вы можете взглянуть на реализация

person user1877600    schedule 09.05.2017
comment
Спасибо, однако очень сложно понять, что есть что в этом коде. Я ожидаю, что это можно будет сделать, используя менее 5 строк кода тензорного потока. - person patapouf_ai; 09.05.2017
comment
Если вы удалите все документальные комментарии и проверку входных параметров, вы получите код длиной примерно 10 строк. - person user1877600; 09.05.2017