图示Softmax及交叉熵损失函数

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

Softmax函数

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

SoftMax

为了更加清晰的看清整个过程,我将其制作成gif,如下图所示:

Softmax的工作过程

交叉熵:

假设pq是关于样本集的两个分布,其中p是样本集的真实分布,q是样本集的估计分布,那么按照真是分布p来衡量识别一个样本所需要编码长度的期望(即,平均编码长度):

H(p)=\sum_{i}^{n} p_{i}log\frac{1}{p_{i}}=\sum_{i}^{n}- p_{i}logp_{i}

如果用估计分布q来表示真实分布p的平均编码长度,应为:

H(p,q)=\sum_{i=1}^{n}p_{i}log\frac{1}{q_{i}}=\sum_{i=1}^{n}-p_{i}logq_{i}

这是因为用q来编码的样本来自于真是分布p,所以期望值H(p,q)中的概率是p_{i}。而H(p,q)就是交叉熵。

注:不了解什么是编码的请看这里:如何理解用信息熵来表示最短的平均编码长度。

在神经网络后面添加Softmax,真实的标签(或者是类别)就相当于真实的分布,经过Softmax得出的值就是预测的结果,因此可以使用交叉熵函数来作为损失函数。有了交叉熵的概念,我们就可以得出,Softmax的损失函数:

                                                                                   L=\sum- \hat{y}_{i}lny_{i}

其中y_{i}是神经元的输出也可以作为预测结果,\hat{y}_{i}是第i个类别的真实值,\hat{y}_{i}只能取值0\: \: or\: \: 1。在Softmax中我们取以e为底的对数,因为都是e的指数形式,可以方便计算。在反向传播的过程中,如何对交叉熵损失函数求导呢?可以先看下图的示例,显示了如何得到损失函数:

