cnn交叉熵损失公式
时间: 2025-06-30 15:12:09 浏览: 18
### CNN 中交叉熵损失函数的公式及其推导
#### 1. 卷积神经网络 (CNN) 的背景
卷积神经网络 (Convolutional Neural Network, CNN) 是一种专门设计用于处理具有网格状拓扑的数据结构(如图像)的深度学习模型[^2]。它的核心优势在于通过卷积层提取空间特征,并利用池化层减少计算复杂度。
#### 2. 交叉熵损失函数的作用
交叉熵损失函数被广泛应用于分类问题,尤其是在 CNN 输出层采用 softmax 或 sigmoid 激活函数的情况下。该函数衡量了预测分布与真实分布之间的差异程度[^3]。
#### 3. 二分类中的交叉熵损失函数
在二分类问题中,假设输入样本的真实标签为 \( y \in \{0, 1\} \),而模型输出的概率估计为 \( p(y=1|x;\theta) = \hat{y} \),则交叉熵损失函数定义如下:
\[ L(\hat{y}, y) = -[y \log(\hat{y}) + (1-y)\log(1-\hat{y})] \]
其中:
- \( y \): 真实标签;
- \( \hat{y} \): 预测概率;
- \( \log() \): 自然对数。
此公式适用于单个样本的情况,在实际应用中通常会对整个训练集取平均值作为最终的目标函数[^1]。
#### 4. 多分类中的交叉熵损失函数
对于多分类问题,假设共有 \( K \) 类,则交叉熵损失函数可扩展为:
\[ L(\hat{\mathbf{y}}, \mathbf{y}) = -\sum_{k=1}^{K} y_k \log(\hat{y}_k) \]
这里:
- \( \mathbf{y} \): one-hot 编码形式的真实标签向量;
- \( \hat{\mathbf{y}} \): 经过 softmax 函数转换后的预测概率分布向量。
具体来说,\( \hat{y}_k \) 表示第 \( k \) 类别的预测概率,而 \( y_k \) 则是一个指示变量,当样本属于第 \( k \) 类时为 1,否则为 0。
#### 5. 公式的推导过程
为了理解为什么选择交叉熵而非其他损失函数(如均方误差 MSE),我们需要分析两者的优劣之处以及它们在反向传播中的行为特性。
##### (1)MSE 的局限性
如果使用 MSE 来评估分类任务的表现,那么目标将是最小化预测概率与真实概率之间的平方差。然而,这种做法存在两个主要缺点:
- **不聚焦于正确类别**:即使某些错误类别的预测概率较高,只要整体偏差较小,MSE 就不会显著惩罚这些误判情况。
- **梯度消失问题**:由于引入了额外的非线性激活函数(如 sigmoid),在反向传播过程中可能会导致梯度过早趋近于零,从而阻碍有效学习。
##### (2)交叉熵的优势
相比之下,交叉熵直接针对正确类别的预测概率进行优化,因此更加契合分类任务的本质需求。更重要的是,在基于 softmax 和 logit 的框架下,交叉熵损失函数关于权重参数的一阶偏导数仅依赖于 (\( \hat{y}-y \)) 这一简单项,这不仅简化了计算流程,还加速了收敛速度。
以下是具体的推导步骤(以二分类为例):
给定一个样本 \( x_i \),其对应的 logits 值记作 \( z_i=\theta^\top x_i+b \),经过 sigmoid 转换得到预测概率 \( \sigma(z)=\frac{1}{1+\exp(-z)} \) 。此时,交叉熵损失可以写成:
\[ L=-[y\ln(\sigma)+(1-y)\ln(1-\sigma)] \]
对其求导得:
\[ \nabla_\theta L=(\sigma-y)x \]
由此可见,更新方向完全取决于当前预测值偏离真值的程度乘以输入特征本身,无需考虑复杂的链式法则带来的累积效应。
```python
import numpy as np
def cross_entropy_loss(y_true, y_pred):
"""
计算二分类交叉熵损失
参数:
y_true: ndarray, shape(n_samples,)
真实标签 {0, 1}
y_pred: ndarray, shape(n_samples,)
预测概率 [0, 1]
返回:
float: 平均交叉熵损失
"""
epsilon = 1e-7 # 数值稳定性调整
y_pred_clipped = np.clip(y_pred, epsilon, 1 - epsilon)
loss = -(y_true * np.log(y_pred_clipped) + (1 - y_true) * np.log(1 - y_pred_clipped))
return np.mean(loss)
# 测试代码
if __name__ == "__main__":
true_labels = np.array([1, 0])
predicted_probs = np.array([0.9, 0.1])
result = cross_entropy_loss(true_labels, predicted_probs)
print(f"Cross Entropy Loss: {result}")
```
---
####
阅读全文
相关推荐


















