史上最全交叉熵损失函数详解

article/2025/9/10 3:49:39

在我们自学神经网络神经网络的损失函数的时候会发现有一个思路就是交叉熵损失函数,交叉熵的概念源于信息论,一般用来求目标与预测值之间的差距。比如说我们在人脑中有一个模型,在神经网络中还有一个模型,我们需要找到神经网络模型跟人脑模型最相近的那一个,那就需要找到一个方法需要定量的去看待两个模型的差异。

文章目录

  • 1 交叉熵
    • 1.1熵
      • 1.1.1信息量
    • 1.2相对熵,kl散度
  • 2 交叉熵函数的应用分析
    • 2.1 交叉熵函数单分类问题应用
    • 2.2交叉熵在多分类问题中的使用
    • 2.3学习过程与优缺点
      • 2.3.1二分类情况
      • 2.3.2优缺点
          • 2.3.1.2优点
          • 2.3.1.3缺点
  • 总结


1 交叉熵


交叉熵其实就是运用了熵的概念先把模型转化为熵的数值然后用数值去比较模型之间的差异。
那为什么要用熵?熵是指一个模型体系的混乱程度。如果两个模型是同一类的比如说都是高斯分布,这样可以直接进行比较。那如果一个是高斯分布一个是泊松分布那就无法直接进行比较。同时人脑模型跟神经网络模型一样也有混乱度,要理解交叉熵,需要先了解下面几个概念。

1.1熵

熵在物理学跟信息论当中都有定义当然我们看的是深度学习 我们还是运用信息论中的概念。我们先引入信息量

1.1.1信息量

举个例子比如说让你再做一遍你小学二年级都会的十以内的加减法,你就会说都会了写了没用,这种情况就是信息量很低。还有一种情况比如说马云今天吃了个苹果是山东烟台产的红富士,这个消息你不知道但是知道了好像对于你并没有多大的帮助这种情况也算是信息量很低。所以看一个信息信息量到底大不大不是看你知道不知道还要看给你带来多少确定性。比如说羽毛球男单比赛
在这里插入图片描述
现在有八支球队进行比赛,现在中国人夺冠概率是八分之一。过两天比赛结果出来发现中国人夺冠了。那么概率之前为八分之一不确定的事情到现在百分之一百确定了 那这个事情信息量很高。如果说中国队进了决赛,那这件事概率由八分之一到二分之一 ,这件事也有信息量但没有夺冠的信息量高。因为这件事只是从八分之一到二分之一不是到百分之百,所以不同的信息含有的信息量是不一样的。那么怎么去求信息量呢我们定义一下:
f(x): = (信息量)
f(中国队赢得比赛)=f(中国队进决赛)+f(中国队赢得比赛)
中国队赢得比赛信息量等于中国队进决赛的信息量加上中国队赢得比赛得信息量相加。
在这里插入图片描述
我们可以得出f(1/8)=f(1/4)+f(1/2)
那么我们应该怎么写才能自洽 这里我们可以知道1/8,1/4,1/2,都是概率。
p(中国队夺冠)=p(中国队进决赛)p(中国队赢得决赛)
所以这几个式子完全满足才能自洽。得出
f(x1
x2)=f(x1)+f(x2)
那么相乘怎么得出相加呢,所以这个f(x): = (信息量)必须有一个log
在这里插入图片描述
那为什么是log 因为就是定义 只要满足体系自洽就行,作为定义本身就是赋予含义。
所以这个式子有两个地方不清楚一个是系数另外一个是以几为底。
我们可以想一下x自变量越小 这件事信息量就越大 这是一个相反的关系,所以前面系数可以赋值为-1。
那么log以几为底合适呢其实到这里自洽已经很满足了,以几为底都是比较随意的,这里可以以2为底也可以以e为底。这里就以2为底得出
在这里插入图片描述
f(1/8)=f(1/4)+f(1/2)
我们可以算出中国队夺冠信息量为3

