【基础篇】交叉熵损失函数(Cross Entropy Loss)

article/2025/9/9 21:45:07

文章目录

  • 1. 理论知识
  • 2. 代码

1. 理论知识

我们需要关注那些按常理来说不太可能发生的事情。『信息量』就是用来度量事件的不确定性, 事件包含的信息量应与其发生的概率负相关 。假设 X X X是一个离散型随机变量,它的取值集合为 { x 1 , x 2 , . . . , x n } \{x_{1},x_{2},...,x_{n}\} {x1,x2,...,xn},事件 X = x i X=x_{i} X=xi的信息量为:
I ( x i ) = − l o g P ( X = x i ) I(x_{i})=-logP(X=x_{i}) I(xi)=logP(X=xi)

其中, P P P为变量 X X X取值为 x i x_{i} xi的概率,这个概率值应该落在0到1之间,则事件 X = x i X=x_{i} X=xi的信息量的曲线图如下。当概率值 P P P趋于0时,信息量趋于无穷大,概率值 P P P等于1时,信息量为0。

在这里插入图片描述


进一步地,定义了『』来表示变量 X X X整个概率分布的平均信息量 。随机变量 X X X的熵的计算公式:

H ( X ) = − ∑ i = 1 n P ( X = x i ) l o g P ( X = x i ) H(X)=-\sum_{i=1}^{n}{P(X=x_{i})logP(X=x_{i})} H(X)=i=1nP(X=xi)logP(X=xi)

《深度学习花书》中有一句结论:那些接近确定性的分布(输出几乎可以确定)具有较低的熵,那些接近均匀分布的概率分布具有较高的熵。即, 随机变量 X X X的取值情况越随机,那么它的熵越高


用『相对熵(或叫KL散度)』来计算随机变量 X X X真实概率分布 P ( X ) P(X) P(X)和与其近似的分布 Q ( X ) Q(X) Q(X)两个的 差异

D K L ( P ∣ ∣ Q ) = − ∑ i = 1 n P ( x i ) l o g 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 ) ) D_{KL}(P||Q)=-\sum_{i=1}^{n}P(x_{i})logQ(x_{i})-(-\sum_{i=1}^{n}P(x_{i})logP(x_{i}))=-\sum_{i=1}^{n}P(x_{i})logQ(x_{i})-H(P(X)) DKL(P∣∣Q)=i=1nP(xi)logQ(xi)(i=1nP(xi)logP(xi))=i=1nP(xi)logQ(xi)H(P(X))


交叉熵 H ( P , Q ) H(P,Q) H(P,Q)为:

H ( P , Q ) = H ( P ) + D K L ( P ∣ ∣ Q ) = − ∑ i = 1 n P ( x i ) l o g Q ( x i ) H(P,Q)=H(P)+D_{KL}(P||Q)=-\sum_{i=1}^{n}P(x_{i})logQ(x_{i}) H(P,Q)=H(P)+DKL(P∣∣Q)=i=1nP(xi)logQ(xi)

由于 P ( X ) P(X) P(X)是真实概率分布,所以 H ( P ( X ) ) H(P(X)) H(P(X))就是随机变量 X X X的熵,那么 KL散度=交叉熵-熵 ,熵是已知的,求取 KL散度就等价于求交叉熵 ,所以交叉熵才会被用做神经网络训练中的损失函数。

2. 代码

Pytorch中使用交叉熵损失函数,直接调用nn.CrossEntropyLoss函数,使用一个例子来说明该函数的计算流程:

import torch.nn as nn
import torchloss = nn.CrossEntropyLoss()
input = torch.randn(2, 3, requires_grad=True)
target = torch.empty(2, dtype=torch.long).random_(3)
output = loss(input, target)# input
>>>tensor([[-0.0985,  1.6204, -0.5298],[-1.2966,  2.0098, -0.3128]])
# target
>>>tensor([1, 0])
# output
>>>tensor(1.8459)

用通俗点的方法来说明下计算流程

input为模型输出的概率分布,nn.CrossEntropyLoss函数内嵌了nn.softmax

  • 第一步:input先进行softmax操作
softmax = nn.Softmax()
input_softmax = softmax(input)
# input_softmax
>>>tensor([[0.1383, 0.7718, 0.0899],[0.0323, 0.8813, 0.0864]])
  • 第二步:以概率分布的形式表示target
# target
>>>tensor([[0, 1, 0],[1, 0, 0]])

该例子中minibatch=2,可以看作包含了两个随机变量 X 1 X_{1} X1 X 2 X_{2} X2,那么input_softmax为这两个变量的预测分布[ Q 1 Q_{1} Q1, Q 2 Q_{2} Q2],target为两个变量的真实分布[ P 1 P_{1} P1, P 2 P_{2} P2]

  • 第三步:分别计算 X 1 X_{1} X1 X 2 X_{2} X2的交叉熵

