小白都能看懂的softmax loss

本文详细解析了深度学习中Softmax函数的工作原理,包括其在前向传播中的角色,如何通过交叉熵计算损失,以及在反向传播过程中如何计算梯度。此外,还讨论了处理指数上溢和对数下溢的问题。

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

1. 前向传播

  • 一张图像经过层层计算,在softmax之前得到z1,z2,…
  • 经过softmax变成,pj是softmax的输出p1=ez1/(ez1+ez2+...),p2=ez2/(ez1+ez2+...),...... p1=e^{z1}/(e^{z1}+e^{z2}+...), p2=e^{z2}/(e^{z1}+e^{z2}+...), ...... p1=ez1/(ez1+ez2+...),p2=ez2/(ez1+ez2+...),......
  • softmax常常使用交叉熵计算loss,如下图
    在这里插入图片描述

2. 反向传播

  • groundtruth对应的zj和非groundtruth的zj分开计算
  • groundtruth对应的zj
    在这里插入图片描述
  • 非groundtruth对应的zj
    在这里插入图片描述
  • 所以groundtruth对应的zj反向传播的梯度是pj-1,非groundtruth对应的zj反向传播的梯度是pj

3.指数的上溢和对数的下溢

  • z1,z2,…中出现1000以上很常见,此时指数就会向上溢出。所以求指数前先减去他们的最大值,结果是一样的,本质就是分子分母同时除以一个常数
  • 求交叉熵损失的时候,softmax的值非常小,比如10的-1000次也是可能的,此时就出现向下溢出。所以将公式变换以下:
    在这里插入图片描述
<think>嗯,用户想了解Softmax Loss的概念和实现方式。首先,我需要回忆一下Softmax Loss在机器学习中的作用。记得Softmax函数通常用于多分类问题,它将神经网络的输出转换为概率分布。而Softmax Loss应该是结合了Softmax和交叉熵损失函数的结果。 接下来,我应该分步骤解释。首先解释Softmax函数的数学公式,确保使用正确的LaTeX格式,比如$z_i$表示输出层的第i个节点,然后通过指数函数归一化得到概率。然后,交叉熵损失的部分,如何计算真实标签和预测概率之间的差异。 然后,可能需要提到梯度下降在优化过程中的应用,因为反向传播需要计算梯度。这里可以引用参考文献中的梯度下降内容,比如引用[2]提到的逻辑回归的梯度下降,可能和Softmax的梯度有相似之处。 还要注意用户提到的实现方式,可能需要给出一个Python的示例代码,比如用NumPy实现Softmax和损失计算。要确保代码正确,比如处理数值稳定性问题,减去最大值避免指数爆炸。 用户可能想知道为什么使用交叉熵而不是MSE,这时候可以比较两者的区别,比如引用[1]中的MSE损失,但指出在分类问题中交叉熵更合适。此外,可能还需要提到应用场景,比如在图像分类中的全连接层,引用[4]提到的全连接层的作用。 最后,生成相关问题的时候,要覆盖数学推导、实现细节、优化方法、与其他损失函数的对比以及应用场景。比如梯度计算、反向传播的实现、优化算法如Adam,以及与SVM的对比等。 要确保回答结构清晰,分点解释概念、数学表达、实现步骤和代码示例,并且引用相关文献。同时检查LaTeX格式是否正确,行内公式用$...$,独立公式用$$...$$,并且代码块用正确的语法高亮。</think>### Softmax Loss详解 #### 1. 概念解析 Softmax Loss是分类任务中的核心损失函数,由两部分组成: - **Softmax函数**:将神经网络输出转换为概率分布,保证输出总和为1 $$ \text{Softmax}(z_i) = \frac{e^{z_i}}{\sum_{j=1}^C e^{z_j}} $$ 其中$z_i$是第$i$类输出值,$C$是类别总数 - **交叉熵损失**:衡量预测概率与真实分布的差异 $$ L = -\sum_{i=1}^C y_i \log(p_i) $$ 其中$y_i$是真实标签(one-hot编码),$p_i$是预测概率[^2] #### 2. 数学推导 假设三分类问题输出$z = [3, 1, -2]$,真实标签$y = [1,0,0]$: 1. 计算Softmax概率: $$ p_1 = \frac{e^3}{e^3 + e^1 + e^{-2}} \approx 0.88 $$ $$ p_2 = \frac{e^1}{e^3 + e^1 + e^{-2}} \approx 0.12 $$ $$ p_3 = \frac{e^{-2}}{e^3 + e^1 + e^{-2}} \approx 0.00 $$ 2. 计算交叉熵损失: $$ L = -(1\cdot \log(0.88) + 0\cdot \log(0.12) + 0\cdot \log(0.00)) \approx 0.127 $$ #### 3. Python实现 ```python import numpy as np def softmax(z): exp_z = np.exp(z - np.max(z)) # 数值稳定性优化 return exp_z / exp_z.sum(axis=0) def cross_entropy_loss(y_true, y_pred): epsilon = 1e-12 # 防止log(0) return -np.sum(y_true * np.log(y_pred + epsilon)) # 示例计算 z = np.array([3.0, 1.0, -2.0]) y_true = np.array([1, 0, 0]) probs = softmax(z) loss = cross_entropy_loss(y_true, probs) print(f"Probabilities: {probs}") # [0.88079708 0.11894285 0.00026007] print(f"Loss: {loss:.4f}") # 0.1274 ``` #### 4. 关键特性 - **梯度计算高效**:反向传播时梯度可简化为$\frac{\partial L}{\partial z_i} = p_i - y_i$[^2] - **类别竞争机制**:通过指数运算放大类间差异 - **数值稳定性**:实现时需要处理指数爆炸问题(代码中减去最大值) #### 5. 应用场景 主要用于多分类任务,常见于: - 图像分类(ImageNet分类)[^4] - 自然语言处理(词性标注) - 推荐系统(物品类别预测)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刀么克瑟拉莫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值