比如说有两场比赛 日本队跟韩国队比赛获胜概率都是1/2
在这里插入图片描述
中国队跟韩国队获胜的概率分别是99/100和1/100
在这里插入图片描述

那么可以得出日本队信息量为
在这里插入图片描述
中国队信息量为
在这里插入图片描述
韩国队信息量为
在这里插入图片描述
仔细想一下在这里信息量是不能直接相加的这里是各个球队赢球的话信息量是这么多所以前面要乘以概率得出各个球队队系统贡献量在这里插入图片描述

观察上面公式子可以得出信息量乘以占比再相加 ,就是相当于求期望然后我们可以对熵进行定义。假如说一个概率系统p
在这里插入图片描述
我们·可以求这个概率系统的熵 熵就是定义成对这个系统求期望
在这里插入图片描述

这个就是熵的定义,通过熵的定义我们可以看出这是对整体系统的衡量衡量的结果也能反映出模型的不确定程度。

1.2相对熵,kl散度

通过上面我们知道可以通过计算熵的大小来衡量不同模型混乱程度的区别 但是人脑模型的熵不太好计算那怎么办?我们引入相对熵的概念,也叫kl散度。KL散度 = 交叉熵 - 信息熵

在这里插入图片描述
这里两个不同系统p跟q,比较两个系统差异性
下面就是kl散度 kl散度越小证明越接近 , p在q前代表以p为基准去考虑p跟q相差多少
在这里插入图片描述

这个是q系统的信息量减去p系统的信息量的差值求整体期望

在这里插入图片描述

最后化简 我们可以发现后面这个式子就是系统p的熵,在前面我们把p系统当成基准所以p的熵是恒定的
所以我们看q是不是跟p的差异比较小是要看前面部分,公式前面部分就叫交叉熵。
在这里插入图片描述
在这里插入图片描述
我们可以用H(p,q)来表示交叉熵函数
前面我们说kl散度越趋近于零代表模型越接近 那么我们可以发现后面p的熵肯定大于零,交叉熵的值越小kl散度越大,交叉熵的值越大kl的散度也越大,这样就给我们判断带来难题。我们希望交叉熵只占一边,这样用它做损失函数会简单很多。通过吉布斯不等式我们可以看出kl散度绝对是大于零的。
在这里插入图片描述
当q 跟p相等的时候等于零,不等的时候大于零。所以这个公式前面一定大于后面也就是说交叉熵函数值越小两个模型越接近。
剩下的就是我们要把交叉熵应用到神经网络里面

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里面xi 有两种情况一种是猫一种不是猫,yi 则表示有多像猫有很多情况。
交叉熵函数的n就定义为两个不同系统当中变量更多的那一个。
在这里插入图片描述

把m换成n,n就是训练用的图片个数,xi就是训练用的图片打的标签是猫或者不是猫。yi代表的就是有多像猫所以xi要跟yi对应起来当xi等于0的时候,yi就是有多像猫。当xi等于0的时候,yi代表有多不像猫。

2 交叉熵函数的应用分析

2.1 交叉熵函数单分类问题应用

被分类物体只能归属于唯一一个类别;
该物体的所有类别预测概率之和为1。
二分类问题就是比如说今天小丁打王者农药与不打王者农药两种选择那么公式简化为
*loss=–[y*log 2^a+(1- y)log2^(1-a)]

打农药标签值为1,不打则为0.根据小丁以往的表现今天打农药的概率为0.7,然后事实证明今天她打农药了那么真实值为1,
那么通过计算loss值为loss= -[1*log 2^0.7+(1- 1)*log2^(1-0.7)]**=-log 2^0.7

序号事件概率p
A小丁打王者0.7
B小丁不打王者0.3

对应一个batch的为 在这里插入图片描述

2.2交叉熵在多分类问题中的使用

多分类任务中,被分类对象可以拥有多个标签,例如图二的标签为狗、猫。此时每个类别之间相互独立。
这里的多类别是指,每一张图像样本可以有多个类别,比如同时包含一只猫和一只狗,和单分类问题的标签不同,多分类的标签是n-hot。

