在 TensorFlow Probability (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 概率和 torch.distributions.kl.register_kl
在 PyTorch 中。
这是正确的假设吗?如果是这样,有人可以解释为什么 KL 散度不会针对给定的分布类别实现吗?我想我错过了一些非常基本的东西。
如果我的假设是错误的,有人可以解释如何正确让 TensorFlow 和 PyTorch 实现这些操作吗?
作为其他引用,本示例使用可与 Edward 配合使用的旧版 TensorFlow,
pip install tensorflow==1.7
pip install edward
在上面的这个最小示例中,我尝试在 tfp
(或在 torch
中)实现以下 edward
玩具示例代码的等效项>).
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)
最佳答案
IIRC,Edward 的 KLqp 切换尝试使用解析形式,如果没有切换到使用示例 KL。
对于 TFP,我认为 PyTorch,kl_divergence 仅适用于发行版 注册的,与 Edward 不同的是,它只计算解析 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。
关于python - 正常和拉普拉斯的 KL 散度未在 TensorFlow Probability 和 PyTorch 中实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53036403/