由上图可以看到,损失函数具体形式是什么。为了计算反向传播,我们从最后一层开始,也就是首先要对Softmax的输入z_{i}求导,得:

                                                             \frac{\partial L}{\partial z_{i}}=\frac{\partial L}{\partial y_{j}}\frac{\partial y_{j}}{\partial z_{i}},其中\left\{\begin{matrix} \begin{matrix} y_{j}=\frac{e^{z_{j}}}{\sum_{k}e^{z_{k}}}\\ \\ \, \, \, \, \, \, \, \, \, L=-\sum_{j}\hat{y_{j}}lny_{j}\\ \end{matrix} \end{matrix}\right.

由于每个y_{j}的分母中都有z_{i}的贡献,故我们要考虑每一个输出值。则:

                                                            \frac{\partial L}{\partial y_{j}}=\frac{\partial[ -\sum_{j}\hat{y_{j}}logy_{j}]}{\partial y_{j}}=-\sum_{j}\frac{\hat{y_{j}}}{y_{j}}

对于\frac{\partial y_{j}}{\partial z_{i}},需要分开讨论因为j=ij\neq i时的求导结果不同,故需分开讨论。则

                                    \frac{\partial L}{\partial z_{i}}=\sum_{j}\frac{\partial (-\hat{y}_{j}lny_{j})}{\partial z_{i}} =\sum_{j}\frac{\partial (-\hat{y}_{j}lny_{j})}{\partial y_{j}} \frac{\partial (y_{j})}{\partial z_{i}}=\left\{\begin{matrix} \frac{\partial (-\hat{y}_{i}lny_{i})}{\partial y_{i}} \frac{ \partial (\frac{e^{z_{i}}}{\sum_{k}e^{z_{k}}})}{\partial z_{i}}&j=i \\ & \\ \sum_{j\neq i}\frac{\partial (-\hat{y}_{j}lny_{j})}{\partial y_{j}} \frac{ \partial (\frac{e^{z_{j}}}{\sum_{k}e^{z_{k}}})}{\partial z_{i}}&j\neq i \end{matrix}\right.

  • j=i时,有:

                                                        \large {\color{Magenta} \begin{matrix} {\color{Golden} \frac{\partial y_{j}}{\partial z_{i}}}=\frac{\partial y_{i}}{\partial z_{i}}=\frac{\partial [\frac{e^{z_{i}} }{\sum_{k}e^{z_{k}}}]}{\partial z_{i}}=\frac{e^{z_{i}}\sum_{k}e^{z_{k}}-(e^{z_{i}})^{2} }{ (\sum_{k}e^{z_{k}})^{2} }\\ \\ \: \: \: \: =\frac{e^{z_{i}} }{\sum_{k}e^{z_{k}} }(1-\frac{e^{z_{i}} }{\sum_{k}e^{z_{k}} })=y_{i}(1-y_{i}) \end{matrix}}

  • j\neq i

                                                       {\color{Magenta} {\color{Golden} \frac{\partial y_{j}}{\partial z_{i}}}=\frac{\partial [\frac{e^{z_{j}} }{\sum_{k}e^{z_{k}}}]}{\partial z_{i}}=\frac{0-e^{z_{j}}e^{z_{i}} }{ (\sum_{k}e^{z_{k}})^{2} }=-y_{i}y_{j}}

故,

                                                                       \large \begin{matrix} \, \, \, \, \, \, \, \, \, \, \, \, \, \, \,\, {\color{Red} \frac{\partial L}{\partial z_{i}}}=-\sum_{j}\frac{\hat{y_{j}}}{y_{j}}\frac{\partial y_{j}}{\partial z_{i}}\\ \\ \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: \: =-\frac{\hat{y_{i}}}{y_{i}}y_{i}(1-y_{i})+\sum_{j\neq i}\frac{\hat{y_{j}}}{y_{j}}y_{i}y_{j}\\ \\ \: \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \: \: \: \: \: \: \: \: \: \: \: =y_{i}\hat{y}_{i}-\hat{y}_{i}+\sum_{j\neq i}y_{i}\hat{y}_{j}\\ \\ \: \: \: \: \: \: \: \: \:\: \: \: \: \: \: \: \: \: \: \: \: =-\hat{y}_{i}+\sum_{j}y_{i}\hat{y}_{j}\\ \\ \; \; \; \; \; \; \;\: \: \: \: \: \: \: \: \: \: \: \: \: =-\hat{y}_{i}+y_{i}\sum_{j}\hat{y}_{j}\\ \\ \: \: \: \: \: \: ={\color{Magenta} y_{i}-\hat{y_{i}}} \end{matrix}

注:因为如果给定一个样本\large x那么他对应的真实标签只有一个值为\large 1,其余为0,故,

                                                                               \sum_{j}\hat{y}_{j}=1

Sotfmax的交叉熵损失函数,还有另外的形式:

  •                                                                  L_{i} = - \sum_{j=1}^{k} 1\left\{y_{(i)} = j\right\} \log \frac{e^{z_{j}}}{\sum_{l=1}^k e^{z_{k} }}=-\hat{y}_{i}lny_{i}
  •                                                                 \begin{matrix} L = - \frac{1}{m} \left[ \sum_{i=1}^{m} \sum_{j=1}^{k} 1\left\{y_{(i)} = j\right\} \log \frac{e^{z_{j}}}{\sum_{l=1}^k e^{z_{k} }}\right]\\ \\ \; \; \; \; \; \; \; \; \; \; \; \; =- \frac{1}{m} \left[ \sum_{i=1}^{m} \hat{y}_{i} \log \frac{e^{z_{i}}}{\sum_{l=1}^k e^{z_{k} }}\right] {\color{Magenta} =- \frac{1}{m} \left[ \sum_{i=1}^{m} \hat{y}_{i} \log y_{i}\right]} \end{matrix}

其本质是一样的,因为1\left\{y_{(i)} = j\right\}是示性函数,只有当大括号内的值为真时才取值为1,否则为0,即1\left\{y_{(i)} = j\right\}\Leftrightarrow \hat{y_{i}}


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

相关文章

最全的交叉熵损失函数(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中!!用法 …

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) 必须。数组每个元素需要执行的…