【深度学习】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的概率

相关推荐
LaughingZhu17 分钟前
Product Hunt 每日热榜 | 2026-09-12
人工智能·深度学习·神经网络·搜索引擎·百度
天真小巫27 分钟前
2026.9.13总结(工作量日益繁重的当下,AI如何提效)
人工智能
Zguigo29 分钟前
【CUDA1】GPUvsCPU,CUDA Kernel
人工智能·pytorch·深度学习
thesky12345633 分钟前
用 ONNX Runtime 把 PyTorch 模型变成跨平台极速推理引擎:导出、优化、量化完整实
人工智能·深度学习·模型部署
米小虾42 分钟前
把 KV Cache 从 3514 字节压到 890 字节:DeepSeek V4.1-Flash 动了什么,又没动什么
人工智能
锋行天下1 小时前
LangGraph 进阶:Command + Send 动态控制流、并行 Map-Reduce 实战与踩坑
人工智能
米小虾1 小时前
AI 观察:CEO 们集体喊"慢一点",钱却在加速进场
人工智能
微三云生态系统架构师-彭丹1 小时前
远方好物S2B2C系统架构:一级分销与保证金托管的合规技术实现
人工智能·算法
冬奇Lab1 小时前
DeepSeek Harness 系列(06):System Prompt 组装——动态提示词的工程实现
人工智能·deepseek
罗西的思考3 小时前
机器人模型(WM / WAM / VLA)综合分析与对比:从「看」到「想」再到「做」
人工智能·算法·机器学习