交叉熵(cross-entropy)损失函数求导过程推导

本文深入解析了交叉熵损失函数及softmax函数的数学原理,详细推导了交叉熵损失函数的求导过程,旨在帮助读者理解深度学习中关键的数学基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  今天,师兄突然问我关于交叉熵求导的问题,分分钟被难住了,感慨自己读研一年多了,连这种基本问题都不懂。在师兄的帮助下,从头到尾推导了一遍, 决定写篇博客记录一下自己的收获。

1. 什么是交叉熵?

1.1 熵

  首先,我们要知道什么是熵(entropy), 熵的物理意义是对体系混乱程度的一种度量方式。后来,香农将熵的概念引入到信息论中,提出了所谓的“信息熵”概念,从概率论的角度来看,就是说某个事件发生的不确定性越大,信息熵就越大。下文中提到的熵都是指“信息熵”。信息熵的公式如下:
在这里插入图片描述
  公式中的 p ( x i ) p(x_i) p(xi)表示的是事件P发生第i类的概率。

1.2 KL散度

  在说交叉熵之前,还要提一下KL散度(Kullback-Leibler divergence),大家平时说的KL散度(其实也是一种熵,我们称之为相对熵。KL散度可以用来度量两个分布的相似度,比如在机器学习中,我们就可以用KL散度来衡量样本真实分布与预测分布之间的差异。KL散度的公式如下:
在这里插入图片描述

1.3 交叉熵

  我们对KL散度进行如下变换:
在这里插入图片描述
  因为我们知道在机器学习问题中,样本的真实分布是已知的,所以真实分布的熵 H H H是固定不变的, D K L D_{KL} DKL的大小只与后面的部分有关。于是,我们把后面的那一部分称为交叉熵,在优化过程中,只要优化这一部分就行了。交叉熵的公式如下:
在这里插入图片描述

2. 关于softmax函数

  在深度学习中,softmax函数是分类任务中常用的激活函数。softmax的公式如下:
在这里插入图片描述
  其中, y j y_j yj表示第j个神经元的输出。有兴趣的同学,推荐看一下link,里面有一副图十分形象。

3. 推导过程

  在开始正式的推导之前,我再讲一下容易被大家遗忘的基础知识。
  商函数的求导法则:在这里插入图片描述
  好了,介绍完所有相关的基础知识,我们接下来就可以开始正式推导的工作了。

3.1 关于softmax的求导

  首先,我们对softmax进行求导:
在这里插入图片描述

3.2 关于cross-entropy的求导

  为了保证符号上的统一,我们在这定义神经网络优化过程中的交叉熵形式为
在这里插入图片描述
  其中 y i y_i yi表示预测得到的的样本分布, y i ′ y^{'}_i yi表示真实的样本分布。
在这里插入图片描述
  在这里我们令 Y = ( y 1 , y 2 , . . . , y n ) Y=(y_1,y_2,...,y_n) Y=(y1,y2,...,yn),根据链式法则可做以下推导:
在这里插入图片描述
  然后,我们将对softmax的求导结果代入到上式中,可得
在这里插入图片描述
  对交叉熵CE对 y i y_i yi求导可得
在这里插入图片描述
  带入到 ( 1 ) (1) (1)式中,得到
在这里插入图片描述
  ok,到这里我们的工作就算是正式收工了。其实在写的时候,很多东西我自己也不是特别明白,但是一边写一边想,就感觉自己的思路越来越清晰了。推导过程中还是有很多的细节我没有一一提到,相信大家动手推导一遍就能都能明白。欢迎大家留言交流。HHHH~
在这里插入图片描述

### 交叉熵损失函数的具体计算公式 交叉熵损失函数Cross-Entropy Loss)是一种广泛应用于分类问题中的损失函数,尤其在神经网络模型中用于衡量预测概率分布与真实标签之间的差异。其核心思想来源于信息论中的交叉熵概念。 对于二分类问题,假设样本的真实标签为 \( y \in \{0, 1\} \),而模型的预测值为 \( p(y=1|x) = \hat{y} \),则单个样本的交叉熵损失可以表示为: \[ L_{CE} = -[y \log(\hat{y}) + (1-y)\log(1-\hat{y})] \tag{1}[^1] \] 其中: - \( y \) 是真实的类别标签; - \( \hat{y} \) 是模型预测的概率值; - \( \log() \) 表示自然对数。 当扩展到多分类问题时,设共有 \( K \) 类,第 \( i \) 个样本属于类别的真实标签向量为 \( y_i \) (one-hot 编码形式),模型对该样本的预测概率分布为 \( \hat{y}_i \),那么该样本的交叉熵损失可定义为: \[ L_{CE}(y_i, \hat{y}_i) = -\sum_{k=1}^{K} y_{ik} \log (\hat{y}_{ik}) \tag{2} \] 这里: - \( y_{ik} \) 是 one-hot 向量中的元素,取值为 0 或 1; - \( \hat{y}_{ik} \) 是模型预测的第 \( k \) 类的概率。 #### 推导过程 交叉熵损失函数可以从最大似然估计的角度推导而来。假设有训练数据集 \( D = \{(x_1, y_1), (x_2, y_2), ..., (x_n, y_n)\} \),目标是最小化负对数似然(Negative Log-Likelihood, NLL)。对于给定参数 \( \theta \),模型输出的概率分布记作 \( P_\theta(y | x) \),最大化似然函数等价于最小化如下表达式: \[ J(\theta) = -\frac{1}{N}\sum_{i=1}^N \log(P_\theta(y_i | x_i)) \tag{3}[^2] \] 如果采用 softmax 函数作为最后一层激活函数,则有: \[ P_\theta(y=k | x) = \frac{\exp(z_k)}{\sum_{j=1}^K \exp(z_j)} \tag{4}[^3] \] 其中 \( z_k \) 是未经过 softmax 转换前的原始得分(logits)。将上述公式代入并展开即可得到最终的交叉熵损失形式。 ```python import torch import torch.nn.functional as F # 假设 logits 和 labels logits = torch.tensor([[2.0, 1.0, 0.1], [0.5, 2.5, 0.3]]) labels = torch.tensor([0, 1]) # 计算交叉熵损失 loss = F.cross_entropy(logits, labels) print(loss.item()) # 输出结果应接近理论值 ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值