为何pytorch nn.KLDivLoss()损失计算为负数?

参考文献:https://www.zhihu.com/question/384982085
先来看一下KL散度的定义
在这里插入图片描述
在这里插入图片描述
这里是要用分布Q为标签(原始分布),分布P作为预测值(预测分布)

在pytorch中,nn.KLDivLoss()的计算公式如下:
在这里插入图片描述
上图y为标签,x为预测值,则pytorch应该以如下代码使用

lossfunc = nn.KLDivLoss()
loss = lossfunc(预测值, 标签值)

但是,由于计算公式中,预测值x的输入要是对数形式,而标签值y则不需要,所以如果我们要对预测值和标签值的softmax值求KL散度就需要如下:

temp = 1 #温度系数
probs = torch.Tensor([[2, 6, 8], [7, 1, 2], [1, 9, 2.3], [1.9, 2.8, 5.4]])
target = torch.Tensor([[0.8, 0.1, 0.1], [0.1, 0.7, 0.2], [0.5, 0.2, 0.3], [0.4, 0.3, 0.3]])
loss = lossfunc(F.log_softmax(probs / temp, dim=1), F.softmax(target / temp, dim=1))#如果probs和target已经是softmax的形式,就只需要给probs取对数输入就行了

也就是说要给输入的预测值预先取个对数,这样计算结果就不为负数了

错误示范:

probs = torch.Tensor([[2, 6, 8], [7, 1, 2], [1, 9, 2.3], [1.9, 2.8, 5.4]])
target = torch.Tensor([[0.8, 0.1, 0.1], [0.1, 0.7, 0.2], [0.5, 0.2, 0.3], [0.4, 0.3, 0.3]])
loss1 = lossfunc(F.softmax(probs / temp, dim=1), F.softmax(target / temp, dim=1))
loss2 = lossfunc(probs, target)

这样两个散度算出来就都是负数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值