閱讀本文可以了解如下內(nèi)容:
- 似然
- 似然估計
- 對數(shù)似然
- 負(fù)對數(shù)似然
1. 似然
在開始之前需要區(qū)分一個知識:似然(likelihood)和概率(probability)住拭。概率是一個事件發(fā)生的可能性溺忧,而似然指的是影響概率的未知參數(shù)秋麸。也就是說徊件,概率是在該未知參數(shù)已知的情況下所得到的結(jié)果潭辈;而似然是該參數(shù)未知,我們需要根據(jù)觀察結(jié)果旅赢,來估計概率模型的參數(shù)宛蚓。
用數(shù)學(xué)方法可以描述為:
假設(shè)是離散隨機(jī)變量激捏,其概率質(zhì)量函數(shù)
依賴于參數(shù)
,則:
其中為參數(shù)
的似然函數(shù)凄吏,
為隨機(jī)變量
的某一值缩幸。[1]
如果我們發(fā)現(xiàn):
那么似然函數(shù)就可以反映出這樣一個樸素推測:在參數(shù)下隨機(jī)變量
取到
的可能性大于在參數(shù)
下隨機(jī)向量
取到
的可能性壹置。換句話說,我們更有理由相信表谊,相對于
钞护,
更有可能是該概率模型的真實參數(shù)。[2]
綜上爆办,概率(密度)表達(dá)給定下樣本隨機(jī)向量
的可能性难咕,而似然表達(dá)了給定樣本
下參數(shù)
(相對于另外的參數(shù)
)為真實值的可能性。我們總是對隨機(jī)變量的取值談概率距辆,而在非貝葉斯統(tǒng)計的角度下余佃,參數(shù)是一個實數(shù)而非隨機(jī)變量,所以我們一般不談一個參數(shù)的概率跨算。
2. 最大似然估計(Maximum Likelihood Estimation, MLE)
假設(shè)我們有一個非常復(fù)雜的數(shù)據(jù)分布爆土,但是我們不知道該分布的數(shù)學(xué)表達(dá)形式,所以我們需要定義一個分布模型
诸蚕,該分布由參數(shù)
決定步势。
我們的目標(biāo)是求得參數(shù)使得定義的分布
盡可能的接近
。
下面我們來看看最大似然估計如何操作:
- 從
中采集m個樣本
- 計算樣本的似然函數(shù)
- 求使得似然函數(shù)
最大的參數(shù)
:
當(dāng)來自的樣本
在
分布模型出現(xiàn)的概率越高背犯,也就是
越大坏瘩,
和
越接近。[3]
3. 對數(shù)似然
在知道了最大似然估計之后就容易理解對數(shù)似然了漠魏。從公式可以看到倔矾,似然函數(shù)是很多個數(shù)相乘的形式:。
然而很多數(shù)相乘并不容易計算柱锹,也不方便求導(dǎo)哪自。如果我們對它取對數(shù),連乘就會變成連加禁熏,計算起來要方便的多壤巷,求導(dǎo)也變得更加容易。
這樣一來就變成了我們非常熟悉的求極值過程匹层,為自變量隙笆,我們需要找到某一個
锌蓄,使得
最大升筏。只需對
求導(dǎo)然后令導(dǎo)數(shù)等于0即可。
最大似然估計的一般步驟如下:
(1) 寫出似然函數(shù);
(2) 對似然函數(shù)取對數(shù),得到對數(shù)似然函數(shù);
(3) 求對數(shù)似然函數(shù)的關(guān)于參數(shù)組的偏導(dǎo)數(shù),并令其為0,得到似然方程組;
(4) 解似然方程組,得到參數(shù)組的值瘸爽。
4. 負(fù)對數(shù)似然(Negative log-likelihood, NLL)[1]
由于對數(shù)似然是對概率分布求對數(shù)您访,概率的值為
區(qū)間,取對數(shù)后為
區(qū)間剪决。再在前面加個符號灵汪,變成
區(qū)間檀训。
寫到這你有沒有發(fā)現(xiàn),這個公式不就是交叉熵嗎享言?只是少了一項峻凫,但是真實標(biāo)簽的概率為1,所以省掉了览露。
關(guān)于交叉熵的理解可以參考我的另一篇博客荧琼。
我們期望似然估計越大越好,取完負(fù)號之后就是負(fù)對數(shù)似然越小越好差牛,因此負(fù)對數(shù)似然函數(shù)可以作為損失函數(shù)命锄。
Pytorch中對應(yīng)的負(fù)對數(shù)似然損失函數(shù)為:
torch.nn.NLLLoss(weight=None, size_average=None, ignore_index=-100, reduce=None, reduction='mean')
值得注意的是,在使用該損失函數(shù)的時候并不需要將標(biāo)簽轉(zhuǎn)換成one-hot形式偏化,c類標(biāo)簽脐恩,就用c-1個數(shù)表示即可。
輸入與輸出數(shù)據(jù)的形狀:
- input: (N,C)
- output:(N)
其中N為batch size侦讨,C為分類數(shù)量驶冒。假設(shè)batch size為3,有5個類別搭伤。我們用一段代碼看看torch.nn.NLLLoss()
如何使用:
>>> import torch
>>> m = torch.nn.LogSoftmax(dim=1)
>>> loss = torch.nn.NLLLoss()
>>> input = torch.randn(3,5,requires_grad=True)
>>> input
tensor([[ 0.1076, -1.4376, -0.6307, 0.6451, -1.5122],
[ 1.5105, 0.7662, -1.7587, -1.4581, 1.1357],
[-1.4673, -0.5111, -0.0779, -0.7404, 1.4447]], requires_grad=True)
>>> target = torch.tensor([1, 0, 4])
>>> output = loss(m(input), target)
>>> output.backward()
計算結(jié)果為:
tensor(1.3537)
實際上這段代碼計算的是交叉熵只怎,因為在pytorch交叉熵的官方文檔中寫道[4]:
This criterion (CrossEntropyLoss) combines
LogSoftmax
andNLLLoss
in one single class.
它先將輸入經(jīng)過log softmax函數(shù),得到一個輸出:
>>> data = nn.LogSoftmax(dim=1)(input)
>>> data
tensor([[-1.2812, -2.8264, -2.0195, -0.7437, -2.9010],
[-0.8118, -1.5561, -4.0810, -3.7804, -1.1866],
[-3.3349, -2.3787, -1.9455, -2.6080, -0.4229]])
然后根據(jù)負(fù)對數(shù)似然估計的公式怜俐,得到如下等式:
和函數(shù)計算結(jié)果相同身堡。
值得注意的是,nn.NLLLoss()
函數(shù)雖然叫負(fù)對數(shù)似然損失函數(shù)拍鲤,但是該函數(shù)內(nèi)部并沒有像公式里那樣進(jìn)行了對數(shù)計算贴谎,而是在激活函數(shù)上使用了nn.LogSoftmax()
函數(shù),所以nn.NLLLoss()
函數(shù)只是做了求和取平均然后再取反的計算季稳,在使用時要配合logsoftmax函數(shù)一起使用擅这,或者直接使用交叉熵?fù)p失函數(shù)。