NLLloss,KLDivLoss,CrossEntropyLoss三类损失函数比对

news2024/7/6 17:58:20

前置知识

这三个函数在深度学习模型中十分常见,尤其是在知识蒸馏领域,经常会将这三个函数进行比较

1、Softmax函数

softmax函数通常作为多分类以及归一化函数使用,其公式如下:
s o f t m a x ( x ) = e x i ∑ i = 1 e x i softmax(x)=\frac{e^{x_i}}{\sum_{i=1} e^{x_i}} softmax(x)=i=1exiexi
softmax函数有些重点的特点:

  • 所有经过softmax输出数值总和为1且大于0,这满足一个概率分布。这点很好理解,因为分母是个求和,所有分式分子加起来就会得到分母
  • 扩大化大小差距。这是由指数函数 e x e^x ex造成的,根据指数函数图像,自变量值 x x x越大,其因变量 y y y值增长的越快。可以看下面这个例子
x1234
softmax(x)0.0320.0870.2370.644

这就进一步带来一个问题,是否可以通过一个方法,使数之间差距没有那么大呢?这里我们使用了一个超参数温度T,来控制差距,公式如下:
s o f t m a x ( x , T ) = e x i t ∑ i = 1 e x i t softmax(x,T)=\frac{e^\frac {x_i}t}{\sum_{i=1} e^\frac {x_i}t} softmax(x,T)=i=1etxietxi
然后接着之前的例子,我们令T=0.5,1,2,4时,观察数据的变化。

T\x1234
0.50.0020.0160.1170.865
10.0320.0870.2370.644
20.1010.1670.2760.455
40.1650.2120.2720.350

可以发现随着 T T T的增大,不同类别之间的差距值越小(对负标签,即非正确标签关注度更高),但是大小关系并不改变。下图是另一个softmax值与温度的关系图。
请添加图片描述

2、log_softmax函数

log_softmax函数就是将softmax得到的输出值作为对数函数的输入值
l o g ( s o f t m a x ( x ) ) log(softmax(x)) log(softmax(x))

NLLLoss函数

NLLloss是衡量两者之间的差距,公式如下:
N L L l o s s ( p , q ) = − ∑ i = 1 q i l o g p i NLLloss(p,q)=-\sum_{i=1} q_ilogp_i NLLloss(p,q)=i=1qilogpi
这里涉及到信息熵的概念,小伙伴们可以通过我关于机器学习贝叶斯那一篇博客去了解。简单理解来说就是, p , q p,q p,q两者差距越大则最后损失函数值越大,负号的作用就是为了满足这个关系

CrossEntropyLoss函数

CrossEntropy函数又称交叉熵损失函数,其实公式表现形式和NLL损失函数一致,但是 p 、 q p、q pq具体含义不同,这里的 p 、 q p、q pq是要经过log_softmax的【在pytorch中】
C r o s s E n t r o p y L o s s ( p , q ) = − ∑ i = 1 q i l o g p i CrossEntropyLoss(p,q)=-\sum_{i=1} q_ilogp_i CrossEntropyLoss(p,q)=i=1qilogpi

KLDivLoss函数

KLDivLoss是用来判断两个分布的拟合/相似/匹配程度,假设现在有两个概率分布 P 、 Q P、Q PQ,它们的KL散度分别为:
D K L ( P ∣ ∣ Q ) = − ∑ i P ( i ) l n Q ( i ) P ( i ) = ∑ i P ( i ) l n P ( i ) Q ( i ) D K L ( p ∣ ∣ q ) = ∑ i p ( x i ) l n p ( x i ) q ( x i ) = ∑ i p ( x i ) [ l o g ( p ( x i ) ) − l o g ( q ( x i ) ) ] D_{KL}(P||Q)=-\sum_i P(i)ln\frac{Q(i)}{P(i)}=\sum_i P(i)ln\frac{P(i)}{Q(i)}\\ D_{KL}(p||q)=\sum_i p(x_i)ln\frac{p(x_i)}{q(x_i)}=\sum_i p(x_i)[log(p(x_i))-log({q(x_i)})] DKL(P∣∣Q)=iP(i)lnP(i)Q(i)=iP(i)lnQ(i)P(i)DKL(p∣∣q)=ip(xi)lnq(xi)p(xi)=ip(xi)[log(p(xi))log(q(xi))]
KLDivLoss适合用于连续分布的距离度量;并且对离散采用的连续输出空间分布进行回归通常很有用

