交叉熵函数与kl散度的区别

使用Pytorch实现KL散度 Kullback-Leibler(KL)散度是衡量两个概率分布之间差异的一种方法。对于离散型随机变量,KL散度定义为一个分布相对于另一个分布的期望信息增益。 阅读详情

公式上的区别

手动计算的方式展示如何实现这两个损失函数

交叉熵损失函数

import torch
import torch.nn.functional as F

# 模型的输出 logits 和真实标签 target
logits = torch.tensor([[2.0, 0.5, 0.1], [0.3, 2.5, 0.8]], requires_grad=True)
target = torch.tensor([0, 1])  # 真实标签

# 计算 softmax 以获得预测概率
pred_probs = F.softmax(logits, dim=1)

# 将 target 转换为 one-hot 编码
target_one_hot = F.one_hot(target, num_classes=logits.size(1))

# 交叉熵损失公式:L = - Σ y * log(ŷ)
cross_entropy_loss = - torch.sum(target_one_hot * torch.log(pred_probs)) / logits.size(0)

print('手动实现的交叉熵损失:', cross_entropy_loss)

kl散度

import torch
import torch.nn.functional as F

# 模型的输出 logits 和目标分布 target_probs
logits = torch.tensor([[2.0, 0.5, 0.1], [0.3, 2.5, 0.8]], requires_grad=True)
target_probs = torch.tensor([[0.7, 0.2, 0.1], [0.1, 0.7, 0.2]])  # 目标分布

# 将 logits 转换为 log softmax
logits_log_softmax = F.log_softmax(logits, dim=1)

# KL 散度公式:D_KL(P || Q) = Σ P * (log P - log Q)
kl_div_loss = torch.sum(target_probs * (torch.log(target_probs) - logits_log_softmax)) / logits.size(0)

print('手动实现的KL散度:', kl_div_loss)

官方打包好的函数

交叉熵损失 (Cross Entropy Loss) 官方实现

import torch
import torch.nn as nn

# 创建交叉熵损失函数实例
cross_entropy_loss_fn = nn.CrossEntropyLoss()

# 假设模型的输出 logits 和真实标签 targets
logits = torch.tensor([[2.0, 0.5, 0.1], [0.3, 2.5, 0.8]], requires_grad=True)
targets = torch.tensor([0, 1])  # 真实标签 (整数形式)

# 计算交叉熵损失
loss = cross_entropy_loss_fn(logits, targets)
print('官方交叉熵损失:', loss)

KL 散度损失 (KL Divergence Loss) 官方实现

import torch
import torch.nn as nn
import torch.nn.functional as F

# 创建KL散度损失函数实例
kl_div_loss_fn = nn.KLDivLoss(reduction='batchmean')  # 使用 'batchmean' 计算每个样本的平均损失

# 假设模型的输出 logits 和目标分布 target_probs
logits = torch.tensor([[2.0, 0.5, 0.1], [0.3, 2.5, 0.8]], requires_grad=True)
target_probs = torch.tensor([[0.7, 0.2, 0.1], [0.1, 0.7, 0.2]])  # 目标分布 (已经是 softmax 概率)

# 计算 log softmax 以用于 KL 散度
logits_log_softmax = F.log_softmax(logits, dim=1)

# 计算KL散度损失
kl_loss = kl_div_loss_fn(logits_log_softmax, target_probs)
print('官方KL散度损失:', kl_loss)

加上温度

是的,KL 散度在深度学习中,尤其是知识蒸馏(Knowledge Distillation)中,常常与温度参数(Temperature, TTT)结合起来使用。温度调节可以让模型的预测分布更加平滑,从而在蒸馏过程中更有效地传递知识。下面将解释为什么 KL 散度与温度结合,以及如何使用温度参数。

温度在知识蒸馏中的作用

在知识蒸馏中,通常有一个教师模型(Teacher Model)和一个学生模型(Student Model)。教师模型的输出概率分布用来指导学生模型的训练,但直接使用教师模型的概率分布往往过于“尖锐”(即,教师模型的 softmax 输出大部分概率集中在正确类别)。为了使分布更加平滑,加入了温度参数。

温度对 softmax 的影响

