交叉熵损失函数原理详解

article/2025/9/10 3:43:52

交叉熵损失函数原理详解

之前在代码中经常看见交叉熵损失函数(CrossEntropy Loss),只知道它是分类问题中经常使用的一种损失函数,对于其内部的原理总是模模糊糊,而且一般使用交叉熵作为损失函数时,在模型的输出层总会接一个softmax函数,至于为什么要怎么做也是不懂,所以专门花了一些时间打算从原理入手,搞懂它,故在此写一篇博客进行总结,以便以后翻阅。


交叉熵简介

交叉熵是信息论中的一个重要概念,主要用于度量两个概率分布间的差异性,要理解交叉熵,需要先了解下面几个概念。


信息量

信息奠基人香农(Shannon)认为“信息是用来消除随机不确定性的东西”,也就是说衡量信息量的大小就是看这个信息消除不确定性的程度。

“太阳从东边升起”,这条信息并没有减少不确定性,因为太阳肯定是从东边升起的,这是一句废话,信息量为0。

”2018年中国队成功进入世界杯“,从直觉上来看,这句话具有很大的信息量。因为中国队进入世界杯的不确定性因素很大,而这句话消除了进入世界杯的不确定性,所以按照定义,这句话的信息量很大。

根据上述可总结如下:信息量的大小与信息发生的概率成反比。概率越大,信息量越小。概率越小,信息量越大。

设某一事件发生的概率为P(x),其信息量表示为:
I ( x ) = − log ⁡ ( P ( x ) ) I\left ( x \right ) = -\log\left ( P\left ( x \right ) \right ) I(x)=log(P(x))
其中 I ( x ) I\left ( x \right ) I(x)表示信息量,这里 log ⁡ \log log表示以e为底的自然对数。


信息熵

信息熵也被称为熵,用来表示所有信息量的期望。

期望是试验中每次可能结果的概率乘以其结果的总和。

所以信息量的熵可表示为:(这里的 X X X是一个离散型随机变量)
H ( X ) = − ∑ i = 1 n P ( x i ) log ⁡ ( P ( x i ) ) ) ( X = x 1 , x 2 , x 3 . . . , x n ) H\left ( \mathbf{X} \right ) = -\sum \limits_{i=1}^n P(x_{i}) \log \left ( P \left ( x_{i} \right ))) \qquad ( \mathbf{X}= x_{1},x_{2},x_{3}...,x_{n} \right) H(X)=i=1nP(xi)log(P(xi)))(X=x1,x2,x3...,xn)
使用明天的天气概率来计算其信息熵:

序号事件概率P信息量
1明天是晴天0.5 − log ⁡ ( 0.5 ) -\log \left ( 0.5 \right ) log(0.5)
2明天出雨天0.2 − log ⁡ ( 0.2 ) -\log \left ( 0.2 \right ) log(0.2)
3多云0.3 − log ⁡ ( 0.3 ) -\log \left ( 0.3 \right ) log(0.3)

H ( X ) = − ( 0.5 ∗ log ⁡ ( 0.5 ) + 0.2 ∗ log ⁡ ( 0.2 ) + 0.3 ∗ log ⁡ ( 0.3 ) ) H\left ( \mathbf{X} \right ) = -\left ( 0.5 * \log \left ( 0.5 \right ) + 0.2 * \log \left ( 0.2 \right ) + 0.3 * \log \left ( 0.3 \right ) \right) H(X)=(0.5log(0.5)+0.2log(0.2)+0.3log(0.3))

对于0-1分布的问题,由于其结果只用两种情况,是或不是,设某一件事情发生的概率为 P ( x ) P\left ( x \right ) P(x),则另一件事情发生的概率为 1 − P ( x ) 1-P\left ( x \right ) 1P(x),所以对于0-1分布的问题,计算熵的公式可以简化如下:
H ( X ) = − ∑ n = 1 n P ( x i log ⁡ ( P ( x i ) ) ) = − [ P ( x ) log ⁡ ( P ( x ) ) + ( 1 − P ( x ) ) log ⁡ ( 1 − P ( x ) ) ] = − P ( x ) log ⁡ ( P ( x ) ) − ( 1 − P ( x ) ) log ⁡ ( 1 − P ( x ) ) H\left ( \mathbf{X} \right ) = -\sum \limits_{n=1}^n P(x_{i}\log \left ( P \left ( x_{i} \right )) \right) \\ = -\left [ P\left ( x \right) \log \left ( P\left ( x \right ) \right ) + \left ( 1 - P\left ( x \right ) \right) \log \left ( 1-P\left ( x \right ) \right ) \right] \\ = -P\left ( x \right) \log \left ( P\left ( x \right ) \right ) - \left ( 1 - P\left ( x \right ) \right) \log \left ( 1-P\left ( x \right ) \right) H(X)=n=1nP(xilog(P(xi)))=[P(x)log(P(x))+(1P(x))log(1P(x))]=P(x)log(P(x))(1P(x))log(1P(x))


