python - 正常和拉普拉斯的 KL 散度未在 TensorFlow Probability 和 PyTorch 中实现

标签 python tensorflow statistics pytorch tensorflow-probability

在 TensorFlow Probability (v0.4.0) 和 PyTorch (v0.4.1) 中,正态分布的 KL 散度( tfpPyTorch )和拉普拉斯分布( tfpPyTorch )未实现,导致抛出 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/

相关文章:

android - 有多少百分比的 Android 设备具有合理的 OpenGL 性能?

python - 如何测试 popplerqt5 中的注释类型?

python - 如何诊断 ImportError : DLL load failed when loading native Windows python modules in a virtualenv?

python - : import scipy as sp/sc 的官方缩写

python - Django 管道编译器不工作

machine-learning - 如何解释神经网络层的权重分布

python - Tensorflow per_process_gpu_memory_fraction 不工作

python - 通过 Tensorflow 消费大数据

statistics - Flash Player子版本或点版本的渗透率?

linux - txt 的统计(出现频率 % ecc..)分析