TensorFlow概率和PyTorch未实现Normal和Laplace的KL散度

时间:2018-10-28 21:50:26

标签: python tensorflow statistics pytorch tensorflow-probability

在TensorFlow概率(v0.4.0)和PyTorch(v0.4.1)中,正态分布(tfpPyTorch)和拉普拉斯分布({{ 3}},tfp)未实现,导致引发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

我认为,这两个库都缺少此功能,这是有充分的理由的,并且希望用户使用TensorFlow Probability中的PyTorch和PyTorch中的tfp.distributions.RegisterKL自己实现它

这是正确的假设吗?如果是这样,有人可以解释为什么对于给定的分配类别不实施KL Divergence吗?我想我缺少一些非常基本的东西。

如果我的假设是错误的,有人可以解释一下如何正确地使TensorFlow和PyTorch实施这些操作吗?

对于其他参考,在本示例中,使用与Edwards一起使用的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 :(得分:1)

IIRC,爱德华(Edward)的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。 (如果您可以在https://github.com/tensorflow/probability提交PR,那就太好了!)。

如果事实证明没有合适的分析形式(我不知道是否有这样一种分析形式),则可以形成样本KL并对其进行优化。可以在TFP中明确地做到这一点(通过采样和计算样本KL。如果您也希望自动执行此操作,也请提交PR。这是我们TFP上的一些人感兴趣的东西。

看看在什么情况下可以自动进行分析KL会很有趣。例如,如果q和p来自相同的指数族,那么就足够的统计量和归一化而言,KL散度有一个很好的形式。但是对于跨指数族(甚至不是指数族)的KL,我不知道关于分布类的结果,在该分布类中您可以半自动计算类中的KL。