В обоих вероятностях TensorFlow (v0.4.0
) и PyTorch (v0.4.1
) расхождение KL нормального распределения (tfp
, PyTorch ) и распределения Лапласа (tfp
, PyTorch ) не реализовано, что приводит к выдаче NotImplementedError
ошибки.
>>> import tensorflow as tf
>>> import tensorflow_probability as tfp
>>> tfd = tfp.distributions
>>> import torch
>>>
>>> tf.__version__
'1.11.0'
>>> tfp.__version__
'0.4.0'
>>> torch.__version__
'0.4.1'
>>>
>>> p = tfd.Normal(loc=0., scale=1.)
>>> q = tfd.Laplace(loc=0., scale=1.)
>>> tfd.kl_divergence(p, q)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/root/miniconda/envs/example/lib/python3.6/site-packages/tensorflow/python/ops/distributions/kullback_leibler.py", line 95, in kl_divergence
% (type(distribution_a).__name__, type(distribution_b).__name__))
NotImplementedError: No KL(distribution_a || distribution_b) registered for distribution_a type Normal and distribution_b type Laplace
>>>
>>> a = torch.distributions.normal.Normal(loc=0., scale=1.)
>>> b = torch.distributions.laplace.Laplace(loc=0., scale=1.)
>>> torch.distributions.kl.kl_divergence(a,b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/root/miniconda/envs/example/lib/python3.6/site-packages/torch/distributions/kl.py", line 161, in kl_divergence
raise NotImplementedError
NotImplementedError
Я полагаю, что это отсутствует в обоихВ этих библиотеках есть веская причина для этого и ожидается, что пользователь сам реализует его с tfp.distributions.RegisterKL
в TensorFlow Probability и torch.distributions.kl.register_kl
в PyTorch.
Это правильное предположение?Если да, то может ли кто-нибудь объяснить, почему расхождение KL не будет реализовано для данных классов распределения?Я думаю, что упускаю что-то очень простое в этом.
Если мое предположение неверно, может кто-нибудь объяснить, как правильно TensorFlow и PyTorch реализовать эти операции?
Для дополнительной справки, используя для этогоПример более старой версии TensorFlow, которая работает с Эдвардом,
pip install tensorflow==1.7
pip install edward
В этом минимальном примере выше я пытаюсь реализовать эквивалент следующего edward
примера кода игрушки в tfp
(или вtorch
).
import tensorflow as tf
import edward as ed
p = ed.models.Normal(loc=0., scale=1.)
s = tf.Variable(1.)
q = ed.models.Laplace(loc=0., scale=s)
inference = ed.KLqp({p: q})
inference.run(n_iter=5000)