深度学习 - softmax交叉熵损失计算

示例代码

import torch
from torch import nn

# 多分类交叉熵损失,使用nn.CrossEntropyLoss()实现。nn.CrossEntropyLoss()=softmax + 损失计算
def test1():
    # 设置真实值: 可以是热编码后的结果也可以不进行热编码
    # y_true = torch.tensor([[0, 1, 0], [0, 0, 1]], dtype=torch.float32)
    # 注意的类型必须是64位整型数据
    y_true = torch.tensor([1, 2], dtype=torch.int64)
    y_pred = torch.tensor([[0.2, 0.6, 0.2], [0.1, 0.8, 0.1]], dtype=torch.float32)
    # 实例化交叉熵损失
    loss = nn.CrossEntropyLoss()
    # 计算损失结果
    my_loss = loss(y_pred, y_true).numpy()
    print('loss:', my_loss)

输入数据

y_true = torch.tensor([1, 2], dtype=torch.int64)
y_pred = torch.tensor([[0.2, 0.6, 0.2], [0.1, 0.8, 0.1]], dtype=torch.float32)
  • y_true:真实标签,包含两个样本,分别属于类别 1 和类别 2。
  • y_pred:预测的概率分布,包含两个样本,每个样本有三个类别的预测值。

Step 1: Softmax 变换

Softmax 函数将原始的预测值转换为概率分布。Softmax 的公式如下:

Softmax ( x i ) = e x i ∑ j e x j \text{Softmax}(x_i) = \frac{e^{x_i}}{\sum_{j} e^{x_j}} Softmax(xi)=jexjexi

对于第一个样本 y_pred = [0.2, 0.6, 0.2]

  1. 计算指数:

e 0.2 ≈ 1.221 , e 0.6 ≈ 1.822 , e 0.2 ≈ 1.221 e^{0.2} \approx 1.221, \quad e^{0.6} \approx 1.822, \quad e^{0.2} \approx 1.221 e0.21.221,e0.61.822,e0.21.221

  1. 计算 Softmax 分母:

∑ j e x j = 1.221 + 1.822 + 1.221 = 4.264 \sum_{j} e^{x_j} = 1.221 + 1.822 + 1.221 = 4.264 jexj=1.221+1.822+1.221=4.264

  1. 计算 Softmax 分子并得到结果:

Softmax ( 0.2 ) = 1.221 4.264 ≈ 0.286 \text{Softmax}(0.2) = \frac{1.221}{4.264} \approx 0.286 Softmax(0.2)=4.2641.2210.286

Softmax ( 0.6 ) = 1.822 4.264 ≈ 0.427 \text{Softmax}(0.6) = \frac{1.822}{4.264} \approx 0.427 Softmax(0.6)=4.2641.8220.427

Softmax ( 0.2 ) = 1.221 4.264 ≈ 0.286 \text{Softmax}(0.2) = \frac{1.221}{4.264} \approx 0.286 Softmax(0.2)=4.2641.2210.286

Softmax 结果为 [[0.286, 0.427, 0.286]]

对于第二个样本 y_pred = [0.1, 0.8, 0.1]

  1. 计算指数:

e 0.1 ≈ 1.105 , e 0.8 ≈ 2.225 , e 0.1 ≈ 1.105 e^{0.1} \approx 1.105, \quad e^{0.8} \approx 2.225, \quad e^{0.1} \approx 1.105 e0.11.105,e0.82.225,e0.11.105

  1. 计算 Softmax 分母:

∑ j e x j = 1.105 + 2.225 + 1.105 = 4.435 \sum_{j} e^{x_j} = 1.105 + 2.225 + 1.105 = 4.435 jexj=1.105+2.225+1.105=4.435

  1. 计算 Softmax 分子并得到结果:

Softmax ( 0.1 ) = 1.105 4.435 ≈ 0.249 \text{Softmax}(0.1) = \frac{1.105}{4.435} \approx 0.249 Softmax(0.1)=4.4351.1050.249

Softmax ( 0.8 ) = 2.225 4.435 ≈ 0.502 \text{Softmax}(0.8) = \frac{2.225}{4.435} \approx 0.502 Softmax(0.8)=4.4352.2250.502

Softmax ( 0.1 ) = 1.105 4.435 ≈ 0.249 \text{Softmax}(0.1) = \frac{1.105}{4.435} \approx 0.249 Softmax(0.1)=4.4351.1050.249

Softmax 结果为 [[0.249, 0.502, 0.249]]

Step 2: 计算交叉熵损失

交叉熵损失的公式为:

CrossEntropyLoss ( p , y ) = − ∑ i = 1 N y i log ⁡ ( p i ) \text{CrossEntropyLoss}(p, y) = -\sum_{i=1}^{N} y_i \log(p_i) CrossEntropyLoss(p,y)=i=1Nyilog(pi)

对于第一个样本,真实标签为 1(y_true = 1),Softmax 后的预测概率分布为 [0.286, 0.427, 0.286]

CrossEntropyLoss = − [ 0 ⋅ log ⁡ ( 0.286 ) + 1 ⋅ log ⁡ ( 0.427 ) + 0 ⋅ log ⁡ ( 0.286 ) ] \text{CrossEntropyLoss} = - [0 \cdot \log(0.286) + 1 \cdot \log(0.427) + 0 \cdot \log(0.286)] CrossEntropyLoss=[0log(0.286)+1log(0.427)+0log(0.286)]

