【深度学习】pytorch计算KL散度、kl_div

使用pytorch进行KL散度计算,可以使用pytorch的kl_div函数

假设y为真实分布,x为预测分布。

java 复制代码
import torch
import torch.nn.functional as F

# 定义两组数据
tensor1 = torch.tensor([[0.1, 0.2, 0.3, 0.2, 0.2],
                        [0.2, 0.1, 0.2, 0.3, 0.2],
                        [0.2, 0.3, 0.1, 0.2, 0.2],
                        [0.2, 0.2, 0.3, 0.1, 0.2],
                        [0.2, 0.2, 0.2, 0.3, 0.1],
                        [0.1, 0.2, 0.2, 0.2, 0.3],
                        [0.3, 0.2, 0.1, 0.2, 0.2],
                        [0.2, 0.3, 0.2, 0.1, 0.2],
                        [0.1, 0.2, 0.2, 0.3, 0.2],
                        [0.2, 0.1, 0.3, 0.2, 0.2],
                        [0.2, 0.3, 0.2, 0.2, 0.1],
                        [0.1, 0.1, 0.2, 0.3, 0.3],
                        [0.3, 0.2, 0.2, 0.1, 0.2],
                        [0.2, 0.3, 0.1, 0.2, 0.2],
                        [0.1, 0.3, 0.2, 0.2, 0.2],
                        [0.2, 0.2, 0.1, 0.3, 0.2]])

tensor2 = torch.tensor([[0.2, 0.1, 0.3, 0.2, 0.2],
                        [0.3, 0.2, 0.2, 0.1, 0.2],
                        [0.2, 0.3, 0.2, 0.2, 0.1],
                        [0.1, 0.2, 0.3, 0.2, 0.2],
                        [0.2, 0.2, 0.1, 0.2, 0.3],
                        [0.3, 0.2, 0.2, 0.3, 0.0],
                        [0.2, 0.3, 0.1, 0.2, 0.2],
                        [0.1, 0.2, 0.2, 0.3, 0.2],
                        [0.2, 0.1, 0.3, 0.2, 0.2],
                        [0.2, 0.3, 0.2, 0.1, 0.2],
                        [0.1, 0.2, 0.3, 0.2, 0.2],
                        [0.2, 0.3, 0.2, 0.2, 0.1],
                        [0.2, 0.1, 0.2, 0.3, 0.2],
                        [0.3, 0.2, 0.2, 0.1, 0.2],
                        [0.2, 0.2, 0.3, 0.2, 0.1],
                        [0.1, 0.3, 0.2, 0.2, 0.2]])

# 计算两组张量之间的 KL 散度
logp_x = F.log_softmax(tensor1, dim=-1)
p_y = F.softmax(tensor2, dim=-1)

kl_divergence = F.kl_div(logp_x, p_y, reduction='batchmean')
kl_sum = F.kl_div(logp_x, p_y, reduction='sum')
print("KL散度(batchmean)值为:", kl_divergence.item())
print("KL散度(sum)值为:", kl_sum.item())

打印结果:

复制代码
KL散度(batchmean)值为: 0.00508523266762495
KL散度(sum)值为: 0.0813637226819992  

其中kl_div接收三个参数,第一个为预测分布,第二个为真实分布,第三个为reduction。(其实还有其他参数,只是基本用不到)

这里有一些细节需要注意,第一个参数与第二个参数都要进行softmax(dim=-1),目的是使两个概率分布的所有值之和都为1,若不进行此操作,如果x或y概率分布所有值的和大于1,则可能会使计算的KL为负数。

softmax接收一个参数dim,dim=-1表示在最后一维进行softmax操作。

除此之外,第一个参数还要进行log()操作(至于为什么,大概是为了方便pytorch的代码组织,pytorch定义的损失函数都调用handle_torch_function函数,方便权重控制等),才能得到正确结果。还有说是因为要用y指导x,所以求x的对数概率,y的概率

相关推荐
海宇大数据1 分钟前
零信任架构实战:基于海宇身份证OCR构建自动化跨境清关核验网关
人工智能·架构·c#·自动化
强壮的CAT5 分钟前
VINS-Fusion 移植 ROS2 Jazzy 踩坑(一):环境与编译
人工智能·算法·机器人·自动驾驶
Omics Pro13 分钟前
计算虚拟扰动:网络毒理+虚拟敲除
数据库·人工智能·算法·机器学习·自然语言处理
正经教主14 分钟前
【FDE系列】阶段3:Day 63:文档解析 — 把真实 PDF 手册变成可用文本
人工智能·pdf·fde
AI人工智能+2 小时前
行驶证识别技术融合计算机视觉与自然语言处理,实现对模糊、倾斜、反光等复杂场景下行驶证的高精度结构化数据提取
人工智能·深度学习·自然语言处理·ocr·行驶证识别
weixin_750330235 小时前
AI获客工具选型:从技术架构看中小企业效率提升方案
大数据·人工智能·架构·ai获客
mpp0076 小时前
36氪《2026 中国 AI Agent 行业发展报告》:当 Agent 进入「交付」主战场
大数据·人工智能
吃饱了得干活8 小时前
Agent 的决策与规划:ReAct、Plan-and-Execute、Reflexion 与 Tree of Thoughts
人工智能·llm·agent
阿明68 小时前
小白入门机器学习基础【AI】
人工智能·机器学习
java资料站8 小时前
十一、评估测试
开发语言·人工智能·python