- 分类问题的损失函数中,经常会遇到torch.nn.NLLLOSS。
- torch.nn.NLLLOSS通常不被独立当作损失函数,而需要和softmax、log等运算组合当作损失函数。此文为:关于Focal loss损失函数的代码实现 - 知乎 (zhihu.com)的补充
torch.nn.NLLLOSS官方链接:NLLLoss — PyTorch 1.12 documentation
- 首先对比Log_softmax, Nllloss,CrossEntropyLoss函数的表达式
log_softmax:
Softmax() 函数的值域是 [ 0 , 1 ] 公式:
σ
(
z
)
j
=
e
z
j
∑
k
=
1
n
e
z
k
\sigma(z)_{j} = \frac{e^{z_{j}}}{\sum_{k=1}^ne^{z_{k}}}
σ(z)j=∑k=1nezkezj
Log_Softmax() 函数的值域是 ( − ∞ , 0 ] ,公式:
l
o
g
——
s
o
f
t
m
a
x
=
ln
σ
(
z
)
j
log——softmax = \ln{\sigma(z)_{j}}
log——softmax=lnσ(z)j
NLLLoss() ,即负对数似然损失函数(Negative Log Likelihood),公式:
n
l
l
l
o
s
s
=
−
1
N
∑
k
=
1
N
y
k
(
l
o
g
——
s
o
f
t
m
a
x
)
nllloss = - \frac{1}{N}\sum_{k=1}^Ny_{k}(log——softmax)
nllloss=−N1k=1∑Nyk(log——softmax)
公式上来看:nllloss的结果就是yk与经过log_softmax函数激活后的数据相乘,然后累加求平均值并取反
实际使用NLLLoss()损失函数时,传入的标签,无需进行 one_hot 编码。
CrossEntropyLoss() = log_softmax + nllloss
------好像也没啥了,可以见参考资料,有现成代码注解,自己试验的也没意义
- ref:
Log_Softmax()激活函数、NLLLoss()损失函数、CrossEntropyLoss()损失函数浅析_嘿嘿骑士的博客-优快云博客_logsoftmax是损失函数吗