pytorch KL散度计算出现负值的情况

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

最近使用了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的官方文档介绍。

避坑指南:知识蒸馏训练中Loss负值?三种KL度实现方式(PyTorch)深度对比 本文深入解析知识蒸馏训练中KL度Loss负值的问题,对比PyTorch中三种KL度实现方式的差异,包括ChatGPT标准实现、同济子豪兄问题实现和文心一言优化实现。通过MNIST手写数字识别任务的具体案例,揭示负Loss的根本原因,并提供工程实践中的最佳解决方案和关键参数调优建议。 阅读详情

相关推荐

点式惊奇度:基于滑动高斯窗口的实时数据漂移检测方法

点式惊奇度是一种面向流式数据的细粒度异常感知概念,其核心原理是为每个新数据点计算其相对于近期历史分布的负对数概率,从而量化‘意外程度’。该方法依托滑动高斯窗口实现轻量、可递推、抗干扰的在线分布建模,并通过贝叶斯KL度构建真实后验与高斯近似间的失真代理,使惊奇度兼具可解释性、可微分性与工程可部署性。相比传统窗口统计法(如3σ、KS检验),它能提前捕获单点级早期漂移,在金融风控、IoT设备健康监测等低延迟高吞吐场景中显著降低漏报率与响应延迟。本文聚焦于该技术在生产环境中的参数设计、鲁棒性加固与信号转化实践。

weixin_34343000的博客 297

TensorFlow KLDivergence loss为负

kl_compute = tf.keras.losses.KLDivergence(reduction=losses_utils.ReductionV2.NONE, name='kullback_leibler_divergence') loss = tf.reduce_mean(kl_compute(labels, tf.nn.softmax(logits))) 改为 kl

开卷有益 1602

关于pytorch nn.KLDivLoss()损失计算loss值为负数的原因

KL度,又叫相对熵,用于衡量两个分布(离分布和连续分布)之间的距离。

L888666Q的博客 6543

pytorch中的kl度,为什么kl度是负数?

