Softmax层与LogSoftmax层的对比

  • 1. Softmax

作用:将网络输出值的每一维映射成(0,1)之间的概率值,且所有维的概率值之和等于1。

具体理解

神经网络解决多分类(N分类)问题,最后一层输出会是N个神经元,所以对于每一个输入样本,都对应输出一个N维的向量,如[-2.3 , 1.9 , 3.4 , -5.6],此时每一维的值有正有负有大有小。

一般会将此时网络的输出再通过一个softmax层,每一维都变成了一个[0,1]之间的概率值,并且所有维的概率值之和等于1,将概率值最大的一维规定为该输入样本对应的标签类,如[0.1 , 0.2 , 0.6 , 0.1],为第三类。

softmax具体的计算公式为:(指数函数可以将R上所有的值映射到(0,正无穷))

pytorch代码调用

self.softmax = nn.Softmax(dim=-1)
##########################################
p = self.softmax(logist)

注意:

dim=0:对第0维(每一列)的所有元素进行softmax运算

dim=1:对第1维(每一行)的所有元素进行softmax运算

dim=-1:对倒数第1维的所有元素进行softmax运算

 

  • 2. LogSoftmax

 作用:就是对每一个y取{log_{e}}^{y_{i}}, 一方面是为了解决溢出的问题,另一方面是方便CrossEntropyLoss的计算。

具体理解: 如上图,因为softmax会进行指数操作,当上一层的输出,也就是softmax的输入比较大的时候,可能就会产生overflow。比如上图中,z1、z2、z3取值很大的时候,超出了float能表示的范围。  同理当输入为负数且绝对值也很大的时候,会分子、分母会变得极小,有可能四舍五入为0,导致下溢出。  尽管在数学表示式上是对softmax在取对数的情况。但是在实操中是通过:

pytorch代码调用

self.logsoftmax = nn.LogSoftmax(dim=-1)
#################################################
p = self.logsoftmax(logist)

 

 

  • 3. 二者比较

联系:由上面的分析可以发现,LogSoftmax其实就是在Softmax的结果上再做一次log运算

区别:虽然在数学上 LogSoftmax(y) = log(Softmax(y)),但是做这两个单独操作速度较慢,数值上也不稳定,LogSoftmax这个函数实际上是使用了上述另一种公式来正确计算输出和梯度。

 

 

参考:

https://www.zhihu.com/question/358069078

https://blog.csdn.net/hao5335156/article/details/80607732

### Softmax 和交叉熵(Cross-Entropy)的解释 Softmax 函数通常用于多分类问题中的最后一神经网络,其作用是将模型输出的 logits 转化为概率分布。具体来说,对于输入向量 \( z \),Softmax 的定义如下: \[ S(z_i) = \frac{e^{z_i}}{\sum_{j=1}^{K} e^{z_j}} \] 其中 \( K \) 是类别的总数[^1]。 #### 为什么使用 SoftmaxSoftmax 将原始分数转换成一个有效的概率分布,使得每个类别对应的值都在区间 [0, 1] 中,并且所有类别的总和等于 1。这有助于后续计算损失函数以及评估预测的概率质量。 --- ### 交叉熵(Cross-Entropy) 交叉熵是一种衡量两个概率分布之间差异的方法,在机器学习中常被用来作为监督学习的目标函数。假设真实标签的概率分布为 \( p \),而模型预测的概率分布为 \( q \),则二者的交叉熵可以表示为: \[ H(p, q) = -\sum_{i=1}^{n} p(i) \log(q(i)) \] 当应用于分类任务时,\( p \) 通常是独热编码形式的一维向量,即仅有一个位置上的值为 1,其余均为 0。因此,交叉熵简化为针对正确类别的负对数似然: \[ L(y, y') = -\log(S(y')) \] 这里 \( S(y') \) 表示通过 Softmax 计算得到的对应于实际标签 \( y' \) 的概率。 --- ### 实现 Softmax-Cross Entropy 损失函数 以下是基于 Python 和 NumPy 的简单实现方式: ```python import numpy as np def softmax(x): """Compute the softmax function.""" exps = np.exp(x - np.max(x)) # Subtract max for numerical stability return exps / np.sum(exps) def cross_entropy_loss(logits, labels): """ Compute the cross entropy loss. Args: logits (numpy.ndarray): Raw model outputs before applying softmax. labels (list[int]): True class indices. Returns: float: Cross entropy loss value. """ num_samples = len(labels) losses = [] for i in range(num_samples): logit_vector = logits[i] label_index = labels[i] probabilities = softmax(logit_vector) loss = -np.log(probabilities[label_index]) # Negative log likelihood losses.append(loss) return np.mean(losses) ``` 上述代码实现了基本的 Softmax 和交叉熵功能。注意为了防止数值溢出,我们在指数运算前减去了最大值来提升稳定性。 --- ### 关联到对比学习中的 NT-Xent 损失 在更复杂的场景下,比如自监督学习领域内的对比学习方法,则会引入类似的机制扩展传统交叉熵的思想。例如,NT-Xent 损失利用温度缩放参数调整正样本之间的相似度权重,从而优化嵌入空间的学习效果[^2]。 尽管如此,基础概念仍然建立在标准交叉熵之上——即最大化目标分布预测分布间的匹配程度。 --- ### 面临挑战及解决方案 构建高效的深度学习系统并非易事,尤其是在涉及复杂架构设计、超参调节等方面存在诸多困难。然而借助现代框架的支持,开发者能够更加专注于核心逻辑而非底细节处理[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值