最近使用了pytorch的KL散度计算模块,发现loss是负值,例如下面的代码。
import torch
KL_criterion = torch.nn.KLDivLoss(size_average=False)
a = torch.tensor([0.1, 0.2, 0.3, 0.4])
b = torch.tensor([0.1, 0.2, 0.3, 0.4])
loss = KL_criterion(a, b)
print(loss)
其结果为:
-1.5799
后来通过网上的解释(https://discuss.pytorch.org/t/kl-divergence-produces-negative-values/16791/5)得知,KL散度的input部分需要经过log的计算,加上之后变为:
import torch
KL_criterion = torch.nn.KLDivLoss(size_average=False)
a = torch.tensor([0.1, 0.2, 0.3, 0.4])
b = torch.tensor([0.1, 0.2, 0.3, 0.4])
loss = KL_criterion(a.log(), b)
print(loss)
其输出变为:
0
因为这是两个相同的分布,所以KL的结果是0,这是正确的。
如果换成一般的例子,如下所示:
import torch
KL_criterion = torch.nn.KLDivLoss(size_average=False)
a = torch.tensor([0.2, 0.1, 0.3, 0.4])
b = torch.tensor([0.1, 0.2, 0.3, 0.4])
loss = KL_criterion(a.log(), b)
print(loss)
其输出变为:
0.0693
需要注意的是: 分布的结果相加需要为1。
KL 散度的input部分需要加上log运算也与其原理有关,详细内容可以参考pytorch的官方文档介绍。
297




被折叠的 条评论
为什么被折叠?



