softmax和softmax loss详细解析

本文深入解析卷积神经网络(CNN)中的全连接层和损失层工作原理,包括softmax函数、softmaxloss及crossentropy概念,通过实例帮助理解模型训练目标。

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

本文转载于以下博文地址:https://blog.csdn.net/u014380165/article/details/77284921

如有冒犯,还望谅解!

我们知道卷积神经网络(CNN)在图像领域的应用已经非常广泛了,一般一个CNN网络主要包含卷积层,池化层(pooling),全连接层,损失层等。虽然现在已经开源了很多深度学习框架(比如MxNet,Caffe等),训练一个模型变得非常简单,但是你对这些层具体是怎么实现的了解吗?你对softmax,softmax loss,cross entropy了解吗?相信很多人不一定清楚。虽然网上的资料很多,但是质量参差不齐,常常看得眼花缭乱。为了让大家少走弯路,特地整理了下这些知识点的来龙去脉,希望不仅帮助自己巩固知识,也能帮到他人理解这些内容。

这一篇主要介绍全连接层和损失层的内容,算是网络里面比较基础的一块内容。先理清下从全连接层到损失层之间的计算。来看下面这张图,来自参考资料1(自己实在懒得画图了)。

这张图的等号左边部分就是全连接层做的事,W是全连接层的参数,我们也称为权值,X是全连接层的输入,也就是特征。从图上可以看出特征X是N*1的向量,这是怎么得到的呢?这个特征就是由全连接层前面多个卷积层和池化层处理后得到的,假设全连接层前面连接的是一个卷积层,这个卷积层的输出是100个特征(也就是我们常说的feature map的channel为100),每个特征的大小是4*4,那么在将这些特征输入给全连接层之前会将这些特征flat成N*1的向量(这个时候N就是100*4*4=1600)。解释完X,再来看W,W是全连接层的参数,是个T*N的矩阵,这个N和X的N对应,T表示类别数,比如你是7分类,那么T就是7。我们所说的训练一个网络,对于全连接层而言就是寻找最合适的W矩阵。因此全连接层就是执行WX得到一个T*1的向量(也就是图中的logits[T*1]),这个向量里面的每个数都没有大小限制的,也就是从负无穷大到正无穷大。然后如果你是多分类问题,一般会在全连接层后面接一个softmax层,这个softmax的输入是T*1的向量,输出也是T*1的向量(也就是图中的prob[T*1],这个向量的每个值表示这个样本属于每个类的概率),只不过输出的向量的每个值的大小范围为0到1。

现在你知道softmax的输出向量是什么意思了,就是概率,该样本属于各个类的概率!

那么softmax执行了什么操作可以得到0到1的概率呢?先来看看softmax的公式(以前自己看这些内容时候对公式也很反感,不过静下心来看就好了):

公式非常简单,前面说过softmax的输入是WX,假设模型的输入样本是I,讨论一个3分类问题(类别用1,2,3表示),样本I的真实类别是2,那么这个样本I经过网络所有层到达softmax层之前就得到了WX,也就是说WX是一个3*1的向量,那么上面公式中的aj就表示这个3*1的向量中的第j个值(最后会得到S1,S2,S3);而分母中的ak则表示3*1的向量中的3个值,所以会有个求和符号(这里求和是k从1到T,T和上面图中的T是对应相等的,也就是类别数的意思,j的范围也是1到T)。因为e^x恒大于0,所以分子永远是正数,分母又是多个正数的和,所以分母也肯定是正数,因此Sj是正数,而且范围是(0,1)。如果现在不是在训练模型,而是在测试模型,那么当一个样本经过softmax层并输出一个T*1的向量时,就会取这个向量中值最大的那个数的index作为这个样本的预测标签。

因此我们训练全连接层的W的目标就是使得其输出的WX在经过softmax层计算后其对应于真实标签的预测概率要最高。

举个例子:假设你的WX=[1,2,3],那么经过softmax层后就会得到[0.09,0.24,0.67],这三个数字表示这个样本属于第1,2,3类的概率分别是0.09,0.24,0.67。

———————————–华丽的分割线——————————————

弄懂了softmax,就要来说说softmax loss了。
那softmax loss是什么意思呢?如下:

首先L是损失。Sj是softmax的输出向量S的第j个值,前面已经介绍过了,表示的是这个样本属于第j个类别的概率。yj前面有个求和符号,j的范围也是1到类别数T,因此y是一个1*T的向量,里面的T个值,而且只有1个值是1,其他T-1个值都是0。那么哪个位置的值是1呢?答案是真实标签对应的位置的那个值是1,其他都是0。所以这个公式其实有一个更简单的形式:

当然此时要限定j是指向当前样本的真实标签。

来举个例子吧。假设一个5分类问题,然后一个样本I的标签y=[0,0,0,1,0],也就是说样本I的真实标签是4,假设模型预测的结果概率(softmax的输出)p=[0.1,0.15,0.05,0.6,0.1],可以看出这个预测是对的,那么对应的损失L=-log(0.6),也就是当这个样本经过这样的网络参数产生这样的预测p时,它的损失是-log(0.6)。那么假设p=[0.15,0.2,0.4,0.1,0.15],这个预测结果就很离谱了,因为真实标签是4,而你觉得这个样本是4的概率只有0.1(远不如其他概率高,如果是在测试阶段,那么模型就会预测该样本属于类别3),对应损失L=-log(0.1)。那么假设p=[0.05,0.15,0.4,0.3,0.1],这个预测结果虽然也错了,但是没有前面那个那么离谱,对应的损失L=-log(0.3)。我们知道log函数在输入小于1的时候是个负数,而且log函数是递增函数,所以-log(0.6) < -log(0.3) < -log(0.1)。简单讲就是你预测错比预测对的损失要大,预测错得离谱比预测错得轻微的损失要大。

———————————–华丽的分割线———————————–

理清了softmax loss,就可以来看看cross entropy了。
corss entropy是交叉熵的意思,它的公式如下:

是不是觉得和softmax loss的公式很像。当cross entropy的输入P是softmax的输出时,cross entropy等于softmax loss。Pj是输入的概率向量P的第j个值,所以如果你的概率是通过softmax公式得到的,那么cross entropy就是softmax loss。这是我自己的理解,如果有误请纠正。

下一篇将介绍 卷积神经网络系列之softmax loss对输入的求导推导

参考资料1:http://eli.thegreenplace.net/2016/the-softmax-function-and-its-derivative/
---------------------
 

<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] - 自然语言处理(词性标注) - 推荐系统(物品类别预测)
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值