在TensorFlow概率(v0.4.0
)和PyTorch(v0.4.1
)中,正态分布(tfp
,PyTorch)和拉普拉斯分布({{ 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)
答案 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。