softmax 函数将模型的 logits 转换为概率分布。加上温度参数 TTT 后的 softmax 表达式为:

  • 当 T=1T = 1T=1,softmax 正常工作,输出标准的概率分布。
  • 当 T>1T > 1T>1,softmax 输出变得更加平滑(分布更加均匀)。
  • 当 T<1T < 1T<1,softmax 输出更加“尖锐”,即概率分布更加接近 one-hot 编码。

在知识蒸馏中,通过引入较高的温度 TTT,可以让教师模型输出的概率分布变得更加平滑,从而包含更多类的信息,帮助学生模型更好地学习。

温度结合 KL 散度

在知识蒸馏过程中,学生模型通常通过最小化学生模型与教师模型之间的KL 散度来学习教师模型的输出分布。引入温度后,KL 散度的损失计算公式如下:

其中:

  • T2是为了平衡梯度的影响,避免由于高温度导致的梯度缩小。
  • DKL​ 表示 KL 散度,用于比较教师模型和学生模型的概率分布。

PyTorch 实现带温度的 KL 散度

你可以在 PyTorch 中手动实现带温度参数的 KL 散度,如下所示:

import torch
import torch.nn.functional as F

def distillation_kl_divergence_loss(logits_student, logits_teacher, temperature):
    """
    计算带温度参数的KL散度,用于知识蒸馏
    :param logits_student: 学生模型的logits (未经过softmax)
    :param logits_teacher: 教师模型的logits (未经过softmax)
    :param temperature: 温度参数T
    :return: 知识蒸馏中的KL散度损失
    """
    # 计算log softmax(学生和教师模型的输出都经过温度缩放)
    log_probs_student = F.log_softmax(logits_student / temperature, dim=1)
    probs_teacher = F.softmax(logits_teacher / temperature, dim=1)

    # 计算KL散度损失,并乘以T^2
    kl_div_loss = F.kl_div(log_probs_student, probs_teacher, reduction='batchmean') * (temperature ** 2)
    
    return kl_div_loss

# 示例
logits_student = torch.tensor([[2.0, 0.5, 0.1], [0.3, 2.5, 0.8]], requires_grad=True)
logits_teacher = torch.tensor([[2.1, 0.6, 0.1], [0.2, 2.6, 0.7]], requires_grad=False)
temperature = 2.0  # 温度参数

# 计算带温度的KL散度损失
kl_loss = distillation_kl_divergence_loss(logits_student, logits_teacher, temperature)
print('带温度的KL散度损失:', kl_loss)

pytorch中的KL散度详解torch.nn.functional.kl_div F.kl_div是 PyTorch 中的一个函数,用于计算两个概率分布之间的 Kullback-Leibler (KL) 散度。KL 散度是一种非对称的测量,用于衡量两个概率分布的相似度。如果两个分布完全相同,KL 散度为零;否则,KL 散度为一个正数。在 PyTorch 中,F.kl_div的输入是两个张量,其中第一个张量的每个元素应该是第二个张量对应元素的对数概率。因此,F.kl_div的输入应该满足下面的条件:第一个输入张量input:这个张量的元素应该是第二个张量对应元素的对数概率,即。 阅读详情

相关推荐

KL散度损失函数

2021SC@SDUSC

m0_53444618的博客 1万+

PyTorch中计算KL散度详解

首先简单介绍一下KL散度(具体的可以在各种技术博客看到讲解,我这里不做重点讨论)。从名称可以看出来,它并不是严格意义上的距离(所以才叫做散度~),原因是它并不满足距离的对称性,为了弥补这种缺陷,出现了JS散度(这就是另一个故事了…)DKL(P∣∣Q)=∑i=1Npilog⁡piqi=∑i=1Npi∗(log⁡pi−log⁡qi)DKL(P∣∣Q)=i=1∑N​pi​log。

qq_45802280的博客 1万+

KL散度和交叉熵有什么关系?logits是什么?知识蒸馏损失函数如何选择?为什么深度网络(vgg,resnet)最后都不使用softmax函数,而是直接使用fc层的输出作为output?

KL散度和交叉熵有什么关系?logits是什么?知识蒸馏损失函数如何选择?为什么深度网络(vgg,resnet)最后都不使用softmax函数,而是直接使用fc层的输出作为output?

ykn37的博客 2990