NLLLoss与CrossEntropyLoss、KLDivLoss区别

NLLLoss与CrossEntropyLoss的区别在于一个log_softmax()函数,KLDivLoss与其它两者的区别在于其实两个KL散度之差再求和,而另外两者是求和(当然具体公式会有一定区别)

#NLLloss
def forward()
	x=self.fc2(x)
	x=F.log_softmax(x,dim=1)
return x

F.nll_loss()

#CrossEntropy
def forward()
	x=self.fc2(x)
return x

F.cross_entropy()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/719784.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Drools概述和基本原理

目录 ​编辑 一、Drools是什么? 二、Drools使用场景 三、Drool架构内容 3.1 总体架构 3.2 构成内容说明 3.2.1 Rules 3.2.2 Production memory 3.2.3 Facts 3.2.4 Working memory 3.2.5 Pattern matcher 3.2.6 Agenda 四、为什么要用规则引擎? 4.1 声明…

el-descriptions的使用

el-descriptions的使用 解释&#xff1a; 我们页面有很多无序的列表展示&#xff0c;为了高效得去开发我们得页面&#xff0c;可以借助于这个组件进行适应。图片&#xff1a; 代码&#xff1a; template部分 <el-descriptions class"margin-top" :column"…

IP数据云揭示高风险IP的来源地

在全球网络安全日临近之际&#xff0c;IP数据云揭示高风险IP的来源地。这些高风险IP以其潜在威胁和犯罪活动而闻名&#xff0c;已引起了全球范围内的关注。 根据IP数据云介绍&#xff0c;高风险IP的主要来源地是位于亚洲和东欧的国家其中包括俄罗斯、朝鲜和乌克兰等地。这些地区…

论文阅读:Segment Anything之阅读笔记

目录 引言整体结构介绍论文问答代码仓库中&#xff0c;模型哪部分转换为了ONNX格式&#xff1f;以及如何转的&#xff1f;Mask decoder部分 Transformer decoder block?如何整合image_embedding&#xff0c;image_pe, sparse_prompt_embedding和dense_prompt_embedding的&…

Android Framework基础面试必问习题~

AMS 下面是一些可能会被问到的 Android Framework 中 Activity Manager Service (AMS) 相关的面试题&#xff1a; 1.什么是 AMS&#xff1f; AMS 是 Android framework 中的一个系统进程&#xff0c;它负责管理应用程序生命周期&#xff0c;处理应用程序间的交互和协调不同组…

用Electron将Vue项目打包成桌面版软件

创建Electron项目这里是直接通过官方教程创建的 要检查 Node.js 是否正确安装&#xff0c;请在您的终端输入以下命令&#xff1a; node -vnpm -v这两个命令应输出了 Node.js 和 npm 的版本信息。 创建Electron应用程序 使用脚手架创建 Electron 应用程序遵循与其他 Node.js…

【Squid 代理服务器应用】

目录 一、Squid 代理服务器1、代理的工作机制2、代理服务器的概念及其作用3、Squid 代理的类型 二、安装 Squid 服务1&#xff0e;编译安装 Squid2&#xff0e;修改 Squid 的配置文件3&#xff0e;Squid 的运行控制1、检查配置文件语法是否正确2、启动 Squid&#xff0c;第一次…

在SpringBoot中对es集群的查询操作