标签110
概率0.10.70.8

值得注意的是,这里的Pred不再是通过softmax计算的了,这里采用的是sigmoid。将每一个节点的输出归一化到[0,1]之间。所有Pred值的和也不再为1。换句话说,就是每一个Label都是独立分布的,相互之间没有影响。所以交叉熵在这里是单独对每一个节点进行计算,每一个节点只有两种可能值,所以是一个二项分布。前面说过对于二项分布这种特殊的分布,熵的计算可以进行简化。同样的,交叉熵的计算也可以简化,即
在这里插入图片描述
loss猪=-1log 2^0.1
loss猫=-1
log2^0.7
loss狗=-1*log2^0.2
loss=loss猫+loss狗+loss猪
所以每一个batch的loss就是
在这里插入图片描述
这里log是以2为底(问题不大)
式中m为当前batch中的样本量,n为类别数。
单分类时,每张图片的损失是一个交叉熵,交叉熵针对的是所有类别(所有类别概率和是1)。 多分类时,每张图片的损失是N个交叉熵之和(N为类别数),交叉熵针对的是单个类别(单个类别概率和是1)。

2.3学习过程与优缺点

交叉熵损失函数经常用于分类问题中,特别是在神经网络做分类问题时,也经常使用交叉熵作为损失函数,此外,由于交叉熵涉及到计算每个类别的概率,所以交叉熵几乎每次都和sigmoid(或softmax)函数一起出现。

我们用神经网络最后一层输出的情况,来看一眼整个模型预测、获得损失和学习的流程:

神经网络最后一层得到每个类别的得分scores(也叫logits);
该得分经过sigmoid(或softmax)函数获得概率输出;
模型预测的类别概率输出与真实类别的one hot形式进行交叉熵损失函数的计算。
学习任务分为二分类和多分类情况,我们分别讨论这两种情况的学习过程。

2.3.1二分类情况

在这里插入图片描述
如上图所示,求导过程可分成三个子过程,即拆成三项偏导的乘积:在这里插入图片描述
计算第一项:

pi 表示样本i预测为正类的概率

yi为符号函数,i样本为正类时取1 ,否则取0 ;

在这里插入图片描述
计算第二项:
在这里插入图片描述
计算第三项:
在这里插入图片描述

一般来说,scores是输入的线性函数作用的结果,所以有:
在这里插入图片描述
计算结果:
在这里插入图片描述

2.3.2优缺点

2.3.1.2优点

在用梯度下降法做参数更新的时候,模型学习的速度取决于两个值:一、学习率;二、偏导值。其中,学习率是我们需要设置的超参数,所以我们重点关注偏导值。从上面的式子中,我们发现,偏导值的大小取决于在这里插入图片描述
,我们重点关注后者,后者的大小值反映了我们模型的错误程度,该值越大,说明模型效果越差,但是该值越大同时也会使得偏导值越大,从而模型学习速度更快。所以,使用逻辑函数得到概率,并结合交叉熵当损失函数时,在模型效果差的时候学习速度比较快,在模型效果好的时候学习速度变慢。

2.3.1.3缺点

Deng [4]在2019年提出了ArcFace Loss,并在论文里说了Softmax Loss的两个缺点:1、随着分类数目的增大,分类层的线性变化矩阵参数也随着增大;2、对于封闭集分类问题,学习到的特征是可分离的,但对于开放集人脸识别问题,所学特征却没有足够的区分性。对于人脸识别问题,首先人脸数目(对应分类数目)是很多的,而且会不断有新的人脸进来,不是一个封闭集分类问题。

另外,sigmoid(softmax)+cross-entropy loss 擅长于学习类间的信息,因为它采用了类间竞争机制,它只关心对于正确标签预测概率的准确性,忽略了其他非正确标签的差异,导致学习到的特征比较散。基于这个问题的优化有很多,比如对softmax进行改进,如L-Softmax、SM-Softmax、AM-Softmax等。

