我有两个概率分布。我怎样才能在PyTorch中找到他们之间的KL分歧?常规交叉熵只接受整数标签。
答案 0 :(得分:9)
是的,PyTorch在torch.nn.functional
下有一个名为kl_div
的方法来直接计算张量之间的KL-收敛。假设您具有相同形状的张量a
和b
。您可以使用以下代码:
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_div
与wiki的解释不同。
我使用以下内容:
# 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