ptorch中的nn.KLDivLoss:KL散度损失

KL散度被广泛应用于度量分布之间的差异,其形式为: D K L ( P ∣ ∣ Q ) = ∑ i = 1 N p i l o g p i q i = ∑ i = 1 N p i ∗ ( l o g p i − l o g q i ) D_{KL}(P||Q)=\sum_{i=1}^{N}p_ilog\frac{p_i}{q_i}=\sum_{i=1}^{N}p_i*(logp_i-logq_i) DKL(P∣∣Q)=i=1∑Npilogqipi=i=1∑Npi∗(logpi−logqi)  pytorch中给出了两种不同的方法用于计算KL散度,分别是torch.nn.functional.kl_div()和torch.nn.KLDivLoss(),两者计算效果类似,区别无非是直接计算和作为损失函数类,我们重点看torch.nn.KLDivLoss(),在深度学习中是一个很常见的损失。官方文档地址为:

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

函数定义:

c 复制代码
torch.nn.KLDivLoss(size_average=None, reduce=None, reduction='mean', log_target=False)

其中,size_average与reduce参数已被弃用,具体功能由参数reduction代替;reduction:指定损失输出的形式,有四种选择:none|mean|batchmean|sum。none:损失不做任何处理,直接输出一个数组;mean:将得到的损失求平均值再输出;batchmean:将输出的总和除以batchsize;sum:将得到的损失求和再输出;log_target:指定是否对输入的target使用log操作。

在使用上,nn.KLDivLoss和交叉熵损失是不同的,对于pytorch中的交叉熵损失torch.nn.CrossEntropyLoss,我们给进的网络预测结果不需要进行softmax处理,给进的labels可以仅仅是一个label的list,函数中内置了对标签进行的ont-hot操作,而在nn.KLDivLoss中并没有这种操作,因此,对于nn.KLDivLoss输入的两个分布input和target,我们首先要对其进行softmax操作。此外,当log_target参数设定为False时,计算方式为: P ∗ ( l o g P − Q ) P*(logP-Q) P∗(logP−Q),这与定义式的结果不同,因此,还需要对input取对数操作(在官方文档中也有提及,建议将input映射到对数空间,防止数值下溢),一个示例代码为:

c 复制代码
import torch
import torch.nn.Functional as F
torch.nn.KLDivLoss(F.softmax(Q).log(), F.softmax(P), reduction='mean')
相关推荐
Narrastory14 小时前
明日香 - Pytorch 快速入门保姆级教程(一)
人工智能·pytorch·深度学习
Narrastory15 小时前
明日香 - Pytorch 快速入门保姆级教程(二)
人工智能·pytorch·深度学习
盼小辉丶6 天前
PyTorch实战(30)——使用TorchScript和ONNX导出通用PyTorch模型
人工智能·pytorch·深度学习·模型部署
封奚泽优6 天前
使用mmdetection项目进行训练记录
pytorch·python·cuda·mmdetection·mmcv
tony3656 天前
pytorch分布式训练解释
人工智能·pytorch·分布式
weixin_贾6 天前
深度学习基础理论与 PyTorch 实战 —— 从传统机器学习到前沿模型全攻略
pytorch·深度学习·机器学习
大连好光景6 天前
PyTorch深度学习----优化器
pytorch·深度学习·学习
多恩Stone7 天前
【3D-AICG 系列-11】Trellis 2 的 Shape VAE 训练流程梳理
人工智能·pytorch·算法·3d·aigc
隔壁大炮8 天前
08. PyTorch_张量基本创建方式
人工智能·pytorch·python
隔壁大炮8 天前
07. PyTorch框架简介
人工智能·pytorch·python