负对数似然(negative log-likelihood, 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 Likelihood 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-likelihood)。

        对数似然公式表示为:

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-likelihood)即是对对数似然取负。由于概率分布P_G \left ( x;\theta \right )​取值为[0,1]​ ,取对数后,取值为[0,-\infty]​;再取符号,取值变为[0, +\infty]​,如下图所示:

        负对数似然公式表示为:

l\left ( \theta \right ) =-\sum_{i=1}^{m}log\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=<LogSoftmaxBackward0>)

>>> #交叉熵损失
>>> 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=<NllLossBackward0>)
>>> loss_NLLL_LS
tensor(1.5131, grad_fn=<NllLossBackward0>)
>>> loss_CE
tensor(1.5131, grad_fn=<NllLossBackward0>)

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


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


Reference

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

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

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

### log-likelihood 的作用及意义 #### 一、log-likelihood 的定义及其在统计学中的意义 在统计学中,似然函数是一种关于模型参数的函数。它描述了在一组观察到的数据下,不同参数取值的可能性大小[^3]。具体来说,“似然性”表示某一特定参数值能够解释所观察到数据的概率有多大。 对于最大似然估计 (Maximum Likelihood Estimation, MLE),目标是最小化负对数似然Negative Log-Likelihood, NLL)。这是因为最大化原始似然函数可能会涉及复杂的乘法运算,而通过对数转换将其转化为加法规则后更易于处理。因此,在实践中通常会最小化负对数似然来间接实现最大化似然的目的。 #### 二、log-likelihood 越大越好的原因分析 1. **从理论角度理解** 当我们说希望 `log-likelihood` 值尽可能高时,实际上是在寻找那些最有可能生成当前训练集中样本分布的一组参数配置。较高的 `log-likelihood` 表明我们的假设模型更加贴近真实的潜在机制,即这些参数使得观测事件发生的可能性更大。 2. **数值稳定性考虑** 在实际应用过程中由于直接操作极大值可能导致溢出等问题,所以转而采用其自然对数形式——这就是所谓的“Logarithmic Transformation”。这种变换不仅简化了计算过程还提高了算法运行效率并增强了系统的鲁棒性和可靠性[^1]。 3. **优化目标设定** 很多时候我们会把问题建模成一个损失函数的形式来进行求解,其中就包含了上述提到过的交叉熵损失(Cross Entropy Loss)或者说是它的特殊版本之一—Binary CrossEntropy(BCE) 。而对于分类任务而言,BCE本质上就是基于Softmax激活后的输出再套上NLL公式得到的结果。由此可见两者之间存在着密切联系:都是为了找到那个能让预测结果接近实际情况的最佳权重组合! #### 三、代码示例展示如何利用Python库Sklearn计算multi-class log-loss 下面给出了一段简单的Python脚本用来演示前面讨论的内容是如何被应用于现实场景当中去解决具体的业务需求: ```python from sklearn.metrics import log_loss y_true = [0, 2, 1, 2] y_pred = [ [0.9 , 0.05, 0.05], [0.1 , 0.1 , 0.8 ], [0.2 , 0.7 , 0.1 ], [0.05, 0.1 , 0.85] ] loss = log_loss(y_true, y_pred) print(f"Multi-class Log-Likelihood Loss: {loss}") ``` 此程序片段展示了通过调用Scikit Learn提供的接口快速便捷地获取指定条件下对应的评估指标得分情况的方法论思路。 --- ###
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值