Focal loss代码实现补充:NLLLoss损失函数

432 阅读1分钟

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情

  • 模型分类问题经常遇到正负样本不均衡,难易样本不均衡的情况,通过不同的优化损失函数通常有一个明显的效果,但是损失函数中,经常会遇到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=ezjk=1nezk\sigma(z)_{j} = \frac{e^{z_{j}}}{\sum_{k=1}^ne^{z_{k}}}

Log_Softmax() 函数的值域是 ( − ∞ , 0 ] ,公式:

log——softmax=lnσ(z)jlog——softmax = \ln{\sigma(z)_{j}}

NLLLoss() ,即负对数似然损失函数(Negative Log Likelihood),公式:

nllloss=1Nk=1Nyk(log——softmax)nllloss = - \frac{1}{N}\sum_{k=1}^Ny_{k}(log——softmax)

公式上来看:nllloss的结果就是yk与经过log_softmax函数激活后的数据相乘,然后累加求平均值并取反

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

CrossEntropyLoss() = log_softmax + nllloss

------好像也没啥了,可以见参考资料,有现成代码注解,自己试验的也没意义

  • ref:

Log_Softmax()激活函数、NLLLoss()损失函数、CrossEntropyLoss()损失函数浅析_嘿嘿骑士的博客-CSDN博客_logsoftmax是损失函数吗

吃透torch.nn.CrossEntropyLoss() - 知乎 (zhihu.com)

详解torch.nn.NLLLOSS - 知乎 (zhihu.com)