PyTorch学习笔记:nn.KLDivLoss——KL散度损失

torch.nn.KLDivLoss(size_average=None, reduce=None, reduction='mean', log_target=False)

功能:生成一个KL散度损失函数,常用于衡量两个连续分布的距离:
target。引自:
https://www.w3cschool.cn/article/84661764.html

import torch.nn as nn
import torch
import torch.nn.functional as F
x = torch.randn((1, 8))
y = torch.randn((1, 8))
# 先转化为概率,之后取对数
x_log = F.log_softmax(x,dim=1)
# 只转化为概率
y = F.softmax(y,dim=1)
kl = nn.KLDivLoss(reduction='batchmean')
out = kl(x_log, y)
print(x)
print(x_log)
print(y)
print(out)
# 输入x
tensor([[-1.5233,  2.5922,  1.7129,  0.3326,  0.4060,  2.4113,  2.0535,  0.4290]])
# x_log
tensor([[-5.2728, -1.1573, -2.0365, -3.4168, -3.3435, -1.3381, -1.6959, -3.3205]])
# 输入y
tensor([[0.1136, 0.1651, 0.0477, 0.3457, 0.0577, 0.0488, 0.1507, 0.0707]])
# 输出的损失
tensor(0.9757)
 

nn.KLDivLoss:https://pytorch.org/docs/stable/generated/torch.nn.KLDivLoss.html#torch.nn.KLDivLoss

初步完稿于:2022年1月30日

文章目录一、定义1. KL距离(Kullback–Leibler divergence)2. torch.nn.KLDivLoss()3. torch.nn.functional.kl_div()二、实验1. torch.nn.KLDivLoss()2. torch.nn.functional.kl_div()三、结论1. 实际应用 1. KL距离(Kullback–Leibler divergence) 设P, Q为两个概率(意思就是sum为1,相当于做完softmax之后的效果),则KL 偶然学习KL散度,突然发现python里面KL散度的实现有很多种耶,一时就地懵圈,各处查阅资料,终于理解了,主要从代码实现和公式的角度,整理记录一下神奇的stats.entropy、special.rel_entr、special.kl_div、F.kl_divnn.KLDivLoss吧。 Pytorch nn.KLDivLoss, reduction=‘none’|‘mean’|'batchmean’详解 先看下官方文档 https://pytorch.org/docs/stable/generated/torch.nn.KLDivLoss.html 然后运行下这个例子 import torch import torch.nn as nn if __name__ == '__main__': x = torch.tensor([[0.1,0.3,0.6], 对于具有相同形状的张量 ypred​ 和 ytrue(ypred​ 是输入,ytrue​ 是目标),定义逐点KL散度为:为了在计算时避免下溢问题,此KLDivLoss期望输入在对数空间中。如果log_target=True,则目标也在对数空间。 1.KL散度 KL散度( Kullback–Leibler divergence) (最大类间散度) 是描述两个概率分布差异的一种测度。对于两个概率分布P、Q,二者越相似,KL散度越小。 KL散度的性质:P:真实分布,Q:P的拟合分布 非负性:KL(P||Q)>=0,当P=Q时,KL(P||Q)=0; 反身性:KL(P||P)=0 非对称性:D(P||Q) ≠ D(Q||P) KL散度不满足三角不等式 from scipy import stats P = [0.2, 0.4, 0.4] Q = [0.4, 0.2, 0.5] print(stats.entropy(P,Q)) 0.144 公式理解: p(x)是真实分布,q(x)是拟合分布;实际计算时;通常p(x)作为target,只是概率分布;而xn则是把输出做了LogSoftmax计算;即把概率分布映射到log... KL散度,又叫相对熵,用于衡量两个连续分布之间的距离,公式如下: DKL(p∥q)=∑i=1Np(xi)⋅(log⁡p(xi)−log⁡q(xi))D_{K L}(p \| q)=\sum_{i=1}^{N} p\left(x_{i}\right) \cdot\left(\log p\left(x_{i}\right)-\log q\left(x_{i}\right)\right)DKL​(p∥q)=∑i=1N​p(xi​)⋅(logp(xi​)−logq(xi​)) KLDivLoss KL算散 KL散度衡量的是在一个概率分布 �P 中获取信息所需的额外位数相对于使用一个更好的分布 �Q 所需的额外位数的期望值。要在训练中使用 KL散度作为损失函数,可以将其作为模型的一部分加入到损失函数的计算中。在机器学习中,KL散度常常用于衡量两个概率分布之间的差异程度,例如在生成模型中使用 KL散度作为损失函数的一部分,或者在聚类和分类问题中使用 KL散度作为相似度度量。需要注意的是,KL散度的计算要求 P 和 Q 的元素都为正数,因此需要在计算前对两个概率分布进行归一化处理,使其元素和为 1。