相对熵(KL散度)

如果对于同一个随机变量 X X X有两个单独的概率分布 P ( x ) P\left(x\right) P(x) Q ( x ) Q\left(x\right) Q(x),则我们可以使用KL散度来衡量这两个概率分布之间的差异

下面直接列出公式,再举例子加以说明。
D K L ( p ∣ ∣ q ) = ∑ i = 1 n p ( x i ) log ⁡ ( p ( x i ) q ( x i ) ) D_{KL}\left ( p || q \right) = \sum \limits_{i=1}^n p\left ( x_{i}\right ) \log \left ( \frac{p\left ( x_{i} \right )}{q\left ( x_{i} \right )} \right ) DKL(pq)=i=1np(xi)log(q(xi)p(xi))
在机器学习中,常常使用 P ( x ) P\left(x\right) P(x)来表示样本的真实分布, Q ( x ) Q \left(x\right) Q(x)来表示模型所预测的分布,比如在一个三分类任务中(例如,猫狗马分类器), x 1 , x 2 , x 3 x_{1}, x_{2}, x_{3} x1,x2,x3分别代表猫,狗,马,例如一张猫的图片真实分布 P ( X ) = [ 1 , 0 , 0 ] P\left(X\right) = [1, 0, 0] P(X)=[1,0,0], 预测分布 Q ( X ) = [ 0.7 , 0.2 , 0.1 ] Q\left(X\right) = [0.7, 0.2, 0.1] Q(X)=[0.7,0.2,0.1],计算KL散度:
D K L ( p ∣ ∣ q ) = ∑ i = 1 n p ( x i ) log ⁡ ( p ( x i ) q ( x i ) ) = p ( x 1 ) log ⁡ ( p ( x 1 ) q ( x 1 ) ) + p ( x 2 ) log ⁡ ( p ( x 2 ) q ( x 2 ) ) + p ( x 3 ) log ⁡ ( p ( x 3 ) q ( x 3 ) ) = 1 ∗ log ⁡ ( 1 0.7 ) = 0.36 D_{KL}\left ( p || q \right) = \sum \limits_{i=1}^n p\left ( x_{i}\right ) \log \left ( \frac{p\left ( x_{i} \right )}{q\left ( x_{i} \right )} \right ) \\ = p\left ( x_{1}\right ) \log \left ( \frac{p\left ( x_{1} \right )}{q\left ( x_{1} \right )} \right ) + p\left ( x_{2}\right ) \log \left ( \frac{p\left ( x_{2} \right )}{q\left ( x_{2} \right )} \right ) + p\left ( x_{3}\right ) \log \left ( \frac{p\left ( x_{3} \right )}{q\left ( x_{3} \right )} \right ) \\ = 1 * \log \left ( \frac{1}{0.7} \right ) = 0.36 DKL(pq)=i=1np(xi)log(q(xi)p(xi))=p(x1)log(q(x1)p(x1))+p(x2)log(q(x2)p(x2))+p(x3)log(q(x3)p(x3))=1log(0.71)=0.36
KL散度越小,表示 P ( x ) P\left(x\right) P(x) Q ( x ) Q\left(x\right) Q(x)的分布更加接近,可以通过反复训练 Q ( x ) Q\left(x \right) Q(x)来使 Q ( x ) Q\left(x \right) Q(x)的分布逼近 P ( x ) P\left(x \right) P(x)


交叉熵

