Log_Softmax()激活函数、NLLLoss()损失函数、CrossEntropyLoss()损失函数浅析

本文详细介绍了PyTorch中的三种损失函数:Log_Softmax(), NLLLoss()和CrossEntropyLoss()。通过数学公式解释了每种函数的工作原理,并提供了实际代码示例,展示了如何使用这些函数进行神经网络训练。

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

Log_Softmax()激活函数、NLLLoss()损失函数、CrossEntropyLoss()损失函数

1. Log_Softmax()激活函数。

Softmax() 函数的值域是 [0,1][0, 1][0,1],公式:
σ(z)j=ezj∑k=1nezk\sigma(z)_j =\frac{e^{z_j}}{\sum_{k=1}^{n} {e^{z_k}}}σ(z)j=k=1nezkezj

Log_Softmax() 函数的值域是 (−∞,0](- \infty, 0](,0],公式:
log_softmax=loge[σ(z)j]log\_softmax =log_e \left[\sigma(z)_j \right]log_softmax=loge[σ(z)j]

2. NLLLoss()损失函数

NLLLoss() ,即负对数似然损失函数(Negative Log Likelihood)。
NLLLoss() 损失函数公式:
nllloss=−1N∑k=1Nyk(log_softmax)nllloss =-\frac{1}{N} {\sum_{k=1}^{N} y_k \left(log\_softmax \right)} nllloss=N1k=1Nyk(log_softmax)

yky_kyk :one_hot 编码之后的数据标签

NLLLoss() 损失函数运算的结果,即是 yky_kyk 与 经过 log_softmax()log\_softmax()log_softmax() 函数激活后的数据,两者相乘,再求平均值,最后取反。

实际使用NLLLoss()损失函数时,传入的标签,无需进行 one_hot 编码。

3. CrossEntropyLoss()损失函数

CrossEntropyLoss()损失函数,是将Log_Softmax()激活函数与NLLLoss()损失函数的功能综合在一起了。
cross_entropy=log_softmax+nlllosscross\_entropy = log\_softmax + nllloss cross_entropy=log_softmax+nllloss

传入的数据无需激活,标签无需做 one_hot 编码。

实际应用中,常选用NLLLoss()函数,如此可以控制数据的激活操作。


代码

代码运行之后,三种方式的运算结果是一致的。

import torch.nn.functional as F
import torch


# 手动实现 NLLLoss() 函数功能
data = torch.randn(5, 5)  # 随机生成一组数据
target = torch.tensor([0, 2, 4, 3, 1])  # 标签
one_hot = F.one_hot(target).float()  # 对标签作 one_hot 编码

exp = torch.exp(data)  # 以e为底作指数变换
sum = torch.sum(exp, dim=1).reshape(-1, 1)  # 按行求和
softmax = exp / sum  # 计算 softmax()
log_softmax = torch.log(softmax)  # 计算 log_softmax()
nllloss = -torch.sum(one_hot * log_softmax) / target.shape[0]  # 标签乘以激活后的数据,求平均值,取反
print("nllloss:", nllloss)


# 调用 NLLLoss() 函数计算
Log_Softmax = F.log_softmax(data, dim=1)  # log_softmax() 激活
Nllloss = F.nll_loss(Log_Softmax, target)  # 无需对标签作 one_hot 编码
print("Nllloss:", Nllloss)


# 直接使用交叉熵损失函数 CrossEntropy_Loss()
cross_entropy = F.cross_entropy(data, target)  # 无需对标签作 one_hot 编码
print('cross_entropy:', cross_entropy)

`log_softmax NLLLoss`是深度学习领域中用于计算交叉熵损失的一种常见组合技术,尤其在分类任务中非常流行。 ### log_softmax 首先,我们解释一下`log_softmax`函数的作用。给定输入向量 `x`,log_softmax 函数会先应用 softmax 函数将每个元素转换成概率分布形式: \[ \text{softmax}(x)_i = \frac{\exp(x_i)}{\sum_{j=1}^{n} \exp(x_j)} \] 然后,对得到的概率分布取自然对数: \[ \text{log\_softmax}(x)_i = \ln(\text{softmax}(x)_i) \] 这个操作不仅简化了指数运算和归一化步骤,同时在数值稳定性方面也更优。尤其是在反向传播过程中,避免了直接对较大的指数值求对数可能会产生的数值溢出问题。 ### NLLLoss (Negative Log Likelihood Loss) 接下来说说 NLLLoss 的含义。NLLLoss,即负对数似然损失(Negative Log Likelihood Loss),是一种常用的损失函数,用于评估模型预测结果与实际标签之间的差距。在分类任务中,其目标是最小化模型预测的类别概率与真实标签之间的负对数似然度之和。 公式表示如下: \[ L(y, p) = -\log(p_y) \] 其中,\(y\) 表示真实标签,而 \(p_y\) 是模型预测属于该标签的概率。 ### 将二者结合使用 在实践中,我们将两个组件结合使用是因为它们各自的特点使其相得益彰: 1. **数值稳定性**:通过在计算过程中使用 `log_softmax` 可以提高数值稳定性和防止数值溢出的问题。 2. **简化梯度计算**:`log_softmax` 计算的导数可以直接与 NLLLoss 的导数关联起来,减少了梯度传播过程中的复杂性。 3. **提升训练效率**:这种组合使得梯度更新更为直接,从而加速了模型的训练过程,并有助于优化性能。 因此,在深度学习框架如 PyTorch 和 TensorFlow 中,`LogSoftmax + NLLLoss` 这种组合经常被推荐用于监督学习的任务特别是分类任务中。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值