F.kl_div()或者nn.KLDivLoss()是pytroch中计算kl度的函数,它的用法有很多需要注意的细节。 输入 第一个参数传入的是一个对数概率矩阵,第二个参数传入的是概率矩阵。并且因为kl度具有不对称性,存在一个指导和被指导的关系,因此这连个矩阵输入的顺序需要确定一下。如果现在想用Y指导X,第一个参数要传X,第二个要传Y。就是被指导的放在前面,然后求相应的概率和对数概率就可以了。 所以,一随机初始化一个tensor为例,对于第一个输入,我们需要先对这个tensor进行softmax(确保各

算法岗从零到无穷 1万+

torch.nn.KLDivLoss()损失函数输结果为负数

torch.nn.KLDivLoss()损失函数输结果为负数

A_John 的博客 5917

为何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则不需要,所以如果我们要对预

cainiao00078的博客 6611

什么是KL

什么是KL

yinizhilianlove的博客 1018

KL度的计算及其相关问题题

KLKL度计算,softmaxsoftmax,可不可以用sigmoidsigmoid,KLKL度为负数

a493001894的博客 1920

从熵到交叉熵损失函数:一文掌握机器学习中的核心概念与应用

本文深入解析了机器学习中的核心概念熵、KL度和交叉熵损失函数,及其在实践中的应用。通过实例和公式演示,帮助读者理解信息熵如何量化不确定性,KL度如何衡量分布差异,以及交叉熵与Softmax组合如何优化分类任务。文章还分享了实战中的调参技巧,如标签平滑和温度系数调节,提升模型性能。

weixin_27310985的博客 217

深度学习量化总结(PTQ、QAT)

并不是所有的模型,都很适合量化。在实际的生产环境中,我们经常会遇到一些模型,量化之后精度不好,其根本原因是因为浮点阶段的模型并不适合量化。这里说明一些常见的不适合量化的浮点情况。在实际执行的时候,可以通过 debug 工具去发现模型当中不适合量化的部分。受限于量化的方法和编译器的限制,目前量化的 op 实现,会有一些限制或者误差。这种算子的误差一般有两种体现,第一种是 QAT 的时候精度会有影响(情况很少),第二种是 QAT 转 Quantized 的时候精度会有影响。

Sriven的博客 1万+

Copula变分贝叶斯:突破VAE高斯假设的隐变量依赖建模

变分自编码器(VAE)作为深度生成模型基石,其核心局限在于后验分布强制采用各向同性高斯假设,导致对真实数据中复杂的变量依赖结构——如尾部相关性、非对称依赖与多峰耦合——建模失真。Copula理论通过Sklar定理实现边缘分布与依赖结构的解耦,为VAE后验建模提供统计严谨的替代路径。Copula变分贝叶斯(CVB-VAE)将该思想嵌入变分推断框架,支持t-Copula、Clayton等族灵活刻画强相关、极值共现与方向性依赖,在金融风控、多模态医学图像和工业时序预测等场景显著提升联合分布保真度与隐变量可解释性。

weixin_30265103的博客 407

遗传算法工程化:从早熟收敛到可控演化的实战指南

遗传算法(GA)作为一种经典智能优化方法,其核心价值不在于模拟生物进化,而在于构建可诊断、可调控的演化控制系统。理解适应度函数设计原理、种群多样性坍塌的数学判据及早熟收敛的实时监测信号,是实现GA从实验室原型迈向工业部署的关键跃迁。本文聚焦GA在黑箱优化场景(如芯片布线、新能源调度、超参搜索)中的工程落地难点,系统阐释如何通过选择压力量化控制、自适应遗传算子、多维健康度终止机制等技术手段,将GA转化为具备可观测性与干预能力的精密工具。内容深度融合种群熵、适应度函数S型拉伸等关键热词,面向需解决实际优化瓶颈的

banshen0201的博客 354

【信息科学与工程学】【运营科学】第二篇 C4信息与通信网络运营 (C4) ——数据中心网络运营01

这是运营的物理和逻辑对象。C4.11xx 传输资源:光纤、微波、卫星链路;频谱资源(Sub-6GHz, 毫米波)。C4.12xx 节点资源:核心路由器、交换机、基站(gNB)、数据中心服务器。C4.13xx 虚拟化资源:由NFV生成的虚拟网络功能(VNF)、容器、虚拟机和网络切片实例。这是实现智能、灵活运营的核心技术集。C4.21xx 软件定义与虚拟化:软件定义网络 (SDN):控制平面与数据平面分离,实现集中、可编程的网络控制。网络功能虚拟化 (NFV):将传统专用硬件设备的功能以软件形式运行在通用硬件上

weixin_49199313的博客 1404

【信息科学与工程学】【物理/化学科学和工程技术】第八篇 光学07

对于光源-探测器距离 ρ, 稳态漫反射率 R(ρ) ≈ (1/(4π)) [ z₀ (μ_eff + 1/r₁) exp(-μ_eff r₁)/r₁² + (z₀ + 2z_b) (μ_eff + 1/r₂) exp(-μ_eff r₂)/r₂² ], 其中 μ_eff = √(3μ_a(μ_a+μ_s’)), z₀=1/μ_s’, z_b 与边界条件有关。通过测量光纤各点的布里渊频移 ν_B(z) 来得到应变/温度分布:Δν_B(z) = C_ν,ε Δε(z) + C_ν,T ΔT(z)。

weixin_49199313的博客 230

深入解析KL度在PyTorch中的应用与误区

本文探讨了PHP文件上传绕过机制与服务器配置的关系,通过实例说明如何通过.php.png文件执行PHP代码。文章分析了PHP文件上传脚本的漏洞,指仅检查扩展名的不足,并演示了Apache服务器配置如何决定文件是否作为PHP执行。关键点包括:使用FilesMatch指令的正则匹配特性、服务器配置对安全的影响,以及防范建议(验证真实文件类型、安全命名策略等)。文章强调开发者和管理员需同时关注代码和服务器配置,才能有效防范文件上传安全风险。

m0_74337424的博客 472

对于训练时loss负值情况

dice loss

qq_43733107的博客 1万+

相对熵(KL度)

今天开始来讲相对熵,我们知道信息熵反应了一个系统的有序化程度,一个系统越是有序,那么它的信息熵就越低,反 之就越高。下面是熵的定义   如果一个随机变量的可能取值为,对应的概率为,则随机变 量的熵定义为                  有了信息熵的定义,接下来开始学习相对熵。   Contents      1. 相对熵的认识    2. 相对熵的性质    3. 相

ACdreamer 8万+

KL度、JS度以及交叉熵对比

在看论文《Detecting Regions of Maximal Divergence for Spatio-Temporal Anomaly Detection》时,文中提到了这三种方法来比较时间序列中不同区域概率分布的差异。 KL度、JS度和交叉熵 三者都是用来衡量两个概率分布之间的差异性的指标。不同之处在于它们的数学表达。 对于概率分布P(x)和Q(x) 1)KL度(K...

敲代码的quant的博客 3万+

KL度、JS度、Wasserstein距离

1. KLKL度又称为相对熵,信息度,信息增益。KL度是是两个概率分布P和Q 差别的非对称性的度量。 KL度是用来 度量使用基于Q的编码来编码来自P的样本平均所需的额外的位元数。 典型情况下,P表示数据的真实分布,Q表示数据的理论分布,模型分布,或P的近似分布。 定义如下: DKL(P//Q)=−∑x∈XP(x)log1P(x)+∑x∈XP(x)log1Q(x)DKL(...

木盏 4万+
上一篇: 《数学之美(第一版)》笔记 —— 第5章
下一篇: pytorch tensor clone, detach 之后梯度的变化
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值