由于 (0 \cdot \log(0.286) = 0),忽略后我们得到:

log ⁡ ( 0.427 ) ≈ 0.851 \log(0.427) \approx 0.851 log(0.427)0.851

对于第二个样本,真实标签为 2(y_true = 2),Softmax 后的预测概率分布为 [0.249, 0.502, 0.249]

CrossEntropyLoss = − [ 0 ⋅ log ⁡ ( 0.249 ) + 0 ⋅ log ⁡ ( 0.502 ) + 1 ⋅ log ⁡ ( 0.249 ) ] \text{CrossEntropyLoss} = - [0 \cdot \log(0.249) + 0 \cdot \log(0.502) + 1 \cdot \log(0.249)] CrossEntropyLoss=[0log(0.249)+0log(0.502)+1log(0.249)]

由于 (0 \cdot \log(0.249) = 0) 和 (0 \cdot \log(0.502) = 0),忽略后我们得到:

log ⁡ ( 0.249 ) ≈ 1.390 \log(0.249) \approx 1.390 log(0.249)1.390

Step 3: 平均损失

计算平均损失:

平均损失 = 0.851 + 1.390 2 ≈ 2.241 2 ≈ 1.1205 \text{平均损失} = \frac{0.851 + 1.390}{2} \approx \frac{2.241}{2} \approx 1.1205 平均损失=20.851+1.39022.2411.1205

因此,最终的交叉熵损失 my_loss 约为 1.1205。

更多问题咨询

Cos机器人

<think>嗯,用户想了解如何在深度学习计算和应用softmax交叉熵损失函数。首先,我需要回忆一下相关的知识点。Softmax函数和交叉熵损失通常一起用于多分类问题。Softmax的作用是将模型的原始输出转化为概率分布,而交叉熵则衡量预测概率和真实标签之间的差异。 接下来,我应该分步骤解释。首先介绍Softmax函数的数学公式,确保用户明白它的作用是将logits转换为概率。然后说明交叉熵计算方法,这里需要区分单样本和批量计算的情况。要注意使用正确的LaTeX格式,比如用$...$包裹行内公式,独立公式用$$...$$。 然后,应用部分可能需要举例子,比如图像分类任务,说明在神经网络中如何将Softmax交叉熵结合起来。这里可以引用用户提供的参考文献,比如引用[1]和[3]中的内容,说明实际应用中的步骤。 用户提供的引用中提到,传统Softmax交叉熵在人脸认证中的不足,以及改进方法,比如论文中的几何分析。这部分可以作为优化方向的扩展,但用户的主要问题是如何计算和应用,所以这部分可能放在后续的相关问题里。 需要注意用户要求生成相关问题,所以最后要添加几个相关的问题,比如梯度推导、优化方法、与二分类的区别等。这些问题需要基于用户提供的引用内容,比如引用[2]和[4]提到的改进方法,可以作为相关问题之一。 另外,代码示例可能会有帮助,比如用Python实现Softmax交叉熵损失计算。但用户提供的示例中,快速排序用了代码块,所以这里也应该用类似的格式。需要注意数值稳定性问题,比如减去最大值,这在代码中需要体现。 最后,检查是否所有数学公式都正确使用了LaTeX格式,引用标识是否正确添加,回答结构是否清晰,分步骤说明。确保回答覆盖了计算步骤、应用场景、优化方向,并引用了用户提供的资料。</think>### Softmax交叉熵损失函数的计算与应用步骤 #### 一、核心公式与计算步骤 1. **Softmax函数** 将神经网络的原始输出(logits)转换为概率分布: $$ \sigma(z_i) = \frac{e^{z_i}}{\sum_{j=1}^C e^{z_j}} $$ 其中$z_i$为第$i$类别的原始输出值,$C$为类别总数[^1]。 2. **交叉熵损失计算** 对于单个样本的真实标签$y$(one-hot编码)和预测概率$\hat{y}$,损失为: $$ L = -\sum_{i=1}^C y_i \log(\hat{y}_i) $$ 批量计算时取平均值,例如批量样本数为$N$,则总损失为: $$ L_{\text{batch}} = -\frac{1}{N}\sum_{k=1}^N \sum_{i=1}^C y_i^{(k)} \log(\hat{y}_i^{(k)}) $$[^3] #### 二、实际应用场景(以图像分类为例) 1. 网络最后一层输出维度等于类别数(如ResNet输出1000维对应ImageNet分类) 2. Softmax层将输出转换为概率分布 3. 交叉熵损失计算反向传播梯度,例如: ```python def softmax(z): exp_z = np.exp(z - np.max(z)) # 数值稳定性处理 return exp_z / exp_z.sum(axis=1, keepdims=True) def cross_entropy(y_true, y_pred): return -np.mean(y_true * np.log(y_pred + 1e-15)) # 防止log(0) ``` #### 三、优化方向(来自研究进展) 1. **特征空间约束**:通过权重归一化约束分类超平面,提升类间区分度[^4] 2. **边缘增强**:在Softmax中引入间隔参数$m$,要求$W_i^T x > \cos\theta_{y_i} - m$[^2] 3. **温度系数调节**:添加温度参数$\tau$控制概率分布的平滑度: $$ \sigma(z_i) = \frac{e^{z_i/\tau}}{\sum_j e^{z_j/\tau}} $$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值