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)
tensor([[-1.5233, 2.5922, 1.7129, 0.3326, 0.4060, 2.4113, 2.0535, 0.4290]])
tensor([[-5.2728, -1.1573, -2.0365, -3.4168, -3.3435, -1.3381, -1.6959, -3.3205]])
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_div与nn.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)⋅(logp(xi)−logq(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=1Np(xi)⋅(logp(xi)−logq(xi))
KLDivLoss
KL算散
KL散度衡量的是在一个概率分布 �P 中获取信息所需的额外位数相对于使用一个更好的分布 �Q 所需的额外位数的期望值。要在训练中使用 KL散度作为损失函数,可以将其作为模型的一部分加入到损失函数的计算中。在机器学习中,KL散度常常用于衡量两个概率分布之间的差异程度,例如在生成模型中使用 KL散度作为损失函数的一部分,或者在聚类和分类问题中使用 KL散度作为相似度度量。需要注意的是,KL散度的计算要求 P 和 Q 的元素都为正数,因此需要在计算前对两个概率分布进行归一化处理,使其元素和为 1。