https://www.bilibili.com/video/BV15V411W7VB?from=search&seid=776334875013814966&spm_id_from=333.337.0.0
https://blog.csdn.net/tsyccnh/article/details/79163834
https://zhuanlan.zhihu.com/p/95386061

总结

以上就是今天要讲的内容,本文仅仅简单介绍了熵,信息量,相对熵的概念,以及应用分析希望大家多多交流共同学习!!!


http://chatgpt.dhexx.cn/article/kVf2hXZe.shtml

相关文章

交叉熵损失函数原理详解

交叉熵损失函数原理详解 之前在代码中经常看见交叉熵损失函数(CrossEntropy Loss),只知道它是分类问题中经常使用的一种损失函数,对于其内部的原理总是模模糊糊,而且一般使用交叉熵作为损失函数时,在模型的输出层总会接一个softm…

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

一篇弄懂交叉熵损失函数 一、定义二、交叉熵损失函数:知识准备:1、信息熵:将熵引入到信息论中,命名为“信息熵”2、 KL散度(相对熵): 交叉熵:结论: Softmax公式Sigmoid常…

交叉熵损失函数详解

我们知道,在二分类问题模型:例如逻辑回归「Logistic Regression」、神经网络「Neural Network」等,真实样本的标签为 [0,1],分别表示负类和正类。模型的最后通常会经过一个 Sigmoid 函数,输出一个概率值&am…

交叉熵损失函数(CrossEntropy Loss)(原理详解)

监督学习主要分为两类: 分类:目标变量是离散的,如判断一个西瓜是好瓜还是坏瓜,那么目标变量只能是1(好瓜),0(坏瓜)回归:目标变量是连续的,如预测西瓜的含糖率…

nn.CrossEntropyLoss()交叉熵损失函数

1、nn.CrossEntropyLoss() 在pytorch中nn.CrossEntropyLoss()为交叉熵损失函数,用于解决多分类问题,也可用于解决二分类问题。在使用nn.CrossEntropyLoss()其内部会自动加上Sofrmax层 nn.CrossEntropyLoss()的计算公式如下: 其中&#xff0c…

损失函数——交叉熵损失函数(CrossEntropy Loss)

损失函数——交叉熵损失函数(CrossEntropy Loss) 交叉熵函数为在处理分类问题中常用的一种损失函数,其具体公式为: 1.交叉熵损失函数由来 交叉熵是信息论中的一个重要概念,主要用于度量两个概率分布间的差异性。首先…

损失函数——交叉熵损失(Cross-entropy loss)

交叉熵损失(Cross-entropy loss)是深度学习中常用的一种损失函数,通常用于分类问题。它衡量了模型预测结果与实际结果之间的差距,是优化模型参数的关键指标之一。以下是交叉熵损失的详细介绍。 假设我们有一个分类问题&#xff0…

【Pytorch】交叉熵损失函数 CrossEntropyLoss() 详解

文章目录 一、损失函数 nn.CrossEntropyLoss()二、什么是交叉熵三、Pytorch 中的 CrossEntropyLoss() 函数参考链接 一、损失函数 nn.CrossEntropyLoss() 交叉熵损失函数 nn.CrossEntropyLoss() ,结合了 nn.LogSoftmax() 和 nn.NLLLoss() 两个函数。 它在做分类&a…

一文读懂交叉熵损失函数

进行二分类或多分类问题时,在众多损失函数中交叉熵损失函数较为常用。 下面的内容将以这三个问题来展开 什么是交叉熵损失以图片分类问题为例,理解交叉熵损失函数从0开始实现交叉熵损失函数 1,什么是交叉熵损失 交叉熵是信息论中的一个重…

交叉熵损失函数