H ( P 1 , Q 1 ) = − ∑ i = 1 3 P 1 ( x i ) l o g Q 1 ( x i ) = − ( 0 ∗ l o g ( 0.1383 ) + 1 ∗ l o g ( 0.7718 ) + 0 ∗ l o g ( 0.0899 ) ) = 0.2591 H(P_{1}, Q_{1})=-\sum_{i=1}^{3}P_{1}(x_{i})logQ_{1}(x_{i})=-(0 * log(0.1383) + 1 * log(0.7718) + 0 * log(0.0899)) = 0.2591 H(P1,Q1)=i=13P1(xi)logQ1(xi)=(0log(0.1383)+1log(0.7718)+0log(0.0899))=0.2591
H ( P 2 , Q 2 ) = − ∑ i = 1 3 P 2 ( x i ) l o g Q 2 ( x i ) = − ( 1 ∗ l o g ( 0.0323 ) + 0 ∗ l o g ( 0.8813 ) + 0 ∗ l o g ( 0.0864 ) ) = 3.4328 H(P_{2}, Q_{2})=-\sum_{i=1}^{3}P_{2}(x_{i})logQ_{2}(x_{i})=-(1 * log(0.0323) + 0 * log(0.8813) + 0 * log(0.0864)) = 3.4328 H(P2,Q2)=i=13P2(xi)logQ2(xi)=(1log(0.0323)+0log(0.8813)+0log(0.0864))=3.4328

  • 第四步:计算这一个批次的损失
CLASS torch.nn.CrossEntropyLoss(weight=None, size_average=None, ignore_index=- 100, reduce=None,   			 							reduction='mean', label_smoothing=0.0)

其中reduction参数有两个选项,'mean''sum'(默认'mean'),也就是一个批次的损失是输出所有样本的交叉熵的平均值还是总和值。上面的例子是用的默认值,所以最终的输出的
o u t p u t = H ( P 1 , Q 1 ) + H ( P 2 , Q 2 ) 2 = 0.2591 + 3.4328 2 = 1.8459 output = \frac{H(P_{1}, Q_{1})+H(P_{2}, Q_{2})}{2}=\frac{0.2591+3.4328}{2}=1.8459 output=2H(P1,Q1)+H(P2,Q2)=20.2591+3.4328=1.8459


【Tips】:torch1.10.0版本开始支持两种target形式,除了上面Example of target with class indices,还有Example of target with class probabilities

input = torch.randn(2, 3, requires_grad=True)
target = torch.randn(2, 3).softmax(dim=1)
output = loss(input, target)

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


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

相关文章

损失函数-交叉熵的推导和二分类交叉熵

交叉熵 期望: 期望就是所有随机变量的均值。 E(X)X1*P(X1)X2*P(X2)X3*P(X3) 熵: 熵表示所有信息量的期望。 信息量如何计算呢? 概率值取Log,然后加个负…

深度学习中的损失函数(交叉熵)

0、前景介绍 对于线性回归模型适用于输出为连续值的情景,但是在模型输出是一个像图像类别这样的离散值时。对于这样离散值的预测问题,通常使用一些例如sigmoid/softmax的分类模型。 1. 图像分类任务 假设下面两个模型都是通过softmax的方式得到对于每…

图示Softmax及交叉熵损失函数

Softmax函数 Softmax是将神经网络得到的多个值,进行归一化处理,使得到的值在之间,让结果变得可解释。即可以将结果看作是概率,某个类别概率越大,将样本归为该类别的可能性也就越高。Softmax就如下图(借鉴李…

最全的交叉熵损失函数(Pytorch)

损失函数 引言BCELossBCEWithLogitsLossNLLLossCrossEntropyLoss总结参考 引言 这里主要讲述pytorch中的几种交叉熵损失类,熵是用来描述一个系统的混乱程度,通过交叉熵我们就能够确定预测数据与真是数据之间的相近程度。交叉熵越小,表示数据越接近真实样…

简单的交叉熵损失函数,你真的懂了吗?

个人网站:红色石头的机器学习之路 CSDN博客:红色石头的专栏 知乎:红色石头 微博:RedstoneWill的微博 GitHub:RedstoneWill的GitHub 微信公众号:AI有道(ID:redstonewill&#xf…

交叉熵损失概念

交叉熵是信息论中的一个概念,要想了解交叉熵的本质,需要先从最基本的概念讲起。 1. 信息量 首先是信息量。假设我们听到了两件事,分别如下: 事件A:巴西队进入了2018世界杯决赛圈。 事件B:中国队进入了2…

softmax交叉熵损失函数深入理解(二)

0、前言 前期博文提到经过两步smooth化之后,我们将一个难以收敛的函数逐步改造成了softmax交叉熵损失函数,解决了原始的目标函数难以优化的问题。Softmax 交叉熵损失函数是目前最常用的分类损失函数,本博文继续学习Softmax 交叉熵损失函数的改…

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

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

交叉熵损失函数原理详解

交叉熵损失函数原理详解 之前在代码中经常看见交叉熵损失函数(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中!!用法 …