【发布时间】:2018-09-27 21:48:10
【问题描述】:
我有两个概率分布。我应该如何在 PyTorch 中找到它们之间的 KL 散度?常规交叉熵只接受整数标签。
【问题讨论】:
我有两个概率分布。我应该如何在 PyTorch 中找到它们之间的 KL 散度?常规交叉熵只接受整数标签。
【问题讨论】:
是的,PyTorch 在 torch.nn.functional 下有一个名为 kl_div 的方法,可以直接计算张量之间的 KL-devergence。假设您有相同形状的张量a 和b。您可以使用以下代码:
import torch.nn.functional as F
out = F.kl_div(a, b)
更多详情,请参阅上述方法文档。
【讨论】:
log,以及目标的实际值。现在,它工作正常。
函数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 相比,速度更快
【讨论】:
Q.log(),当脱离机器学习的上下文时,这非常不直观。
如果你有两个pytorch distribution object 形式的概率分布。那么你最好使用函数torch.distributions.kl.kl_divergence(p, q)。有关文档,请关注link
【讨论】:
torch.distributions.kl.kl_divergence 似乎需要向pytorch.org/docs/stable/… 注册分发版
如果使用 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
【讨论】: