似然(likelihood)和NLLLoss
博主在學習的過程中,一直看到負對數似然函數(NLLLoss,negative log likelihood loss),雖然知道怎么計算,但是一直不清楚為什么叫似然。今天通過學習對似然和機器學習模型訓練有了全新的理解,故記錄在此。
本文主要參考:似然(likelihood)和概率(probability)的區別與聯系
1. 交叉熵(CrossEntropyLoss)和NLLLoss的聯系
CrossEntropy的定義:
分類任務中總共有\(C\)個類,對于一個輸入樣本\(x\),一個模型預測的概率分布為\(y=(y_1, y_2, \cdots y_C)\),其中\(y_1+y_2+\cdots +y_C=1\),\(y_i\)表示取到類別\(i\)的概率。如果\(x\)的真實類別是\(k\),那么他的真實類別分布就是:\(t=(0,0,\cdots, 1, \cdots,0)\),只有第\(k\)個類別對應的概率是1,其他的都是0。交叉熵的計算公式是:
這里\(t_i\)是類別\(i\)的真實概率,而又因為真實概率只有一個是1,其他都是0,所有就可以簡化為:
在pytorch計算中,CrossEntropyLoss = softmax + log + NLLLoss
我的問題就來了
一般NLL被稱為負對數似然,這樣推算下來,對數是log,NLL就是從log_softmax的結果中找到正確概率并取了個負號,那只能是softmax是似然,為什么softmax被稱為似然呢?softmax不是把模型輸出轉換為概率嗎?怎么叫似然呢?
這里就引出了“似然”和“概率”的問題。
2. 似然是什么
最大似然是,給定一個觀測值\(X\),要找到分布的參數\(\theta\)的一個取值\(\theta_0\),使得此時該分布中采樣的結果是\(X\)的可能性最大。
在上面引用的文章中,就對這個有很好的解釋,我直接引用過來
有一個硬幣,它有\(\theta\)的概率會正面向上,有\(1-\theta\)的概率反面向上。\(\theta\)是存在的,但是你不知道它是多少。
為了獲得\(\theta\)的值,你做了一個實驗:將硬幣拋10次,得到了一個正反序列:\(x = HHTTHTHHHH\) 。無論\(\theta\)的值是多少,這個序列的概率值為 \(\theta?\theta?(1-\theta)?(1-\theta)?\theta?(1-\theta)?\theta?\theta?\theta?\theta = \theta^7 (1-\theta)^3\)
比如,如果\(\theta\)值為0,則得到這個序列的概率值為0。如果\(\theta\)值為1/2,概率值為1/1024。但是,我們應該得到一個更大的概率值,所以我們嘗試了所有θ可取的值,畫出了下圖:

這個曲線就是θ的似然函數,通過了解在某一假設下,已知數據發生的可能性,來評價哪一個假設更接近θ的真實值。
如圖所示,最有可能的假設是在θ=0.7的時候取到。但是,你無須得出最終的結論θ=0.7。事實上,根據貝葉斯法則,0.7是一個不太可能的取值(如果你知道幾乎所有的硬幣都是均質的,那么這個實驗并沒有提供足夠的證據來說服你,它是均質的)。但是,0.7卻是最大似然估計的取值。因為這里僅僅試驗了一次,得到的樣本太少,所以最終求出的最大似然值偏差較大,如果經過多次試驗,擴充樣本空間,
則最終求得的最大似然估計將接近真實值0.5。
3. 深度學習模型和似然的關系
我們把語言模型視為一個分布,語言模型生成文字的過程就是從這個分布中采樣的過程,模型的參數就是分布的參數,而你現在有的正常的訓練用的語料就是觀測值\(X\),你希望找到一個最合適的\(\theta\),使得模型生成\(X\)的概率最大,而這個概率,就是模型最后一層輸出的logits再經過softmax后的結果。所以softmax后的結果又被稱為似然,它表示的就是當前參數的似然函數,訓練的目的就是通過調整自變量\(\theta\),使得這個似然函數值最大。
而損失函數一般是越小越好,所以,給softmax后的結果又加了個log,并取負數。取log主要是對優化有點好處,讓模型在似然函數值小的地方快速優化,而取負數可以把最大化變成最小化問題。

浙公網安備 33010602011771號