目录
在深度学习中,NLLLoss函数是一种常用的损失函数,它通常与LogSoftmax函数一起使用,用于多分类问题。NLLLoss函数计算的是预测概率与真实标签之间的负对数似然损失。
数学定义
假设我们有一个向量z=[z1,z2,...,zn],其中zi是模型对第ii个类别的原始输出(未经过任何非线性变换)。首先,我们需要应用LogSoftmax函数来得到每个类别的对数概率:
这里的li是第i个类别的对数概率。
对于每个样本ii,假设真实标签为yiyi,则NLLLoss函数计算的是真实标签对应的对数概率的负值:
对于整个批次的数据,NLLLoss函数的总损失是所有样本损失的平均值:
其中N是批次中样本的数量。
函数的优点
1.数值稳定:与LogSoftmax函数结合使用时,NLLLoss函数可以有效的避免数值溢出问题。
2.计算效率好:相比于直接使用Softmax函数后再计算交叉熵损失,使用NLLLoss函数可以简化计算过程。
3.简化梯度计算:NLLLoss函数的梯度计算较为简单,有利于提高计算速度。
函数的缺陷
1.只能用于单标签的分类:NLLLoss函数每一个样本只有一个正确的标签,不适用于多标签的分类问题。
2.对异常值敏感:如果预测结果与真实标签相差很大,NLLLoss函数的损失值很大,可能会导致训练的结果不稳定。
3.计算效率高:尽管NLLLoss函数简化了计算,但是计算LogSoftmax仍然涉及指数运算求和,这在计算上是相对昂贵的。
代码实现
import torch
import torch.nn as nn
#创建LogSoftmax函数实例
log_softmax=nn.LogSoftmax(dim=1)
#创建NLLLoss函数实例
nll_loss=nn.NLLLoss()
#实例
#假设我们有两个样本,每一个样本有三个类别
inputs=torch.randn(2,3)
#经过LogSoftmax函数
log_probs=log_softmax(inputs)
#标签
#每一个样本的真实标签是一个整数,表示属于哪一个类别
targets=torch.tensor([0,2])
#计算NLLLoss
loss=nll_loss(log_probs,targets)
print(loss.item())
总结
NLLLoss函数在深度学习中的多分类问题中非常常见,它与LogSoftmax函数结合使用,可以提供稳定的数值计算和高效的损失计算。然而,在某些情况下,如多标签分类问题或其他特殊需求时,可能需要考虑其他的损失函数。