PyTorch中两个概率分布的KL发散

Moj*_*ili 8 machine-learning pytorch

我有两个概率分布。如何在PyTorch中找到它们之间的KL差异?常规互熵仅接受整数标签。

jdh*_*hao 12

是的,PyTorch有一个名为方法kl_divtorch.nn.functional到张量之间的直接计算KL-devergence。假设您有张量a并且b形状相同。您可以使用以下代码:

import torch.nn.functional as F
out = F.kl_div(a, b)
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参见上面的方法文档。

  • 是的,我看过那个函数,但是它返回一个负值。我发现了问题所在:我必须使用输入的“ log”和目标的实际值。现在,它工作正常。 (4认同)

小智 11

functionkl_divwiki的解释不同。

我使用以下内容:

# this is the same example in wiki
P = torch.Tensor([0.36, 0.48, 0.16])
Q = torch.Tensor([0.333, 0.333, 0.333])

(P * (P / Q).log()).sum()
# tensor(0.0863), 10.2 µs ± 508

F.kl_div(Q.log(), P, None, None, 'sum')
# tensor(0.0863), 14.1 µs ± 408 ns
Run Code Online (Sandbox Code Playgroud)

相比kl_div,甚至更快


Gau*_*ava 9

如果你有两个pytorch distributionobject形式的概率分布。那么您最好使用该功能torch.distributions.kl.kl_divergence(p, q)。有关文档,请点击链接

  • 检查 pytorch 版本。我认为应该>1.0 (4认同)
  • `torch.distributions.kl.kl_divergence` 似乎需要使用 https://pytorch.org/docs/stable/distributions.html#torch.distributions.kl.register_kl 注册发行版 (2认同)