负对数似然(negative log-likehood, NLL)

目录

1. 似然

2. 最大似然估计

3. 对数似然

4. 负对数似然

5. 补充说明

Reference 


1. 似然

        似然与概率不同。概率是指一个事件发生的可能性,描述的是对象是事件;似然是指影响事件发生概率的未知参数,描述的对象是参数。由于参数有一定的值(虽然未知),并非事件或随机变量,无概率可言,于是改用“似然”一词。

        假设X是离散随机变量,其概率质量函数p​依赖于参数\theta​,则:

L\left ( \theta|X \right ) = p_\theta \left ( x{\color{Red} } \right ) = P_\theta \left ( X=x\right )

        其中,L\left ( \theta|X \right )​为参数\theta​的似然函数,x​为随机变量X​的某一值。

2. 最大似然估计

        最大似然估计(Maximum Likehood Estimation, MLE)是参数估计的一种方法,其估计的对象是参数

        假设我们有一个非常复杂的数据分布P_{data} \left ( x\right )​,但我们不知道该分布的数学表达形式,所以我们需要定义一个分布模型P_G \left ( x;\theta \right )​(这里的分布模型我们事先是知道的,如正态分布、均匀分布等),该分布由参数\theta​决定。

        我们的目标就是求得参数\theta​,使得定义的分布P_G \left ( x;\theta \right )​尽可能地接近P_{data} \left ( x\right )​。

        通过以下步骤来进行最大似然估计:

  1. P_{data} \left ( x\right )​中采集m​个样本:x_1​,x_2​,...,x_m​;
  2. 计算样本的似然函数L=\prod_{i = 1}^{m} P_G\left ( x^i;\theta \right )​,其中,\prod​为求积符号;
  3. 求使得似然函数L​最大的参数\theta​:

\theta^* = \mathop{argmax}\limits_{\theta}\prod_{i=1}^{m}P_G\left ( x^i;\theta \right )

        当来自P_{data} \left ( x\right )​的样本x_1​,x_2​,...,x_m​在P_G \left ( x;\theta \right )​分布模型中出现的概率越高,即\prod_{i = 1}^{m} P_G\left ( x^i;\theta \right )​越大时,P_G \left ( x;\theta \right )​和P_{data} \left ( x\right )​越接近。

在“模型已定,参数未知”的情况下,使用最大似然估计算法学习参数是比较普遍的。

3. 对数似然

        似然函数L=\prod_{i = 1}^{m} P_G\left ( x^i;\theta \right )​取对数,即得到对数似然(log-likehood)。

        对数似然公式表示为:

l\left ( \theta \right ) = log\prod_{i=1}^{m}P_G\left ( x^i;\theta \right )=\sum_{i=1}^{m}\left ( P_G\left ( x^i;\theta \right ) \right )

        这样,就对\theta​求解的问题就转化为了求极值的经典问题。解决思路为:“求偏导\rightarrow​令偏导等于零\rightarrow​求得参数”。

4. 负对数似然

        顾名思义,负对数似然(negative log-likehood)即是对对数似然qu负。由于概率分布P_G \left ( x;\theta \right )​取值为[0,1]​ ,取对数后,取值为[0,-\infty]​;再取符号,取值变为[0, +\infty]​,如下图所示:

负对数似然(negative log-likehood, NLL)_第1张图片

        负对数似然公式表示为:

l\left ( \theta \right ) =-\sum_{i=1}^{m}\left ( P_G\left ( x^i;\theta \right ) \right )

        实际中,P_G\left ( x^i;\theta \right )​为概率值

        注:交叉熵公式为:

H\left ( p,q \right ) = -\sum_{i=1}^{m}p\left ( x_i \right )log\left ( q\left ( x_i \right ) \right )

        其中p​为真实概率分布,q​为预测概率分布。实际中,由于真实标签中,除了对应类别外,其他概率都为0,因此p\left ( x_i \right )=1​。

        故交叉熵可简写为:

        

H\left ( p,q \right ) = -\sum_{i=1}^{m}log\left ( q\left ( x_i \right ) \right )

         可以明显看出,负对数似然和交叉熵有高度的相似性。其实,在分类问题中,所使用的的交叉熵损失,本质就是负对数似然。

         实际中,我们希望最大化似然估计,以得到最接近数据分布的模型,即希望\sum_{i=1}^{m}\left ( P_G\left ( x^i;\theta \right ) \right )​最大,那么也即-\sum_{i=1}^{m}\left ( P_G\left ( x^i;\theta \right ) \right )​最小。此外,由上图也可以看出,当负对数似然函数的输入(概率)越接近于1时,函数值越接近于0。因此,可将负对数似然作为损失函数

5. 补充说明

        负对数似然损失函数在Pytorch中对应函数{\color{Red} nn.NLLLoss\left ( \right )}​。

        需要指出的是,虽然Pytorch的nn.LLLoss\left ( \right )​名为负对数似然,但其内部并没有进行对数计算,而是仅仅求和平均后取负(函数参数reduction为默认值'mean',参数weight为默认值'none'时)。所以实际使用中,需将nn.LLLoss\left ( \right )​与 {\color{Red} nn.LogSoftmax()}​一起使用,即先对数据进行logsoftmax()​处理后,再输入nn.LLLoss\left ( \right )​中,才能得到负对数似然损失。或者,直接使用交叉熵损失函数:\small {\color{Red} nn.CrossEntropyLoss\left ( \right )}​。

        以下代码说明了这一点:

>>> import torch.nn as nn
>>> m = nn.LogSoftmax(dim=1)
>>> Loss_NLLL = nn.NLLLoss()
>>> # input is of size N x C = 3 x 5
>>> input = torch.randn(3, 5, requires_grad=True)
>>> input_LS = m(input)
>>> # each element in target has to have 0 <= value < C
>>> target = torch.tensor([1, 0, 4])

>>> input
tensor([[-0.2512,  0.7716, -0.1233, -0.9330,  1.1369],
        [ 0.0206, -0.0298,  0.0595, -0.2068,  0.2119],
        [ 0.6677, -1.6576, -0.7711, -0.2504, -0.2911]], requires_grad=True)
>>> input_LS
tensor([[-2.2439, -1.2211, -2.1160, -2.9258, -0.8559],
        [-1.6090, -1.6594, -1.5701, -1.8364, -1.4177],
        [-0.7503, -3.0756, -2.1891, -1.6684, -1.7091]],
       grad_fn=)

>>> #交叉熵损失
>>> Loss_CE = nn.CrossEntropyLoss()

>>> loss_NLLL = Loss_NLLL(input, target) #未加LogSoftmax()的负对数损失
>>> loss_NLLL_LS = Loss_NLLL(input_LS, target) #加了LogSfotmax()的负对数损失
>>> loss_CE = Loss_CE(input, target) #交叉熵损失

>>> loss_NLLL
tensor(-0.1670, grad_fn=)
>>> loss_NLLL_LS
tensor(1.5131, grad_fn=)
>>> loss_CE
tensor(1.5131, grad_fn=)

        从以上代码示例可以看到,loss_NLLL_LS = loss_CE,即,加了LogSoftmax的NLLLoss所得结果和CrossEntropyLoss结果相同。


         学习总结,以作分享,如有不妥,敬请指出。


Reference

[1] 损失函数——负对数似然_Pr4da的博客-CSDN博客_负对数似然损失函数

[2] 负对数似然(negative log-likelihood)_不一样的雅兰酱的博客-CSDN博客_负对数似然

​​​​​​[3] NLLLoss — PyTorch 1.11.0 documentation

你可能感兴趣的:(概率论,python,pytorch)