目录
1. 似然
2. 最大似然估计
3. 对数似然
4. 负对数似然
5. 补充说明
Reference
似然与概率不同。概率是指一个事件发生的可能性,描述的是对象是事件;似然是指影响事件发生概率的未知参数,描述的对象是参数。由于参数有一定的值(虽然未知),并非事件或随机变量,无概率可言,于是改用“似然”一词。
假设是离散随机变量,其概率质量函数
依赖于参数
,则:
其中,为参数
的似然函数,
为随机变量
的某一值。
最大似然估计(Maximum Likehood Estimation, MLE)是参数估计的一种方法,其估计的对象是参数。
假设我们有一个非常复杂的数据分布,但我们不知道该分布的数学表达形式,所以我们需要定义一个分布模型
(这里的分布模型我们事先是知道的,如正态分布、均匀分布等),该分布由参数
决定。
我们的目标就是求得参数,使得定义的分布
尽可能地接近
。
通过以下步骤来进行最大似然估计:
当来自的样本
,
,...,
在
分布模型中出现的概率越高,即
越大时,
和
越接近。
在“模型已定,参数未知”的情况下,使用最大似然估计算法学习参数是比较普遍的。
似然函数取对数,即得到对数似然(log-likehood)。
对数似然公式表示为:
这样,就对求解的问题就转化为了求极值的经典问题。解决思路为:“求偏导
令偏导等于零
求得参数”。
顾名思义,负对数似然(negative log-likehood)即是对对数似然qu负。由于概率分布取值为
,取对数后,取值为
;再取符号,取值变为
,如下图所示:
负对数似然公式表示为:
实际中,为概率值。
注:交叉熵公式为:
其中
为真实概率分布,
为预测概率分布。实际中,由于真实标签中,除了对应类别外,其他概率都为0,因此
。
故交叉熵可简写为:
可以明显看出,负对数似然和交叉熵有高度的相似性。其实,在分类问题中,所使用的的交叉熵损失,本质就是负对数似然。
实际中,我们希望最大化似然估计,以得到最接近数据分布的模型,即希望最大,那么也即
最小。此外,由上图也可以看出,当负对数似然函数的输入(概率)越接近于1时,函数值越接近于0。因此,可将负对数似然作为损失函数。
负对数似然损失函数在Pytorch中对应函数。
需要指出的是,虽然Pytorch的名为负对数似然,但其内部并没有进行对数计算,而是仅仅求和平均后取负(函数参数
reduction
为默认值'mean'
,参数weight
为默认值'none'
时)。所以实际使用中,需将与
一起使用,即先对数据进行
处理后,再输入
中,才能得到负对数似然损失。或者,直接使用交叉熵损失函数:
。
以下代码说明了这一点:
>>> 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结果相同。
学习总结,以作分享,如有不妥,敬请指出。
[1] 损失函数——负对数似然_Pr4da的博客-CSDN博客_负对数似然损失函数
[2] 负对数似然(negative log-likelihood)_不一样的雅兰酱的博客-CSDN博客_负对数似然
[3] NLLLoss — PyTorch 1.11.0 documentation