在进行查询之前要先给ll索引中插入数据: POST /ll/product/1 {"id":1,"title": "小米手机Mix","category": "手机","brand": "小米","price": 2899.00,"images": "http://ima…

【数据结构】——常见排序算法(演示图+代码+算法分析)

目录 1. 常见排序算法 1.2 稳定性 2. 常见排序算法的实现 2.1 插入排序 2.1.1基本思想 2.1.2代码 2.1.4算法分析 2.2 希尔排序 2.2.1基本思想 2.2.2代码 2.2.3演示图 2.2.4算法分析 2.3 选择排序 2.3.1基本思想 2.3.2代码 2.3.3演示图 2.3.4算法分析 2.4 堆排…

[Visual Studio 报错] error 找不到指定的 SDK“Microsoft

[Visual Studio 2022 报错] error : 找不到指定的 SDK“Microsoft.NET.Sdk.Web” 问题描述&#xff1a; 在新电脑上安装了VS2022&#xff0c;打开现有项目的解决方案后的时候报了这个错&#xff0c;所有projet文件都加载失败,如图所示&#xff1a; 报错分析及解决 打开项目配…

黑客是怎样炼成的?

前言 首先我谈下对黑客&网络安全的认知&#xff0c;其实最重要的是兴趣热爱&#xff0c;不同于网络安全工程师&#xff0c;他们大都是培训机构培训出来的&#xff0c;具备的基本都是防御和白帽子技能&#xff0c;他们绝大多数的人看的是工资&#xff0c;他们是为了就业而学…

MFC扩展库BCGControlBar Pro v33.5新版亮点 - 控件、脚本管理增强

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版 v33.5已正式发布了&#xff0c;此版本包含了Ribbon&#xff08;功能区&#xff09;自定义…

CSS文本样式

CSS文本样式 1、字体 友情提醒&#xff1a; 字体有没有版权&#xff1f; 省略写法 语法&#xff1a; [ [ <‘font-style’> || || <‘font-weight’> || <‘font-stretch’> ]? <‘font-size’> [ / <‘line-height’> ]? <‘font-fam…

IDEA2023.1.3自带插件禁用,减少内存占用

前言 前两个星期安装了idea2023.1.3&#xff08;之前用的一直是idea2020.3版本&#xff09;&#xff0c;我发现新版界面确实更好看一些&#xff0c;而且启动速度也非常快&#xff0c;打开多个项目也一样很快&#xff0c;都是秒开。但是吧&#xff0c;它的内存占用比idea2020.3…

【若依】框架搭建,前端向后端如何发送请求,验证码的实现,开启注册功能

若依框架 若依框架&#xff08;Ruoyi&#xff09;是一款基于Spring Boot和Spring Cloud的开源快速开发平台。它提供了一系列的基础功能和通用组件&#xff0c;能够帮助开发者快速构建企业级应用。若依框架采用了模块化的设计理念&#xff0c;用户可以选择需要的功能模块进行集…

(03)QEMU模拟ATF启动

QEMU启动 准备一个目录qemu_boot存放所有镜像文件。最终启动需要的镜像如下所示。 Image QEMU_EFI.fd bl1.bin bl2.bin bl31.bin fip.bin flash.bin rootfs.cpio.gz准备镜像 EDK2 下载QEMU_EFI。 wget http://snapshots.linaro.org/components/kernel/leg-virt-tian…

go-redis

安装redis&#xff08;docker&#xff09; sudo docker pull redis sudo docker images 在官网下载redis.conf配置文件 redis官网&#xff1a;http://www.redis.cn/download.html 将下载后的压缩包解压得到redis.conf文件&#xff0c;放到自己的目录&#xff0c;我的是/hom…

数据结构与算法——图

&#x1f60a;数据结构与算法——图 &#x1f680;前言&#x1f680;图的基本概念&#x1f6a2;图的定义&#x1f6a2;图的基本操作&#x1f6a2;无向图和有向图&#x1f6a2;完全图&#x1f6a2;顶点的度、入度和出度&#x1f6a2;子图&#x1f6a2;顶点关系常用术语&#x1f…

我想在我自己的系统中加入微信支付功能,原来这么简单!!!

微信支付功能实现 一、创建SpringBoot项目 我们首先创建一个基本的SpringBoot项目。添加相关的依赖。 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId>&…