最近使用了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的官方文档介绍。
本文介绍了在使用PyTorch计算KL散度时遇到负值的问题,通过示例代码展示了如何正确计算。当分布概率值相加不为1或未对输入应用log操作时,可能导致负值。修正后,KL散度能正确输出0表示两个相同分布。
1546

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



