形式一樣,推導過程與代表意義不同
from: https://zhuanlan.zhihu.com/p/27719875
在我重新抱起概率統計的課本之前,我一直都不清楚似然函數為什么是那樣子的,只知道照着公式敲代碼(那時候還沒有tensorflow),於是出過各種糗:
“啊?似然函數不就是交叉熵嗎?”
“機器學習中的似然函數怎么看起來跟概率統計課本里的不一樣呢?”
“學長學長,我把這個model的輸出接上交叉熵后怎么報錯了?”

“似然函數”名字的意義已經在以前的多篇文章中提過了,更通用的定義來說,似然函數就是衡量當前模型參數對於已知樣本集的解釋情況,通用的表現形式如下:注意!似然函數的定義當然沒有限定樣本集X的分布函數。這樣來看似然函數的話很抽象,不知道實際中如何去用。所以我們把問題縮小一下啦。
比如,我們將似然函數作為機器學習模型的損失函數,並且用在分類問題中。
這時,似然函數是直接作用於模型的輸出的(損失函數就是為了衡量當前參數下model的預測值predict距離真實值label的大小,所以似然函數用作損失函數時當然也是為了完成該任務),所以對於似然函數來說,這里的樣本集就成了label集(而不是機器學習意義上的樣本集X了),這里的參數也不是機器學習model 的參數,而是predict值!(哈?是不是覺得搞siao了~屏住呼吸,慢慢來)
其實作為損失函數的似然函數並不關心你當前的機器學習model的參數是怎樣的,畢竟它此時所接收的輸入只有兩部分:1、predict。2、label。當然還有一個隱含的輸入——3、分布模型。
顯然這里的label就是似然函數手里的觀測值,也就是它眼里的樣本集。而它眼里的模型,當然就是predict這個隨機變量所服從的概率分布模型。它的目的,就是衡量predict背后的模型對於當前觀測值的解釋程度。而每個樣本的predict值,恰恰就是它所服從的分布模型的參數。(好啦,給你1小時的時間理解一下加粗的這幾句話,如果理解不了,看下面這個栗子吧)
比如此時我們的機器學習任務是一個4個類別的分類任務,機器學習model的輸出就是當前樣本X下的每個類別的概率,如predict=[0.1, 0.1, 0.7, 0.1],而該樣本的標簽是類別3,表示成向量就是label=[0, 0, 1, 0]。那么label=[0, 0, 1, 0]就是似然函數眼里的樣本,然后我們可以假設predict這個隨機變量背后的模型是單次觀測下的多項式分布,為什么呢?

在談多項式分布前,先講一下二項(式)分布。
在講二項分布前,先講一下貝努利分布。
貝努利分布也叫兩點分布。貝努利分布可以看成是將一枚硬幣(只有正反兩個面,代表兩個類別)向上扔出,出現某個面(類別)的概率情況,因此其概率密度函數為:

一定要好好體會中間這個 !!!這是理解似然函數做損失函數的關鍵!另外,貝努利分布的模型參數就是其中一個類別的發生概率。
而二項分布呢,就是將貝努利實驗重復n次(各次實驗之間是相互獨立的)。
而多項式分布呢,就是將二項分布推廣到多個面(類別)。
所以,單次觀測下的多項式分布就是貝努利分布的多類推廣!即:
其中,C代表類別數。p代表向量形式的模型參數,即各個類別的發生概率,如p=[0.1, 0.1, 0.7, 0.1],則p1=0.1, p3=0.7等。即,多項式分布的模型參數就是各個類別的發生概率!x代表one-hot形式的觀測值,如x=類別3,則x=[0, 0, 1, 0]。xi代表x的第i個元素,比如x=類別3時,x1=0,x2=0,x3=1,x4=0。
好了,聰明的你如果能把這個單次觀測下的多項式分布的表達式理解了,那么你就完成80%的理解任務了。
想一下,機器學習model對某個樣本的輸出,就代表各個類別發生的概率。但是,對於當前這一個樣本而言,它肯定只能有一個類別,所以這一個樣本就可以看成是一次實驗(觀察),而這次實驗(觀察)的結果要服從上述各個類別發生的概率,那不就是服從多項式分布嘛!而且是單次觀察!各個類別發生的概率predict當然就是這個多項式分布的參數阿。
好了,建模完成了,小總結一下:
對於多類分類問題,似然函數就是衡量當前這個以predict為參數的單次觀測下的多項式分布模型與樣本值label之間的似然度。

所以,根據似然函數的定義,單個樣本的似然函數即:
所以,整個樣本集(或者一個batch)的似然函數即:
(感謝評論區 耐心指出這里的錯誤。之前寫成了累加,一直理解錯了。今天突然想起來這篇文章好像有讀者指出過錯誤,回來一細想果然錯了!原錯誤公式為,關於該公式為什么錯了請見評論區置頂評論。)
看~這就是廬山真面目了。而由於式子里有累乘運算,所以習慣性的加個log函數來將累乘化成累加以提高運算速度(雖然對於每個樣本來說只有一個類別,但是哪怕是算0.2^0也是算了一遍指數函數啊,計算機可不會直接口算出1)。所以在累乘號前面加上log函數后,就成了所謂的對數似然函數:
而最大化對數似然函數就等效於最小化負對數似然函數,所以前面加個負號后不就是我們平常照着敲的公式嘛。。。
而這個形式跟交叉熵的形式是一模一樣的:
對於某種分布的隨機變量X~p(x), 有一個模型q(x)用於近似p(x)的概率分布,則分布X與模型q之間的交叉熵即:
這里X的分布模型即樣本集label的真實分布模型,這里模型q(x)即想要模擬真實分布模型的機器學習模型。可以說交叉熵是直接衡量兩個分布,或者說兩個model之間的差異。而似然函數則是解釋以model的輸出為參數的某分布模型對樣本集的解釋程度。因此,可以說這兩者是“同貌不同源”,但是“殊途同歸”啦。
當然,補充一句無關的話,在將負對數似然/交叉熵拿來做損失函數的時候,不要忘記對batch取average,這樣算出來的才是期望(直接套公式出來的是sum版)。
over。

算了,再送點贈品好了~
同樣的道理,使用似然函數作為損失函數時,多於多類的情況,很自然的建模出了單次觀測下的多項式分布,那么二類情況呢?當然就是前面已經講過的貝努利分布啦~快點把貝努利分布的概率密度函數帶進去試試吧~是不是突然發現,二類分類器邏輯回歸的損失函數“pia”的一下就出來啦~
本文轉載自【夕小瑤的賣萌屋】,聽說每一個想學機器學習的人到這里都停不下來了~