【深刻理解KL散度】为什么许多分类网络使用交叉熵作为损失函数,而非KL散度损失?交叉熵和KL散度的联系与区别。

这个其实很容易理解,如果一件事情很容易发生,比如说"明天会是晴天",其包含的信息量很小,你会觉得很平常一件事儿,没有什么意思。而如果有个极小概率发生的事情比如"明天会发生地震",你会觉得很震惊,因为它带来的信息量是很大的。有了信息量的概念之后,香农定义了信息熵,故也称为香农熵。不同于信息量描述的是一个随机事件,信息熵用于描述一个。以抛硬币为例,如果定义硬币朝上为事件。当一个均匀硬币,它的真实概率分布为。而在实验中,我们预测的概率分布为。通过上面的计算,我们可以观察到,对于一个非均匀硬币,

qq_55087001的博客 2035

kl散度度量分布_KL散度理解以及使用pytorch计算KL散度

(最近要使用KL散度计算损失函数,发现自己对KL散度还是一知半解,于是花了些时间去学校,使用pytorch也踩了些坑,做些笔记,以下是我个人对KL散度的理解,若有出错还请大佬们指点指点~)概念KL散度可以用来衡量两个概率分布之间的相似性,两个概率分布越相近,KL散度越小。 (1)通常P为真实事件的概率分布,Q为理论拟合出来的该事件的概率分布。因为 (P拟合Q)和 (Q拟合P)是不一样的。举...

weixin_42420422的博客 2610

softmax+交叉熵