首先将KL散度公式拆开:
D K L ( p ∣ ∣ q ) = ∑ i = 1 n p ( x i ) log ⁡ ( p ( x i ) q ( x i ) ) = ∑ i = 1 n p ( x i ) l o g ( p ( x i ) ) − ∑ i = 1 n p ( x i ) l o g ( q ( x i ) ) = − H ( p ( x ) ) + [ − ∑ i = 1 n p ( x i ) l o g ( q ( x i ) ) ] D_{KL}\left ( p || q \right) = \sum \limits_{i=1}^n p\left ( x_{i}\right ) \log \left ( \frac{p\left ( x_{i} \right )}{q\left ( x_{i} \right )} \right ) \\ = \sum \limits_{i=1}^n p \left (x_{i}\right) log \left(p \left (x_{i}\right)\right) - \sum \limits_{i=1}^n p \left (x_{i}\right) log \left(q \left (x_{i}\right)\right) \\ = -H \left (p \left(x \right) \right) + \left [-\sum \limits_{i=1}^n p \left (x_{i}\right) log \left(q \left (x_{i}\right)\right) \right] DKL(pq)=i=1np(xi)log(q(xi)p(xi))=i=1np(xi)log(p(xi))i=1np(xi)log(q(xi))=H(p(x))+[i=1np(xi)log(q(xi))]
前者 H ( p ( x ) ) H \left (p \left (x \right)\right) H(p(x))表示信息熵,后者即为交叉熵,KL散度 = 交叉熵 - 信息熵

交叉熵公式表示为:
H ( p , q ) = − ∑ i = 1 n p ( x i ) l o g ( q ( x i ) ) H \left (p, q\right) = -\sum \limits_{i=1}^n p \left (x_{i}\right) log \left(q \left (x_{i}\right)\right) H(p,q)=i=1np(xi)log(q(xi))
在机器学习训练网络时,输入数据与标签常常已经确定,那么真实概率分布 P ( x ) P\left(x \right) P(x)也就确定下来了,所以信息熵在这里就是一个常量。由于KL散度的值表示真实概率分布 P ( x ) P\left(x\right) P(x)与预测概率分布 Q ( x ) Q \left(x\right) Q(x)之间的差异,值越小表示预测的结果越好,所以需要最小化KL散度,而交叉熵等于KL散度加上一个常量(信息熵),且公式相比KL散度更加容易计算,所以在机器学习中常常使用交叉熵损失函数来计算loss就行了。


交叉熵在单分类问题中的应用

在线性回归问题中,常常使用MSE(Mean Squared Error)作为loss函数,而在分类问题中常常使用交叉熵作为loss函数。

下面通过一个例子来说明如何计算交叉熵损失值。

假设我们输入一张狗的图片,标签与预测值如下:

*
Label010
Pred0.20.70.1

那么loss
l o s s = − ( 0 ∗ log ⁡ ( 0.2 ) + 1 ∗ log ⁡ ( 0.7 ) + 0 ∗ log ⁡ ( 0.1 ) ) = 0.36 loss = -\left ( 0 * \log \left ( 0.2 \right ) + 1 * \log \left ( 0.7 \right ) + 0 * \log \left ( 0.1 \right )\right) = 0.36 loss=(0log(0.2)+1log(0.7)+0log(0.1))=0.36
一个batch的loss为
l o s s = − 1 m ∑ i = 1 m ∑ j = 1 n p ( x i j ) l o g ( q ( x i j ) ) loss = -\frac{1}{m}\sum \limits_{i=1}^m \sum \limits_{j=1}^n p \left (x_{ij}\right) log \left(q \left (x_{ij}\right)\right) loss=m1i=1mj=1np(xij)log(q(xij))
其中m表示样本个数。


总结:

  • 交叉熵能够衡量同一个随机变量中的两个不同概率分布的差异程度,在机器学习中就表示为真实概率分布与预测概率分布之间的差异。交叉熵的值越小,模型预测效果就越好。

  • 交叉熵在分类问题中常常与softmax是标配,softmax将输出的结果进行处理,使其多个分类的预测值和为1,再通过交叉熵来计算损失。


参考:

https://blog.csdn.net/tsyccnh/article/details/79163834


THE END


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

相关文章

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

一篇弄懂交叉熵损失函数 一、定义二、交叉熵损失函数:知识准备: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…

小程序 js 遍历数组

js 方式一&#xff1a; for (var index in res.data) { title : res.data[index].title } res.data&#xff1a;数组 index&#xff1a;下标 title&#xff1a;数组中的一个字段 方式二&#xff1a; for (var i 0; i < datas.length; i) { console.log(i); if( i > 1) b…