Gibbs Sampling是用來進行參數學習的一種重要手段,而對於這部分知識的學習並不是一個簡單的過程,有很多人都是淺嘗輒止,沒有了解它的本質,本篇文章將爲您講解Gibbs Sampling的基本策略。
Some background
現在有一枚硬幣,你拋擲10次這枚硬幣,這時候,拋擲的結果是HHHHTTTTTT,這時候要你猜這枚硬幣拋擲後出現正面的概率是多大,也許你會很自然的說,當然是0.4,是的,我也很同意你的說法,爲什麼呢?
假設這枚硬幣出現正面的概率是p,於是
,也就是說我們可以計算在概率p設定的情況下的數據出現的概率。現在要使這個概率達到最大值,自然是要對其求導,使得導數爲0的p值就是我們要求的值。現在計算結果就是0.4,這個其實就是MLE的思想,也就是最大似然估計法。
學過機器學習的人應該都知道,最大似然估計很多時候會過擬合,於是想出了一種其他的估計參數的方法,添加先驗知識。具體的策略就是使用貝葉斯公式
這裏的是似然值,是先驗值,這兩者的乘積就是後驗概率,而使得後驗概率達到最大值的參數估計就是MAP估計。
使用MAP對一個新數據進行估計,公式如下:
使用MLE或者MAP都是在某種程度上使用一種猜測的最好的參數,但是這種只依賴於單個猜測的參數會丟失很多的信息,如果我們將整個後驗分佈都考慮到估計模型中,那麼這些信息就不會丟失,這比只使用單個參數的估計理論上是要更優的。
於是新的估計公式如下:
在新的預測公式中,我們使用了整個後驗分佈,使用了期望。使用整個後驗可以提升我們預測的準確性。在新的估計公式中,我們可以看到的估計也是一個問題,顯然它不是一個已知量,使用全概率公式和貝葉斯公式,可以得到:
上面的兩個公式中的計算非常複雜的,如果直接按照公式中的方法來實現預測,根本就是不可能的。於是出現了採樣,而採樣的最終目標是希望能夠過保證樣本的分佈和真實的分佈儘可能的接近。而Gibbs Sampling就是這樣的一種能夠儘量保持真實分佈的採樣策略。至於爲什麼Gibbs Sampling能夠儘量的保證採樣結果符合真實的分佈,這是一個大的問題,以後有時間我會專門寫一篇文章介紹MCMC的知識,以及MCMC與Gibbs Sampling之間的關係。
關於MCMC,在這裏舉一個簡單的例子:例如求的策略,假設現在有一個邊長爲d的正方形,它們的邊長爲d,在這個正方形裏面有一個直徑爲d的圓,現在我們通過採樣的方法來求得的值。現在均勻的往正方形中撒豆子,有一部分豆子會落在圓內部,其他一部分會落在圓外部,假設圓內部的豆子的個數爲C,在正方形內部的豆子的個數爲D,那麼顯然可以得到如下的計算公式,
這個是在假設落在圓形內部的豆子的個數的與落在正方形內部的豆子的個數的比例是它們兩個的面積的比例。於是的求解就可以變得很輕鬆了。
我們再舉一個比較有意思的例子。假設有一個概率分佈p(z),它的分佈信息如圖所示,現在存在一條曲線f(z),那麼如何估算這條曲線的對應的期望值呢?
期望計算方式如下:
現在我們想要使用採樣的方法來求取這個期望值,我們按照p(z)進行對z的採樣,於是我們就可以將公式進行如下的轉換。
上面的公式是存在一個問題,概率值不見了,但是經過分析你就會發現其實概率值以及轉換到其他的計算因子中了。假設z出現了count(z)次,那麼在該計算公式中就應該可以得到它的概率值爲:
基於上面的論述,我們以及完成了對一次採樣求期望的過程。這個也是MCMC的一個最基本的策略描述。
Gibbs Sampling
在接下來的文章中,我會講解一個使用Gibbs Sampling 進行採樣的方法,使用這個方法進行樸素貝葉斯公式中的參數的學習。
Gibbs Sampling for Naive Bayes Model
是一個伯努力分佈,它的先驗應該是個Beta分佈,而詞彙概率是一個多項式分佈,利用共軛的先驗的原則,我們就認爲是符合Dirichlet 分佈。
Gibbs Sampling 是需要儘可能的遍歷空間中的所有的點,在採樣的過程中將每一個參數當作一個維度,然後在已知其他維度的時候對其中一維進行採樣,在樸素貝葉斯的學習過程中會涉及如下的變量。
1 二項分佈的概率分佈
2 每個類對應的多項式分佈
3 以及每一篇文檔的類別
在介紹Gibbs Sampling的過程中我們已經講述了,主要是使用其他維度的信息對其他一維進行採樣,我們可以看到在採樣的時候我們使用的公式,分子分母都使用了聯合概率,分子和分母的信息的差別非常的小,分子是所有維度的聯合概率,而分母則是去除了需要採樣的維度之後剩餘的其他維度的聯合分佈。
式子中的先驗符合Beta分佈,所以它的計算公式如下:
前面的常熟項是用來進行歸一化的,使得概率之和爲1。如果去除常數項的話,我們可以得到近似的公式:
第二個因子是利用通過二項式分佈進行採樣,生成N個類別標記。
第五第六個因子是詞彙採樣過程,也就是依據選中的文檔的標籤和詞彙的分佈概率生成詞彙,進而生成文章,文章的生成過程可以使用如下的公式描述:
同理對於使用Dericelet作爲多項式分佈的先驗概率也是如出一轍,也同樣獲得一致的效果
上面的式子都沒有使用等號因爲,這只是一個去除了歸一化項之後的計算公式,第一個後驗分佈
是一個Beta分佈,它的參數是(),第二個後項分佈是Dericelet分佈,它的參數是()。
最後面總結所有的分佈的聯合概率如下。
Integrating out
爲了更好的去除一些沒有參數的學習過程,我們可以將一些比較容易Integrateout的參數進行Integrateout處理。也就是對其進行積分。
上面的這個式子就是就是對參數c的Integrateout的過程。很自然的我們就可以想到對參數的Intgrate
out的過程如下:
其中我們將與無關的因子都放到了積分的外面,然後對裏面的式子進行積分。
至於積分的計算過程,我就不做過多的解釋了,因爲還是相對比較簡單的。最後面我們的聯合概率公式就可以表示如下:
率有了上面的簡化後的聯合概之後我們就可以開始進行Gibbs Sampling了。
Building the Gibbs Sampler
Gibbs Sampling 的定義就是,以其他維度的信息爲條件,對另外一維進行採樣。思路非常的簡單。
假設現在我們要對第一文檔的標籤類別進行採樣,那麼我們的採樣概率應該是一個條件概率,而條件部分的信息就是其他其他的所有問的標籤信息,文檔信息,不同類別的詞彙分佈概率信息,還有超參數信息也就是先驗信息。我們再依次對L2,L3進行採樣。現在最重要的問題就是如何求取這些條件概率。
在開始每一次採樣的過程中,我們都會知道一些信息,這些信息包括每篇文檔的單詞的數量,標記爲0和比較爲1 的文檔的數量,所有單詞在標記爲(0或1)中的數量,每一篇文檔的類別標籤,以及當前的和的數值。當對一篇文檔的標籤進行採樣的時候我們需要暫時的將所有的該篇文檔的信息隱藏,包括該篇文檔中的各個詞彙的數量,以及該篇文檔的類別標籤。然後我們分別獲取該篇文檔類別爲0和該篇文檔類別爲1的概率。同樣的我們可以對和進行採樣。
對文檔類別標籤進行採樣
根據上面的公式我們知道,對文檔類別標籤的概率是一個條件概率,根據條件概率的定義,我們可以將條件概率進行如下的轉換。
可以看到這些都是Gamma函數,看到這些討厭的Gamma分佈,我想每個人可能都會覺得很無奈,但是我們就要很快的擺脫它們了。
於是上面的式子可以進行如下的轉換
使用同樣的方法我們可以得到最後一個因子的分子與分母之比,還是處於分子分母的不同之處進行考慮。
最後一個因子的式子如上所示,其中代表的是這個單詞在類別爲0中的文檔中出現的總次數;代表的是這個單詞在類別爲0中的文檔中出現的總次數。去除當前文檔中的所有的信息之後的詞彙總次數。最後面的分子與分母相除的結果如下。
約去公共的部分,我們得到的結果如下所示;也就是漁區公共部分之後只剩下該片文檔的詞彙信息了。
到現在爲止,我們已經將所有的因子的計算表達式都已經得到了,最後的採樣概率計算如下,分別對該文檔屬於0的概率和該文檔的概率爲1進行採樣。
其中Lj可以取0或者1。至此我們就獲得了概率分佈的計算。接下來就是採樣了。
1 計算Lj爲0的概率爲value0
2計算Lj爲0的概率爲value1
3 概率分佈爲<value0/(value0+value1),value1/(value0+value1)>
4 根據分佈進行採樣。
對於和的採樣時類似的過程,所以在這裏就不在做過多的說明了。
有空我會把我實現的Gibbs Sampling for Naïve Bayes的代碼貼上來,敬請關注。