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

时间:2018-04-17 19:50:08

标签: machine-learning pytorch

我有两个概率分布。我怎样才能在PyTorch中找到他们之间的KL分歧?常规交叉熵只接受整数标签。

4 个答案:

答案 0 :(得分:9)

是的,PyTorch在torch.nn.functional下有一个名为kl_div的方法来直接计算张量之间的KL-收敛。假设您具有相同形状的张量ab。您可以使用以下代码:

import torch.nn.functional as F
out = F.kl_div(a, b)

有关详细信息,请参阅上述方法文档。

答案 1 :(得分:0)

如果您有两个pytorch distribution object形式的概率分布。然后,最好使用函数torch.distributions.kl.kl_divergence(p, q)。有关文档,请遵循link

答案 2 :(得分:0)

功能kl_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

kl_div进行比较,甚至更快

答案 3 :(得分:0)

如果使用Torch发行版

mu = torch.Tensor([0] * 100)
sd = torch.Tensor([1] * 100)

p = torch.distributions.Normal(mu,sd)
q = torch.distributions.Normal(mu,sd)

out = torch.distributions.kl_divergence(p, q).mean()
out.tolist() == 0
True