目录 一、交叉熵损失函数含义 二、交叉熵损失函数定义为:​ 三、交叉熵损失函数计算案例 一、交叉熵损失函数含义 交叉熵是一个信息论中的概念,它原来是用来估算平均编码长度的。给定两个 概率分布p和q,通过q来表示p的交叉熵为 交叉熵刻画…

交叉熵损失函数(Cross Entropy Loss)

基础不牢,地动山摇,读研到现在有一年多了,发现自己对很多经常打交道的知识并不了解,仅仅是会改一改别人的代码,这使我感到非常焦虑,自此开始我的打基础之路。如果博客中有错误的地方,欢迎大家评…

js遍历数组中的对象并拿到值

拿到一组数组,数组中是对象,想拿到这个对象里面的某个值,可以参考以下例子: 这样就拿到所有n1的值. 想拿到这个对象里面所有对应的值如下: 也可以这样取值: 往数组里面push多个值: js中!!用法 …

js遍历数组以及获取数组对象的key和key的值方法

数组: let arr [{ appendData: { "Expiration Date mm- dd - yyyy(2D)": "03-04-2025" }},{appendData: { "Manufacturer(21P)": "MURATA" }}]arr.forEach((value,i)>{ //数组循环for(var pl in value){ //数组对象遍…

javascript遍历数组的方法总结

一、for循环 var arr[javascript,jquery,html,css,学习,加油,1,2]; for(var i0;i<arr.length;i){console.log(输出值,arr[i]); } 二、for...in 遍历的是key 适合遍历对象 var arr[javascript,jquery,html,css,学习,加油,1,2]; for(var i in arr){ console.log(输出值---…

html函数参数数组遍历,JavaScript foreach遍历数组

JavaScript forEach遍历数组教程 JavaScript forEach详解 定义 forEach() 方法为每个数组元素调用一次函数(回调函数)。 语法 array.forEach(function(currentValue, index, arr), thisValue); 参数 参数 描述 function(currentValue, index, arr) 必须。数组每个元素需要执行的…

js中遍历数组加到新数组_js数组遍历:JavaScript如何遍历数组?

什么是数组的遍历? 操作数组中的每一个数组元素。 使用for循环来遍历数组 因为数组的下标是连续的&#xff0c;数组的下标是从0开始。 我们也可以得到数组的长度。 格式&#xff1a;for(var i0;i 数组变量名[i] } 注意&#xff1a;条件表达式的写法 i i<数组的长度-1 // 数…

html页面遍历数组,javascript如何遍历数组?

作为一个程序员对于数组遍历大家都不是很陌生&#xff0c;在开发中我们也经常要处理数组。这里我们讨论下JavaScript中常用的数组遍历方法。 数组中常用的遍历方法有四种&#xff0c;分别是&#xff1a;for for-in forEach for-of (ES6) 1、第一种for循环var arr [1, 2, 3, 4]…

JavaScript遍历数组,附5个案例

先给大家分享一些JavaScript的相关资料&#xff1a; 认识JavaScript到初体验JavaScript 注释以及输入输出语句JavaScript变量的使用、语法扩展、命名规范JavaScript数据类型简介以及简单的数据类型JavaScript获取变量数据类型JavaScript 运算符&算数运算符JavaScript递增和…

1.9 JavaScript 遍历数组

遍历数组 数组的长度 使用 “数组名.length” 可以访问数组元素的数量&#xff08;数组长度&#xff09; a.length 动态监测数组元素的个数 案例 请将 [“关羽”, “张飞”, “赵云”,“小脆筒”], 将数组里的元素依次打印到控制台 代码实现 <!DOCTYPE html> <html&…

html怎么遍历数组,JavaScript如何遍历数组?遍历数组方法介绍

在往期文章中为大家介绍了 JavaScript 如何定义数组。那么这篇文章中 w3cschool 小编来为大家介绍下 JavaScript 如何遍历数组。 方法一&#xff1a;for 循环遍历数组 var arr[Tom,Jenny,Jan,Marry]; for(var i0;i console.log(arr[i]); } 实现效果&#xff1a; 方法二&#xf…