1、softmax函数 softmax函数的定义为: softmax函数的特点: ● 函数值在[0,1]之间; ● 所有的softmax(xi)相加的总和是1 面对一个分类问题,能将输出的yi转换成[0,1]的概率,选择最大的概率yi作为分类的结果。 sigmoid函数定义为: sigmoid函数将每个yi映射到[0,1]之间,但每个yi之间是相互独立的,∑yi与1没有关系,可以用作二分类;而softmax函数的本质是将一个k维数据[a1,a2,a3,…,ak]映射成另外一个K维向量[b1,b2,b3

Dear_learner的博客 3064

KL散度相关知识点总结

KL散度 定义及说明 KL散度(KL divergence)是度量两个分布之间差异的函数。测量两个概率分布之间的距离。如果两个分布越接近,那么KL散度越小,如果越远,KL散度就会越大。 考虑一个未知的分布p(x)p(x)p(x),假定用一个 近似的分布q(x)q(x)q(x) 对其进行建模。 如果我们使用 q(x) 来建立一个编码体系,用来把 x 的值传给接收者,那么由于我们使用了q(x)而不是真实分布p(x),平均编码长度比用真实分布p(x)进行编码增加的信息量(单位是 nat )为: KL(p∣∣q) 

易之道的博客 1万+

手把手教你用QEMU虚拟化华为路由器固件(附完整网络配置指南)

本文提供了一份详尽的QEMU虚拟化华为路由器固件的实战指南。从固件解包、网络桥接配置到QEMU虚拟机启动,手把手教你搭建完整的嵌入式设备沙箱环境,特别适合安全研究、逆向分析和学习嵌入式系统工作原理。

tgb3456789的博客 933

交叉熵(Cross-Entropy)和KL散度(Kullback-Leibler Divergence)的联系与区别

本文将深入探讨它们的定义、数学公式、联系与区别,并通过例子说明其意义。

阿正的梦工坊 3213

HALCON 20.11实战:5步搞定工业图像异常检测(附完整代码)

本文提供了一份基于HALCON 20.11的工业图像异常检测实战指南。通过五个核心步骤——环境准备、数据预处理、模型训练、推理解析与工程化部署,详细演示了如何利用深度学习技术,仅使用正常样本快速构建并优化金属表面划痕等缺陷的检测模型,并附有完整可运行的HDevelop代码,助力工程师实现高效、智能的工业视觉质检。

weixin_29243279的博客 135

实例讲解MOS管电源开关电路的软启动

1、控制电源开关的输入信号 Control 为低电平或高阻时,三极管Q2的基极被拉低到地,为低电平,Q2不导通,进而MOS管Q1的Vgs = 0,MOS管Q1不导通,+5V_OUT 无输出。此时将 Control 设为低电平,三极管Q2关闭,电容C1与G极相连端通过电阻R2放电,电压逐渐上升到5V,起到软关闭的效果。不过从作者的描述来看,只是电路参数有区别,能通过的电流、能承受的耐压等不一样,但是软启动的原理是一样的。从公式可以看出,当电容容量越大,电压越高,时间越短,电流就会越大,从而形成浪涌电流。

U_YAO的博客 2万+

KL(Kullback-Leibler)散度和交叉熵

信息增益是在决策树算法中用于选择最佳特征的一种评价指标。在决策树的生成过程中,选择最佳特征来进行节点的分裂是关键步骤之一,信息增益可以帮助确定最佳特征。信息增益衡量了在特征已知的情况下,将样本集合划分成不同类别的纯度提升程度。它基于信息论的概念,使用熵来度量样本集合的不确定性。具体而言,信息增益是原始集合的熵与特定特征下的条件熵之间的差异。在决策树的生成过程中,选择具有最大信息增益的特征作为当前节点的分裂标准,可以将样本划分为更加纯净的子节点。

u012374012的专栏 1034

深度篇——图像处理的一些方法(一) 关于 图像处理的三个层次 与 selective search

返回主目录 返回 图像处理的一些方法 目录 下一章:深度篇——图像处理的一些方法(二)细说性能评估 IOU和 GIOU 目录内容 深度篇——图像处理的一些方法(一)关于图像处理的三个层次 与 selective search 深度篇——图像处理的一些方法(二)细说性能评估 IOU和 GIOU 深度篇——图像处理的一些方法(三)细说 HOG特征与bag-o...

天下所弃,不过其纪。世间事,在人,在志。 2913

Pytorch中KL loss

第三个参数reduction有三种取值,为 none 时,各点的损失单独计算,输出损失与输入(x)形状相同;为 mean 时,输出为所有损失的平均值;为 sum 时,输出为所有损失的总和。

flyingluohaipeng的博客 4982

uniapp - 超详细 H5 网页利用 uni.downloadFile 下载 URL 文件流并调用浏览器下载功能效果,前台通过请求后端接口获取文件并下载保存到本地(支持电脑PC与手机移动端H5)

uniapph5网页下载文件,uniapp网站下载文件流,uniapp的移动端h5实现接口url文件下载,uniapph5页面在浏览器中如何下载指定url文件流文件并保存到本地,uniapp移动端h5调用后端接口保存文件到本地,uniapph5通过下载后获得临时路径怎么让浏览器弹出下载,uniapp怎么请求接口下载到文件,得到Blob临时路径对象后如何下载到本地,浏览器怎么下载blob对象,uniapp二进制文件流下载,uniapph5中的文件流下载和指定的url下载详细教程,uniappapp移

🏆 前端领域优质创作者 1万+

10、现代统计方法:趋势面分析、薄板样条与广义线性模型

本文系统介绍了空间预测建模中的三种现代统计方法:趋势面分析(TSA)、薄板样条(TPS)和广义线性模型(GLM)。详细阐述了每种方法的原理、实现步骤、参数优化与预测评估,并结合R语言代码示例展示了在实际数据中的应用。文章还提供了方法对比流程图与土壤湿度预测案例,帮助读者根据数据特征选择合适模型,提升空间预测的准确性与可靠性。

play7的博客 152

【深度学习】损失函数(1):Cross-Entropy Loss 交叉熵损失(代价函数和损失函数的区别+交叉熵与KL散度、信息熵/熵之间的关系)

优化我们的神经网络,使计算出的交叉熵最小,这就是交叉熵损失的基本思想

weixin_46564151的博客 1185

微信小程序逆向实战:从HTTPS抓包到API接口全解构

方案原理优点缺点方案一:使用低版本微信+系统代理微信7.0以下版本未强制不走代理操作简单容易被封号,无法使用新版小程序方案二:Hook SSL层(Xposed/Frida)动态Hook Java的TrustManager或系统的SSLContext,绕过证书校验灵活可控需要Root/越狱,技术门槛高方案三:VPN转发抓包(PacketCapture)利用Android VPNService将所有流量转发到本地代理无需Root,兼容性好部分机型存在性能问题。

2201_76125261的博客 261

(一文理解)信息量、熵、KL散度、交叉熵及CrossEntropyLoss

本文首先重温了一些常见的对数函数运算法则,接着介绍了什么是信息量和熵,然后通过KL散度推出交叉熵损失函数的表达式,最后详解PyTorch常用的交叉熵损失函数CrossEntropyLoss()并进行代码实现。

这个函数可导的博客 1459

AutoSAR系列讲解(入门篇)4.6-BSW的Watchdog功能

BSW的看门狗功能

雪云飞星的博客 1万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

LLM损失函数面试会问到的

KL(Kullback-Leibler散度衡量了两个概率分布之间的差异。DKLPQ−∑x∈XPxlog⁡1Px∑x∈XPxlog⁡1QxDKL​P//Q−∑x∈X​PxlogPx1​∑x∈X​PxlogQx1​信息增益是在决策树算法中用于选择最佳特征的一种评价指标。在决策树的生成过程中,选择最佳特征来进行节点的分裂是关键步骤之一,信息增益可以帮助确定最佳特征。

kingJamesbond的博客 1172

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

损失函数——交叉熵损失函数

交叉熵损失函数

YCCNUST的博客 7584

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

#本质上理解# 熵、交叉熵、KL散度的关系

1. 两者的关系 【1】熵:可以表示一个事件A的自信息量,也就是A包含多少信息。 【2】KL散度:可以用来表示从事件A的角度来看,事件B有多大不同。 【3】交叉滴:可以用来表示从事件A的角度来看,如何描述事件B。 一句话总结的话:KL散度可以被用于计算代价,而在特定情况下最小化KL散度等价于最小化交叉熵。而交叉熵的运算更简单,所以用交叉熵来当做代价。 2. 交叉熵的计算 Gamma公式展示 Γ(n)=(n−1)!∀n∈N\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N

lch551218的博客 2165

交叉熵损失函数Cross-entropy loss及比较

交叉熵损失函数Cross-entropy loss及比较交叉熵和Sigmoid交叉熵和对数损失函数交叉熵和极大似然函数交叉熵和平方差损失函数 交叉熵和Sigmoid sigmoid一般在神经网络中作为激活函数,交叉熵作为损失函数。 但是交叉熵可以由sigmoid推导而来。 交叉熵和对数损失函数 两者本质上没有差别。 交叉熵和极大似然函数 联系:交叉熵可由极大似然函数在伯努利分布的条件下推导出来,最小化交叉熵函数的本质就是对数似然函数的最大化。 区别:交叉熵函数使用来描述模型预测值和真实值的差距大小,越

bblingbbling的博客 2523

Pytorch深度学习笔记(02)--损失函数、交叉熵、过拟合与欠拟合

一、损失函数 损失函数(loss function)是用来估量你模型的预测值与真实值的差异程度,损失函数越小,模型的鲁棒性就越好。 常用损失函数小结 平方损失 0-1损失 Log损失 Hinge损失 指数损失 感知损失 二、交叉熵损失函数详解 一般使用交叉熵作为损失函数时,在模型的输出层总会接一个softmax函数。 交叉熵 主要用于度量两个概率分布间的差异性,要理解交叉熵,需要先了解下面几个概念。 信息量 信息量的大小与信息发生的概率成反比。概率越大,信息量越小。概率越小,信息量

weixin_45788643的博客 2502

机器学习与深度学习7:一文搞懂多种融合二元交叉熵损失函数,one-hot编码,KL散度,交叉熵损失函数

本文介绍了神经网络中分类任务的损失函数计算方法。在多分类任务中,使用one-hot编码表示类别概率分布,通过softmax函数将输出转化为概率分布,并用KL散度或交叉熵损失函数衡量预测误差。二分类任务则采用0/1标签和sigmoid归一化,其二元交叉熵损失函数公式为L=-[y*logŷ+(1-y)*log(1-ŷ)]。针对样本不平衡问题,提出了平衡交叉熵损失函数,通过权重系数α调整正负样本的影响。文中还给出了Python中BCEWithLogitsLoss的实现示例及计算过程,展示了如何应用这些损失函数解决

gr1423428723的博客 1438
上一篇: 把kl散度拆开
下一篇: BCE损失解析
pythonSuperman
博客等级 码龄6年 7760粉丝 499原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值