Дивергенция нормалей и Лапласа KL не реализована в вероятностях TensorFlow и PyTorch - PullRequest
0 голосов
/ 29 октября 2018

В обоих вероятностях 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)

1 Ответ

0 голосов
/ 30 октября 2018

IIRC, Эдвард KLqp переключатели пытается использовать аналитическую форму, и если не переключается на использование образца KL.

Для TFP, и я думаю, что PyTorch, kl_divergence работает только для дистрибутивов зарегистрирован, и в отличие от Эдварда вычисляет только аналитические KL. Как вы упомянули, они не реализованы в TFP, и я бы сказал, что это скорее потому, что были реализованы общие случаи (такие как KL (MultivariateNormal || MultivariateNormal).

Чтобы зарегистрировать дивергенцию KL, вы должны сделать что-то вроде: https://github.com/tensorflow/probability/blob/07878168731e0f6d3d0e7c878bdfd5780c16c8d4/tensorflow_probability/python/distributions/gamma.py#L275. (Было бы здорово, если бы вы могли подать PR на https://github.com/tensorflow/probability!).

Если выясняется, что для этого нет подходящей аналитической формы (от макушки головы, я не знаю, есть ли она), тогда можно сформировать образец KL и провести с ним оптимизацию. Это можно сделать явно в TFP (путем выборки и вычисления образца KL. Также, пожалуйста, подайте PR, если вы хотите, чтобы это делалось также более автоматически. Это то, что некоторые из нас в TFP интересуют.

Было бы интересно посмотреть, для каких случаев аналитические КЛ могут быть автоматизированы. Например, если q и p происходят из одного и того же экспоненциального семейства, то существует хорошая форма для дивергенции KL с точки зрения достаточной статистики и нормализатора. Но для KL, которые имеют экспоненциальные семейства (или даже не экспоненциальные семейства), мне не известны результаты по классам распределений, где вы можете вычислять KL внутри класса полуавтоматически.

...