天天看點

機器學習(二)-樸素的貝葉斯分類

分詞的代碼:http://www.cnblogs.com/phinecos/archive/2008/10/21/1316044.html

0. 前言

這是一篇關于貝葉斯方法的科普文,我會盡量少用公式,多用平白的語言叙述,多舉實際例子。更嚴格的公式和計算我會在相應的地方注明參考資料。貝葉斯方法被證明是非常 general 且強大的推理架構,文中你會看到很多有趣的應用。

1. 曆史

托馬斯·貝葉斯(Thomas Bayes)同學的詳細生平在這裡。以下摘一段 wikipedia 上的簡介:

所謂的貝葉斯方法源于他生前為解決一個“逆概”問題寫的一篇文章,而這篇文章是在他死後才由他的一位朋友發表出來的。在貝葉斯寫這篇文章之前,人們已經能夠計算“正向機率”,如“假設袋子裡面有N個白球,M個黑球,你伸手進去摸一把,摸出黑球的機率是多大”。而一個自然而然的問題是反過來:“如果我們事先并不知道袋子裡面黑白球的比例,而是閉着眼睛摸出一個(或好幾個)球,觀察這些取出來的球的顔色之後,那麼我們可以就此對袋子裡面的黑白球的比例作出什麼樣的推測”。這個問題,就是所謂的逆概問題。

實際上,貝葉斯當時的論文隻是對這個問題的一個直接的求解嘗試,并不清楚他當時是不是已經意識到這裡面包含着的深刻的思想。然而後來,貝葉斯方法席卷了機率論,并将應用延伸到各個問題領域,所有需要作出機率預測的地方都可以見到貝葉斯方法的影子,特别地,貝葉斯是機器學習的核心方法之一。這背後的深刻原因在于,現實世界本身就是不确定的,人類的觀察能力是有局限性的(否則有很大一部分科學就沒有必要做了——設想我們能夠直接觀察到電子的運作,還需要對原子模型争吵不休嗎?),我們日常所觀察到的隻是事物表面上的結果,沿用剛才那個袋子裡面取球的比方,我們往往隻能知道從裡面取出來的球是什麼顔色,而并不能直接看到袋子裡面實際的情況。這個時候,我們就需要提供一個猜測(hypothesis,更為嚴格的說法是“假設”,這裡用“猜測”更通俗易懂一點),所謂猜測,當然就是不确定的(很可能有好多種乃至無數種猜測都能滿足目前的觀測),但也絕對不是兩眼一抹黑瞎蒙——具體地說,我們需要做兩件事情:1. 算出各種不同猜測的可能性大小。2. 算出最靠譜的猜測是什麼。第一個就是計算特定猜測的後驗機率,對于連續的猜測空間則是計算猜測的機率密度函數。第二個則是所謂的模型比較,模型比較如果不考慮先驗機率的話就是最大似然方法。

1.1 一個例子:自然語言的二義性

下面舉一個自然語言的不确定性的例子。當你看到這句話:

The girl saw the boy with a telescope.

你對這句話的含義有什麼猜測?平常人肯定會說:那個女孩拿望遠鏡看見了那個男孩(即你對這個句子背後的實際文法結構的猜測是:The girl saw-with-a-telescope the boy )。然而,仔細一想,你會發現這個句子完全可以解釋成:那個女孩看見了那個拿着望遠鏡的男孩(即:The girl saw the-boy-with-a-telescope )。那為什麼平常生活中我們每個人都能夠迅速地對這種二義性進行消解呢?這背後到底隐藏着什麼樣的思維法則?我們留到後面解釋。

1.2 貝葉斯公式

貝葉斯公式是怎麼來的?

我們還是使用 wikipedia 上的一個例子:

一所學校裡面有 60% 的男生,40% 的女生。男生總是穿長褲,女生則一半穿長褲一半穿裙子。有了這些資訊之後我們可以容易地計算“随機選取一個學生,他(她)穿長褲的機率和穿裙子的機率是多大”,這個就是前面說的“正向機率”的計算。然而,假設你走在校園中,迎面走來一個穿長褲的學生(很不幸的是你高度近似,你隻看得見他(她)穿的是否長褲,而無法确定他(她)的性别),你能夠推斷出他(她)是男生的機率是多大嗎?

一些認知科學的研究表明(《決策與判斷》以及《Rationality for Mortals》第12章:小孩也可以解決貝葉斯問題),我們對形式化的貝葉斯問題不擅長,但對于以頻率形式呈現的等價問題卻很擅長。在這裡,我們不妨把問題重新叙述成:你在校園裡面随機遊走,遇到了 N 個穿長褲的人(仍然假設你無法直接觀察到他們的性别),問這 N 個人裡面有多少個女生多少個男生。

你說,這還不簡單:算出學校裡面有多少穿長褲的,然後在這些人裡面再算出有多少女生,不就行了?

我們來算一算:假設學校裡面人的總數是 U 個。60% 的男生都穿長褲,于是我們得到了 U * P(Boy) * P(Pants|Boy) 個穿長褲的(男生)(其中 P(Boy) 是男生的機率 = 60%,這裡可以簡單的了解為男生的比例;P(Pants|Boy) 是條件機率,即在 Boy 這個條件下穿長褲的機率是多大,這裡是 100% ,因為所有男生都穿長褲)。40% 的女生裡面又有一半(50%)是穿長褲的,于是我們又得到了 U * P(Girl) * P(Pants|Girl) 個穿長褲的(女生)。加起來一共是 U * P(Boy) * P(Pants|Boy) + U * P(Girl) * P(Pants|Girl) 個穿長褲的,其中有 U * P(Girl) * P(Pants|Girl) 個女生。兩者一比就是你要求的答案。

下面我們把這個答案形式化一下:我們要求的是 P(Girl|Pants) (穿長褲的人裡面有多少女生),我們計算的結果是 U * P(Girl) * P(Pants|Girl) / [U * P(Boy) * P(Pants|Boy) + U * P(Girl) * P(Pants|Girl)] 。容易發現這裡校園内人的總數是無關的,可以消去。于是得到

P(Girl|Pants) = P(Girl) * P(Pants|Girl) / [P(Boy) * P(Pants|Boy) + P(Girl) * P(Pants|Girl)]

注意,如果把上式收縮起來,分母其實就是 P(Pants) ,分子其實就是 P(Pants, Girl) 。而這個比例很自然地就讀作:在穿長褲的人( P(Pants) )裡面有多少(穿長褲)的女孩( P(Pants, Girl) )。

上式中的 Pants 和 Boy/Girl 可以指代一切東西,是以其一般形式就是:

P(B|A) = P(A|B) * P(B) / [P(A|B) * P(B) + P(A|~B) * P(~B) ]

收縮起來就是:

P(B|A) = P(AB) / P(A)

其實這個就等于:

P(B|A) * P(A) = P(AB)

難怪拉普拉斯說機率論隻是把常識用數學公式表達了出來。

然而,後面我們會逐漸發現,看似這麼平凡的貝葉斯公式,背後卻隐含着非常深刻的原理。

舉個簡單的例子,讓大家對這個算法的原理有個快速的認識。(注:這個示例摘抄自《機器學習》這本書的第三章的表3-2.)

假設給定了如下訓練樣本資料,我們學習的目标是根據給定的天氣狀況判斷你對PlayTennis這個請求的回答是Yes還是No。

Day Outlook Temperature Humidity Wind PlayTennis
D1 Sunny Hot High Weak No
D2 Sunny Hot High Strong No
D3 Overcast Hot High Weak Yes
D4 Rain Mild High Weak Yes
D5 Rain Cool Normal Weak Yes
D6 Rain Cool Normal Strong No
D7 Overcast Cool Normal Strong Yes
D8 Sunny Mild High Weak No
D9 Sunny Cool Normal Weak Yes
D10 Rain Mild Normal Weak Yes
D11 Sunny Mild Normal Strong Yes
D12 Overcast Mild High Strong Yes
D13 Overcast Hot Normal Weak Yes
D14 Rain Mild High Strong No

 可以看到這裡樣本資料集提供了14個訓練樣本,我們将使用此表的資料,并結合樸素貝葉斯分類器來分類下面的新執行個體:

(Outlook = sunny,Temprature = cool,Humidity = high,Wind = strong)

我們的任務就是對此新執行個體預測目标概念PlayTennis的目标值(yes或no).

由上面的公式可以得到:

機器學習(二)-樸素的貝葉斯分類

可以得到:

      P(PlayTennis =yes) = 9/14 = 0.64,P(PlayTennis=no)=5/14 = 0.36

      P(Wind=Stong| PlayTennis =yes)=3/9=0.33,p(Wind=Stong| PlayTennis =no)=3/5 = 0.6

其他資料類似可得,代入後得到:

P(yes)P(Sunny|yes)P(Cool|yes)P(high|yes)P(Strong|yes) = 0.0053

P(no)P(Sunny|no)P(Cool|no)P(high|no)P(Strong|no)=0.0206

是以應該分類到no這一類中。

1.3貝葉斯推斷

貝葉斯推斷(Bayesian inference)是一種統計學方法,用來估計統計量的某種性質。

它是貝葉斯定理(Bayes' theorem)的應用。英國數學家托馬斯·貝葉斯(Thomas Bayes)在1763年發表的一篇論文中,首先提出了這個定理。

貝葉斯推斷與其他統計學推斷方法截然不同。它建立在主觀判斷的基礎上,也就是說,你可以不需要客觀證據,先估計一個值,然後根據實際結果不斷修正。正是因為它的主觀性太強,曾經遭到許多統計學家的诟病。

貝葉斯推斷需要大量的計算,是以曆史上很長一段時間,無法得到廣泛應用。隻有計算機誕生以後,它才獲得真正的重視。人們發現,許多統計量是無法事先進行客觀判斷的,而網際網路時代出現的大型資料集,再加上高速運算能力,為驗證這些統計量提供了友善,也為應用貝葉斯推斷創造了條件,它的威力正在日益顯現。

貝葉斯定理推論

要了解貝葉斯推斷,必須先了解貝葉斯定理。後者實際上就是計算"條件機率"的公式。

所謂"條件機率"(Conditional probability),就是指在事件B發生的情況下,事件A發生的機率,用P(A|B)來表示。

機器學習(二)-樸素的貝葉斯分類

根據文氏圖,可以很清楚地看到在事件B發生的情況下,事件A發生的機率就是P(A∩B)除以P(B)。

機器學習(二)-樸素的貝葉斯分類

是以,

機器學習(二)-樸素的貝葉斯分類

同理可得,

機器學習(二)-樸素的貝葉斯分類

是以,

機器學習(二)-樸素的貝葉斯分類

機器學習(二)-樸素的貝葉斯分類

這就是條件機率的計算公式。

全機率公式

由于後面要用到,是以除了條件機率以外,這裡還要推導全機率公式。

假定樣本空間S,是兩個事件A與A'的和。

機器學習(二)-樸素的貝葉斯分類

上圖中,紅色部分是事件A,綠色部分是事件A',它們共同構成了樣本空間S。

在這種情況下,事件B可以劃分成兩個部分。

機器學習(二)-樸素的貝葉斯分類

機器學習(二)-樸素的貝葉斯分類

在上一節的推導當中,我們已知

機器學習(二)-樸素的貝葉斯分類

是以,

機器學習(二)-樸素的貝葉斯分類

這就是全機率公式。它的含義是,如果A和A'構成樣本空間的一個劃分,那麼事件B的機率,就等于A和A'的機率分别乘以B對這兩個事件的條件機率之和。

将這個公式代入上一節的條件機率公式,就得到了條件機率的另一種寫法:

機器學習(二)-樸素的貝葉斯分類

貝葉斯推斷的含義

對條件機率公式進行變形,可以得到如下形式:

機器學習(二)-樸素的貝葉斯分類

我們把P(A)稱為"先驗機率"(Prior probability),即在B事件發生之前,我們對A事件機率的一個判斷。P(A|B)稱為"後驗機率"(Posterior probability),即在B事件發生之後,我們對A事件機率的重新評估。P(B|A)/P(B)稱為"可能性函數"(Likelyhood),這是一個調整因子,使得預估機率更接近真實機率。

是以,條件機率可以了解成下面的式子:

  後驗機率 = 先驗機率 x 調整因子

這就是貝葉斯推斷的含義。我們先預估一個"先驗機率",然後加入實驗結果,看這個實驗到底是增強還是削弱了"先驗機率",由此得到更接近事實的"後驗機率"。

在這裡,如果"可能性函數"P(B|A)/P(B)>1,意味着"先驗機率"被增強,事件A的發生的可能性變大;如果"可能性函數"=1,意味着B事件無助于判斷事件A的可能性;如果"可能性函數"<1,意味着"先驗機率"被削弱,事件A的可能性變小。

【例子】水果糖問題

為了加深對貝葉斯推斷的了解,我們看兩個例子。

機器學習(二)-樸素的貝葉斯分類

第一個例子。兩個一模一樣的碗,一号碗有30顆水果糖和10顆巧克力糖,二号碗有水果糖和巧克力糖各20顆。現在随機選擇一個碗,從中摸出一顆糖,發現是水果糖。請問這顆水果糖來自一号碗的機率有多大?

我們假定,H1表示一号碗,H2表示二号碗。由于這兩個碗是一樣的,是以P(H1)=P(H2),也就是說,在取出水果糖之前,這兩個碗被選中的機率相同。是以,P(H1)=0.5,我們把這個機率就叫做"先驗機率",即沒有做實驗之前,來自一号碗的機率是0.5。

再假定,E表示水果糖,是以問題就變成了在已知E的情況下,來自一号碗的機率有多大,即求P(H1|E)。我們把這個機率叫做"後驗機率",即在E事件發生之後,對P(H1)的修正。

根據條件機率公式,得到

機器學習(二)-樸素的貝葉斯分類

已知,P(H1)等于0.5,P(E|H1)為一号碗中取出水果糖的機率,等于0.75,那麼求出P(E)就可以得到答案。根據全機率公式,

機器學習(二)-樸素的貝葉斯分類

是以,

機器學習(二)-樸素的貝葉斯分類

将數字代入原方程,得到

機器學習(二)-樸素的貝葉斯分類

這表明,來自一号碗的機率是0.6。也就是說,取出水果糖之後,H1事件的可能性得到了增強。

【例子】假陽性問題

第二個例子是一個醫學的常見問題,與現實生活關系緊密。

已知某種疾病的發病率是0.001,即1000人中會有1個人得病。現有一種試劑可以檢驗患者是否得病,它的準确率是0.99,即在患者确實得病的情況下,它有99%的可能呈現陽性。它的誤報率是5%,即在患者沒有得病的情況下,它有5%的可能呈現陽性。現有一個病人的檢驗結果為陽性,請問他确實得病的可能性有多大?

假定A事件表示得病,那麼P(A)為0.001。這就是"先驗機率",即沒有做試驗之前,我們預計的發病率。再假定B事件表示陽性,那麼要計算的就是P(A|B)。這就是"後驗機率",即做了試驗以後,對發病率的估計。

根據條件機率公式,

機器學習(二)-樸素的貝葉斯分類

用全機率公式改寫分母,

機器學習(二)-樸素的貝葉斯分類

将數字代入,

機器學習(二)-樸素的貝葉斯分類

我們得到了一個驚人的結果,P(A|B)約等于0.019。也就是說,即使檢驗呈現陽性,病人得病的機率,也隻是從0.1%增加到了2%左右。這就是所謂的"假陽性",即陽性結果完全不足以說明病人得病。

為什麼會這樣?為什麼這種檢驗的準确率高達99%,但是可信度卻不到2%?答案是與它的誤報率太高有關。(【習題】如果誤報率從5%降為1%,請問病人得病的機率會變成多少?)

有興趣的朋友,還可以算一下"假陰性"問題,即檢驗結果為陰性,但是病人确實得病的機率有多大。然後問自己,"假陽性"和"假陰性",哪一個才是醫學檢驗的主要風險?

2. 拼寫糾正

經典著作《人工智能:現代方法》的作者之一 Peter Norvig 曾經寫過一篇介紹如何寫一個拼寫檢查/糾正器的文章(原文在這裡,徐宥的翻譯版在這裡,這篇文章很深入淺出,強烈建議讀一讀),裡面用到的就是貝葉斯方法,這裡我們不打算複述他寫的文章,而是簡要地将其核心思想介紹一下。

首先,我們需要詢問的是:“問題是什麼?”

問題是我們看到使用者輸入了一個不在字典中的單詞,我們需要去猜測:“這個家夥到底真正想輸入的單詞是什麼呢?”用剛才我們形式化的語言來叙述就是,我們需要求:

P(我們猜測他想輸入的單詞 | 他實際輸入的單詞)

這個機率。并找出那個使得這個機率最大的猜測單詞。顯然,我們的猜測未必是唯一的,就像前面舉的那個自然語言的歧義性的例子一樣;這裡,比如使用者輸入: thew ,那麼他到底是想輸入 the ,還是想輸入 thaw ?到底哪個猜測可能性更大呢?幸運的是我們可以用貝葉斯公式來直接出它們各自的機率,我們不妨将我們的多個猜測記為 h1 h2 .. ( h 代表 hypothesis),它們都屬于一個有限且離散的猜測空間 H (單詞總共就那麼多而已),将使用者實際輸入的單詞記為 D ( D 代表 Data ,即觀測資料),于是

P(我們的猜測1 | 他實際輸入的單詞)

可以抽象地記為:

P(h1 | D)

類似地,對于我們的猜測2,則是 P(h2 | D)。不妨統一記為:

P(h | D)

運用一次貝葉斯公式,我們得到:

P(h | D) = P(h) * P(D | h) / P(D)

對于不同的具體猜測 h1 h2 h3 .. ,P(D) 都是一樣的,是以在比較 P(h1 | D) 和 P(h2 | D) 的時候我們可以忽略這個常數。即我們隻需要知道:

P(h | D) ∝ P(h) * P(D | h) (注:那個符号的意思是“正比例于”,不是無窮大,注意符号右端是有一個小缺口的。)

這個式子的抽象含義是:對于給定觀測資料,一個猜測是好是壞,取決于“這個猜測本身獨立的可能性大小(先驗機率,Prior )”和“這個猜測生成我們觀測到的資料的可能性大小”(似然,Likelihood )的乘積。具體到我們的那個 thew 例子上,含義就是,使用者實際是想輸入 the 的可能性大小取決于 the 本身在詞彙表中被使用的可能性(頻繁程度)大小(先驗機率)和 想打 the 卻打成 thew 的可能性大小(似然)的乘積。

下面的事情就很簡單了,對于我們猜測為可能的每個單詞計算一下 P(h) * P(D | h) 這個值,然後取最大的,得到的就是最靠譜的猜測。

一點注記:Norvig 的拼寫糾正器裡面隻提取了編輯距離為 2 以内的所有已知單詞。這是為了避免去周遊字典中每個單詞計算它們的 P(h) * P(D | h) ,但這種做法為了節省時間帶來了一些誤差。但話說回來難道我們人類真的回去周遊每個可能的單詞來計算他們的後驗機率嗎?不可能。實際上,根據認知神經科學的觀點,我們首先根據錯誤的單詞做一個 bottom-up 的關聯提取,提取出有可能是實際單詞的那些候選單詞,這個提取過程就是所謂的基于内容的提取,可以根據錯誤單詞的一些模式片段提取出有限的一組候選,非常快地縮小的搜尋空間(比如我輸入 explaination ,單詞裡面就有充分的資訊使得我們的大腦在常數時間内把可能性 narrow down 到 explanation 這個單詞上,至于具體是根據哪些線索——如音節——來提取,又是如何在生物神經網絡中實作這個提取機制的,目前還是一個沒有弄清的領域)。然後,我們對這有限的幾個猜測做一個 top-down 的預測,看看到底哪個對于觀測資料(即錯誤單詞)的預測效力最好,而如何衡量預測效率則就是用貝葉斯公式裡面的那個 P(h) * P(D | h) 了——雖然我們很可能使用了一些啟發法來簡化計算。後面我們還會提到這樣的 bottom-up 的關聯提取。

3. 模型比較與奧卡姆剃刀

3.1 再訪拼寫糾正

介紹了貝葉斯拼寫糾正之後,接下來的一個自然而然的問題就來了:“為什麼?”為什麼要用貝葉斯公式?為什麼貝葉斯公式在這裡可以用?我們可以很容易地領會為什麼貝葉斯公式用在前面介紹的那個男生女生長褲裙子的問題裡是正确的。但為什麼這裡?

為了回答這個問題,一個常見的思路就是想想:非得這樣嗎?因為如果你想到了另一種做法并且證明了它也是靠譜的,那麼将它與現在這個一比較,也許就能得出很有價值的資訊。那麼對于拼寫糾錯問題你能想到其他方案嗎?

不管怎樣,一個最常見的替代方案就是,選擇離 thew 的編輯距離最近的。然而 the 和 thaw 離 thew 的編輯距離都是 1 。這可咋辦捏?你說,不慌,那還是好辦。我們就看到底哪個更可能被錯打為 thew 就是了。我們注意到字母 e 和字母 w 在鍵盤上離得很緊,無名指一抽筋就不小心多打出一個 w 來,the 就變成 thew 了。而另一方面 thaw 被錯打成 thew 的可能性就相對小一點,因為 e 和 a 離得較遠而且使用的指頭相差一個指頭(一個是中指一個是小指,不像 e 和 w 使用的指頭靠在一塊——神經科學的證據表明緊鄰的身體設施之間容易串位)。OK,很好,因為你現在已經是在用最大似然方法了,或者直白一點,你就是在計算那個使得 P(D | h) 最大的 h 。

而貝葉斯方法計算的是什麼?是 P(h) * P(D | h) 。多出來了一個 P(h) 。我們剛才說了,這個多出來的 P(h) 是特定猜測的先驗機率。為什麼要摻和進一個先驗機率?剛才說的那個最大似然不是挺好麼?很雄辯地指出了 the 是更靠譜的猜測。有什麼問題呢?既然這樣,我們就從給最大似然找茬開始吧——我們假設兩者的似然程度是一樣或非常相近,這樣不就難以區分哪個猜測更靠譜了嗎?比如使用者輸入tlp ,那到底是 top 還是 tip ?(這個例子不怎麼好,因為 top 和 tip 的詞頻可能仍然是接近的,但一時想不到好的英文單詞的例子,我們不妨就假設 top 比 tip 常見許多吧,這個假設并不影響問題的本質。)這個時候,當最大似然不能作出決定性的判斷時,先驗機率就可以插手進來給出訓示——“既然你無法決定,那麼我告訴你,一般來說 top 出現的程度要高許多,是以更可能他想打的是 top ”)。

以上隻是最大似然的一個問題,即并不能提供決策的全部資訊。

最大似然還有另一個問題:即便一個猜測與資料非常符合,也并不代表這個猜測就是更好的猜測,因為這個猜測本身的可能性也許就非常低。比如 MacKay 在《Information Theory : Inference and Learning Algorithms》裡面就舉了一個很好的例子:-1 3 7 11 你說是等差數列更有可能呢?還是 -X^3 / 11 + 9/11*X^2 + 23/11 每項把前項作為 X 帶入後計算得到的數列?此外曲線拟合也是,平面上 N 個點總是可以用 N-1 階多項式來完全拟合,當 N 個點近似但不精确共線的時候,用 N-1 階多項式來拟合能夠精确通過每一個點,然而用直線來做拟合/線性回歸的時候卻會使得某些點不能位于直線上。你說到底哪個好呢?多項式?還是直線?一般地說肯定是越低階的多項式越靠譜(當然前提是也不能忽視“似然”P(D | h) ,明擺着一個多項式分布您愣是去拿直線拟合也是不靠譜的,這就是為什麼要把它們兩者乘起來考慮。),原因之一就是低階多項式更常見,先驗機率( P(h) )較大(原因之二則隐藏在 P(D | h) 裡面),這就是為什麼我們要用樣條來插值,而不是直接搞一個 N-1 階多項式來通過任意 N 個點的原因。

以上分析當中隐含的哲學是,觀測資料總是會有各種各樣的誤差,比如觀測誤差(比如你觀測的時候一個 MM 經過你一不留神,手一抖就是一個誤差出現了),是以如果過分去尋求能夠完美解釋觀測資料的模型,就會落入所謂的資料過配(overfitting)的境地,一個過配的模型試圖連誤差(噪音)都去解釋(而實際上噪音又是不需要解釋的),顯然就過猶不及了。是以 P(D | h) 大不代表你的 h (猜測)就是更好的 h。還要看 P(h) 是怎樣的。所謂奧卡姆剃刀精神就是說:如果兩個理論具有相似的解釋力度,那麼優先選擇那個更簡單的(往往也正是更平凡的,更少繁複的,更常見的)。

過分比對的另一個原因在于當觀測的結果并不是因為誤差而顯得“不精确”而是因為真實世界中對資料的結果産生貢獻的因素太多太多,跟噪音不同,這些偏差是一些另外的因素集體貢獻的結果,不是你的模型所能解釋的——噪音那是不需要解釋——一個現實的模型往往隻提取出幾個與結果相關度很高,很重要的因素(cause)。這個時候觀察資料會傾向于圍繞你的有限模型的預測結果呈正态分布,于是你實際觀察到的結果就是這個正态分布的随機取樣,這個取樣很可能受到其餘因素的影響偏離你的模型所預測的中心,這個時候便不能貪心不足地試圖通過改變模型來“完美”比對資料,因為那些使結果偏離你的預測的貢獻因素不是你這個有限模型裡面含有的因素所能概括的,硬要打腫臉充胖子隻能導緻不實際的模型,舉個教科書例子:身高和體重的實際關系近似于一個二階多項式的關系,但大家都知道并不是隻有身高才會對體重産生影響,實體世界影響體重的因素太多太多了,有人身材高大卻瘦得跟稻草,有人卻是橫長豎不長。但不可否認的是總體上來說,那些特殊情況越是特殊就越是稀少,呈圍繞最普遍情況(胖瘦适中)的正态分布,這個分布就保證了我們的身高——體重相關模型能夠在大多數情況下做出靠譜的預測。但是——剛才說了,特例是存在的,就算不是特例,人有胖瘦,密度也有大小,是以完美符合身高——體重的某個假想的二階多項式關系的人是不存在的,我們又不是歐幾裡德幾何世界當中的理想多面體,是以,當我們對人群随機抽取了 N 個樣本(資料點)試圖對這 N 個資料點拟合出一個多項式的話就得注意,它肯定得是二階多項式,我們要做的隻是去根據資料點計算出多項式各項的參數(一個典型的方法就是最小二乘);它肯定不是直線(我們又不是稻草),也不是三階多項式四階多項式.. 如果硬要完美拟合 N 個點,你可能會整出一個 N-1 階多項式來——設想身高和體重的關系是 5 階多項式看看?

3.2 模型比較理論(Model Comparasion)與貝葉斯奧卡姆剃刀(Bayesian Occam’s Razor)

實際上,模型比較就是去比較哪個模型(猜測)更可能隐藏在觀察資料的背後。其基本思想前面已經用拼寫糾正的例子來說明了。我們對使用者實際想輸入的單詞的猜測就是模型,使用者輸錯的單詞就是觀測資料。我們通過:

P(h | D) ∝ P(h) * P(D | h)

來比較哪個模型最為靠譜。前面提到,光靠 P(D | h) (即“似然”)是不夠的,有時候還需要引入 P(h) 這個先驗機率。奧卡姆剃刀就是說 P(h) 較大的模型有較大的優勢,而最大似然則是說最符合觀測資料的(即 P(D | h) 最大的)最有優勢。整個模型比較就是這兩方力量的拉鋸。我們不妨再舉一個簡單的例子來說明這一精神:你随便找枚硬币,擲一下,觀察一下結果。好,你觀察到的結果要麼是“正”,要麼是“反”(不,不是少林足球那枚硬币:P ),不妨假設你觀察到的是“正”。現在你要去根據這個觀測資料推斷這枚硬币擲出“正”的機率是多大。根據最大似然估計的精神,我們應該猜測這枚硬币擲出“正”的機率是 1 ,因為這個才是能最大化 P(D | h) 的那個猜測。然而每個人都會大搖其頭——很顯然,你随機摸出一枚硬币這枚硬币居然沒有反面的機率是“不存在的”,我們對一枚随機硬币是否一枚有偏硬币,偏了多少,是有着一個先驗的認識的,這個認識就是絕大多數硬币都是基本公平的,偏得越多的硬币越少見(可以用一個 beta 分布來表達這一先驗機率)。将這個先驗正态分布 p(θ) (其中 θ 表示硬币擲出正面的比例,小寫的 p 代表這是機率密度函數)結合到我們的問題中,我們便不是去最大化 P(D | h) ,而是去最大化 P(D | θ) * p(θ) ,顯然 θ = 1 是不行的,因為 P(θ=1) 為 0 ,導緻整個乘積也為 0 。實際上,隻要對這個式子求一個導數就可以得到最值點。

以上說的是當我們知道先驗機率 P(h) 的時候,光用最大似然是不靠譜的,因為最大似然的猜測可能先驗機率非常小。然而,有些時候,我們對于先驗機率一無所知,隻能假設每種猜測的先驗機率是均等的,這個時候就隻有用最大似然了。實際上,統計學家和貝葉斯學家有一個有趣的争論,統計學家說:我們讓資料自己說話。言下之意就是要摒棄先驗機率。而貝葉斯支援者則說:資料會有各種各樣的偏差,而一個靠譜的先驗機率則可以對這些随機噪音做到健壯。事實證明貝葉斯派勝利了,勝利的關鍵在于所謂先驗機率其實也是經驗統計的結果,譬如為什麼我們會認為絕大多數硬币是基本公平的?為什麼我們認為大多數人的肥胖适中?為什麼我們認為膚色是種族相關的,而體重則與種族無關?先驗機率裡面的“先驗”并不是指先于一切經驗,而是僅指先于我們“目前”給出的觀測資料而已,在硬币的例子中先驗指的隻是先于我們知道投擲的結果這個經驗,而并非“先天”。

然而,話說回來,有時候我們必須得承認,就算是基于以往的經驗,我們手頭的“先驗”機率還是均勻分布,這個時候就必須依賴用最大似然,我們用前面留下的一個自然語言二義性問題來說明這一點:

The girl saw the boy with a telescope.

到底是 The girl saw-with-a-telescope the boy 這一文法結構,還是 The girl saw the-boy-with-a-telescope 呢?兩種文法結構的常見程度都差不多(你可能會覺得後一種文法結構的常見程度較低,這是事後偏見,你隻需想想 The girl saw the boy with a book 就知道了。當然,實際上從大規模語料統計結果來看後一種文法結構的确稍稍不常見一丁點,但是絕對不足以解釋我們對第一種結構的強烈傾向)。那麼到底為什麼呢?

我們不妨先來看看 MacKay 在書中舉的一個漂亮的例子:

機器學習(二)-樸素的貝葉斯分類

圖中有多少個箱子?特别地,那棵書後面是一個箱子?還是兩個箱子?還是三個箱子?還是.. 你可能會覺得樹後面肯定是一個箱子,但為什麼不是兩個呢?如下圖:

機器學習(二)-樸素的貝葉斯分類

很簡單,你會說:要是真的有兩個箱子那才怪了,怎麼就那麼巧這兩個箱子剛剛好顔色相同,高度相同呢?

用機率論的語言來說,你剛才的話就翻譯為:猜測 h 不成立,因為 P(D | h) 太小(太巧合)了。我們的直覺是:巧合(小機率)事件不會發生。是以當一個猜測(假設)使得我們的觀測結果成為小機率事件的時候,我們就說“才怪呢,哪能那麼巧捏?!”

現在我們可以回到那個自然語言二義性的例子,并給出一個完美的解釋了:如果文法結構是 The girl saw the-boy-with-a-telecope 的話,怎麼那個男孩偏偏手裡拿的就是望遠鏡——一個可以被用來 saw-with 的東東捏?這也忒小機率了吧。他咋就不會拿本書呢?拿什麼都好。怎麼偏偏就拿了望遠鏡?是以唯一的解釋是,這個“巧合”背後肯定有它的必然性,這個必然性就是,如果我們将文法結構解釋為 The girl saw-with-a-telescope the boy 的話,就跟資料完美吻合了——既然那個女孩是用某個東西去看這個男孩的,那麼這個東西是一個望遠鏡就完全可以解釋了(不再是小機率事件了)。

自然語言二義性很常見,譬如上文中的一句話:

參見《決策與判斷》以及《Rationality for Mortals》第12章:小孩也可以解決貝葉斯問題

就有二義性:到底是參見這兩本書的第 12 章,還是僅僅是第二本書的第 12 章呢?如果是這兩本書的第 12 章那就是咄咄怪事了,怎麼恰好兩本書都有第 12 章,都是講同一個問題,更詭異的是,标題還相同呢?

注意,以上做的是似然估計(即隻看 P(D | h) 的大小),不含先驗機率。通過這兩個例子,尤其是那個樹後面的箱子的例子我們可以看到,似然估計裡面也蘊含着奧卡姆剃刀:樹後面的箱子數目越多,這個模型就越複雜。單個箱子的模型是最簡單的。似然估計選擇了更簡單的模型。

這個就是所謂的貝葉斯奧卡姆剃刀(Bayesian Occam’s Razor),因為這個剃刀工作在貝葉斯公式的似然(P(D | h) )上,而不是模型本身( P(h) )的先驗機率上,後者是傳統的奧卡姆剃刀。關于貝葉斯奧卡姆剃刀我們再來看一個前面說到的曲線拟合的例子:如果平面上有 N 個點,近似構成一條直線,但絕不精确地位于一條直線上。這時我們既可以用直線來拟合(模型1),也可以用二階多項式(模型2)拟合,也可以用三階多項式(模型3),.. ,特别地,用 N-1 階多項式便能夠保證肯定能完美通過 N 個資料點。那麼,這些可能的模型之中到底哪個是最靠譜的呢?前面提到,一個衡量的依據是奧卡姆剃刀:越是高階的多項式越是繁複和不常見。然而,我們其實并不需要依賴于這個先驗的奧卡姆剃刀,因為有人可能會争辯說:你怎麼就能說越高階的多項式越不常見呢?我偏偏覺得所有階多項式都是等可能的。好吧,既然如此那我們不妨就扔掉 P(h) 項,看看 P(D | h) 能告訴我們什麼。我們注意到越是高階的多項式,它的軌迹彎曲程度越是大,到了八九階簡直就是直上直下,于是我們不僅要問:一個比如說八階多項式在平面上随機生成的一堆 N 個點偏偏恰好近似構成一條直線的機率(即 P(D | h) )有多大?太小太小了。反之,如果背後的模型是一條直線,那麼根據該模型生成一堆近似構成直線的點的機率就大得多了。這就是貝葉斯奧卡姆剃刀。

這裡隻是提供一個關于貝葉斯奧卡姆剃刀的科普,強調直覺解釋,更多理論公式請參考 MacKay 的著作 《Information Theory : Inference and Learning Algorithms》第 28 章。

3.3 最小描述長度原則

貝葉斯模型比較理論與資訊論有一個有趣的關聯:

P(h | D) ∝ P(h) * P(D | h)

兩邊求對數,将右式的乘積變成相加:

ln P(h | D) ∝ ln P(h) + ln P(D | h)

顯然,最大化 P(h | D) 也就是最大化 ln P(h | D)。而 ln P(h) + ln P(D | h) 則可以解釋為模型(或者稱“假設”、“猜測”)h 的編碼長度加上在該模型下資料 D 的編碼長度。使這個和最小的模型就是最佳模型。

而究竟如何定義一個模型的編碼長度,以及資料在模型下的編碼長度則是一個問題。更多可參考 Mitchell 的 《Machine Learning》的 6.6 節,或 Mackay 的 28.3 節)

3.4 最優貝葉斯推理

所謂的推理,分為兩個過程,第一步是對觀測資料建立一個模型。第二步則是使用這個模型來推測未知現象發生的機率。我們前面都是講的對于觀測資料給出最靠譜的那個模型。然而很多時候,雖然某個模型是所有模型裡面最靠譜的,但是别的模型也并不是一點機會都沒有。譬如第一個模型在觀測資料下的機率是 0.5 。第二個模型是 0.4 ,第三個是 0.1 。如果我們隻想知道對于觀測資料哪個模型最可能,那麼隻要取第一個就行了,故事到此結束。然而很多時候我們建立模型是為了推測未知的事情的發生機率,這個時候,三個模型對未知的事情發生的機率都會有自己的預測,僅僅因為某一個模型機率稍大一點就隻聽他一個人的就太不民主了。所謂的最優貝葉斯推理就是将三個模型對于未知資料的預測結論權重平均起來(權值就是模型相應的機率)。顯然,這個推理是理論上的制高點,無法再優了,因為它已經把所有可能性都考慮進去了。

隻不過實際上我們是基本不會使用這個架構的,因為計算模型可能非常費時間,二來模型空間可能是連續的,即有無窮多個模型(這個時候需要計算模型的機率分布)。結果還是非常費時間。是以這個被看作是一個理論基準。

4. 無處不在的貝葉斯

以下我們再舉一些實際例子來說明貝葉斯方法被運用的普遍性,這裡主要集中在機器學習方面,因為我不是學經濟的,否則還可以找到一堆經濟學的例子。

4.1 中文分詞

貝葉斯是機器學習的核心方法之一。比如中文分詞領域就用到了貝葉斯。Google 研究員吳軍在《數學之美》系列中就有一篇是介紹中文分詞的,這裡隻介紹一下核心的思想,不做贅述,詳細請參考吳軍的文章(這裡)。

分詞問題的描述為:給定一個句子(字串),如:

南京市長江大橋

如何對這個句子進行分詞(詞串)才是最靠譜的。例如:

1. 南京市/長江大橋

2. 南京/市長/江大橋

這兩個分詞,到底哪個更靠譜呢?

我們用貝葉斯公式來形式化地描述這個問題,令 X 為字串(句子),Y 為詞串(一種特定的分詞假設)。我們就是需要尋找使得 P(Y|X) 最大的 Y ,使用一次貝葉斯可得:

P(Y|X) ∝ P(Y)*P(X|Y)

用自然語言來說就是 這種分詞方式(詞串)的可能性 乘以 這個詞串生成我們的句子的可能性。我們進一步容易看到:可以近似地将 P(X|Y) 看作是恒等于 1 的,因為任意假想的一種分詞方式之下生成我們的句子總是精準地生成的(隻需把分詞之間的分界符号扔掉即可)。于是,我們就變成了去最大化 P(Y) ,也就是尋找一種分詞使得這個詞串(句子)的機率最大化。而如何計算一個詞串:

W1, W2, W3, W4 ..

的可能性呢?我們知道,根據聯合機率的公式展開:P(W1, W2, W3, W4 ..) = P(W1) * P(W2|W1) * P(W3|W2, W1) * P(W4|W1,W2,W3) * .. 于是我們可以通過一系列的條件機率(右式)的乘積來求整個聯合機率。然而不幸的是随着條件數目的增加(P(Wn|Wn-1,Wn-2,..,W1) 的條件有 n-1 個),資料稀疏問題也會越來越嚴重,即便語料庫再大也無法統計出一個靠譜的 P(Wn|Wn-1,Wn-2,..,W1) 來。為了緩解這個問題,計算機科學家們一如既往地使用了“天真”假設:我們假設句子中一個詞的出現機率隻依賴于它前面的有限的 k 個詞(k 一般不超過 3,如果隻依賴于前面的一個詞,就是2元語言模型(2-gram),同理有 3-gram 、 4-gram 等),這個就是所謂的“有限地平線”假設。雖然這個假設很傻很天真,但結果卻表明它的結果往往是很好很強大的,後面要提到的樸素貝葉斯方法使用的假設跟這個精神上是完全一緻的,我們會解釋為什麼像這樣一個天真的假設能夠得到強大的結果。目前我們隻要知道,有了這個假設,剛才那個乘積就可以改寫成: P(W1) * P(W2|W1) * P(W3|W2) * P(W4|W3) .. (假設每個詞隻依賴于它前面的一個詞)。而統計 P(W2|W1) 就不再受到資料稀疏問題的困擾了。對于我們上面提到的例子“南京市長江大橋”,如果按照自左到右的貪婪方法分詞的話,結果就成了“南京市長/江大橋”。但如果按照貝葉斯分詞的話(假設使用 3-gram),由于“南京市長”和“江大橋”在語料庫中一起出現的頻率為 0 ,這個整句的機率便會被判定為 0 。 進而使得“南京市/長江大橋”這一分詞方式勝出。

一點注記:有人可能會疑惑,難道我們人類也是基于這些天真的假設來進行推理的?不是的。事實上,統計機器學習方法所統計的東西往往處于相當表層(shallow)的層面,在這個層面機器學習隻能看到一些非常表面的現象,有一點科學研究的理念的人都知道:越是往表層去,世界就越是繁複多變。從機器學習的角度來說,特征(feature)就越多,成百上千次元都是可能的。特征一多,好了,高維詛咒就産生了,資料就稀疏得要命,不夠用了。而我們人類的觀察水準顯然比機器學習的觀察水準要更深入一些,為了避免資料稀疏我們不斷地發明各種裝置(最典型就是顯微鏡),來幫助我們直接深入到更深層的事物層面去觀察更本質的聯系,而不是在淺層對表面現象作統計歸納。舉一個簡單的例子,通過對大規模語料庫的統計,機器學習可能會發現這樣一個規律:所有的“他”都是不會穿 bra 的,所有的“她”則都是穿的。然而,作為一個男人,卻完全無需進行任何統計學習,因為深層的規律就決定了我們根本不會去穿 bra 。至于機器學習能不能完成後者(像人類那樣的)這個推理,則是人工智能領域的經典問題。至少在那之前,聲稱統計學習方法能夠終結科學研究(原文)的說法是純粹外行人說的話。

4.2 統計機器翻譯

統計機器翻譯因為其簡單,自動(無需手動添加規則),迅速成為了機器翻譯的事實标準。而統計機器翻譯的核心算法也是使用的貝葉斯方法。

問題是什麼?統計機器翻譯的問題可以描述為:給定一個句子 e ,它的可能的外文翻譯 f 中哪個是最靠譜的。即我們需要計算:P(f|e) 。一旦出現條件機率貝葉斯總是挺身而出:

P(f|e) ∝ P(f) * P(e|f)

這個式子的右端很容易解釋:那些先驗機率較高,并且更可能生成句子 e 的外文句子 f 将會勝出。我們隻需簡單統計(結合上面提到的 N-Gram 語言模型)就可以統計任意一個外文句子 f 的出現機率。然而 P(e|f) 卻不是那麼好求的,給定一個候選的外文局子 f ,它生成(或對應)句子 e 的機率是多大呢?我們需要定義什麼叫 “對應”,這裡需要用到一個分詞對齊的平行語料庫,有興趣的可以參考 《Foundations of Statistical Natural Language Processing》第 13 章,這裡摘選其中的一個例子:假設 e 為:John loves Mary 。我們需要考察的首選 f 是:Jean aime Marie (法文)。我們需要求出 P(e|f) 是多大,為此我們考慮 e 和 f 有多少種對齊的可能性,如:

John (Jean) loves (aime) Marie (Mary)

就是其中的一種(最靠譜的)對齊,為什麼要對齊,是因為一旦對齊了之後,就可以容易地計算在這個對齊之下的 P(e|f) 是多大,隻需計算:

P(John|Jean) * P(loves|aime) * P(Marie|Mary)

即可。

然後我們周遊所有的對齊方式,并将每種對齊方式之下的翻譯機率 ∑ 求和。便可以獲得整個的 P(e|f) 是多大。

一點注記:還是那個問題:難道我們人類真的是用這種方式進行翻譯的?highly unlikely 。這種計算複雜性非常高的東西連三位數乘法都搞不定的我們才不會笨到去使用呢。根據認知神經科學的認識,很可能我們是先從句子到語義(一個逐層往上(bottom-up)抽象的 folding 過程),然後從語義根據另一門語言的文法展開為另一門語言(一個逐層往下(top-down)的具體化 unfolding 過程)。如何可計算地實作這個過程,目前仍然是個難題。(我們看到很多地方都有 bottom-up/top-down 這樣一個對稱的過程,實際上有人猜測這正是生物神經網絡原則上的運作方式,對視覺神經系統的研究尤其證明了這一點,Hawkins 在 《On Intelligence》 裡面提出了一種 HTM(Hierarchical Temporal Memory)模型正是使用了這個原則。)

4.3 貝葉斯圖像識别,Analysis by Synthesis

貝葉斯方法是一個非常 general 的推理架構。其核心理念可以描述成:Analysis by Synthesis (通過合成來分析)。06 年的認知科學新進展上有一篇 paper 就是講用貝葉斯推理來解釋視覺識别的,一圖勝千言,下圖就是摘自這篇 paper :

機器學習(二)-樸素的貝葉斯分類

首先是視覺系統提取圖形的邊角特征,然後使用這些特征自底向上地激活高層的抽象概念(比如是 E 還是 F 還是等号),然後使用一個自頂向下的驗證來比較到底哪個概念最佳地解釋了觀察到的圖像。

4.4  EM 算法與基于模型的聚類

聚類是一種無指導的機器學習問題,問題描述:給你一堆資料點,讓你将它們最靠譜地分成一堆一堆的。聚類算法很多,不同的算法适應于不同的問題,這裡僅介紹一個基于模型的聚類,該聚類算法對資料點的假設是,這些資料點分别是圍繞 K 個核心的 K 個正态分布源所随機生成的,使用 Han JiaWei 的《Data Ming: Concepts and Techniques》中的圖:

機器學習(二)-樸素的貝葉斯分類

圖中有兩個正态分布核心,生成了大緻兩堆點。我們的聚類算法就是需要根據給出來的那些點,算出這兩個正态分布的核心在什麼位置,以及分布的參數是多少。這很明顯又是一個貝葉斯問題,但這次不同的是,答案是連續的且有無窮多種可能性,更糟的是,隻有當我們知道了哪些點屬于同一個正态分布圈的時候才能夠對這個分布的參數作出靠譜的預測,現在兩堆點混在一塊我們又不知道哪些點屬于第一個正态分布,哪些屬于第二個。反過來,隻有當我們對分布的參數作出了靠譜的預測時候,才能知道到底哪些點屬于第一個分布,那些點屬于第二個分布。這就成了一個先有雞還是先有蛋的問題了。為了解決這個循環依賴,總有一方要先打破僵局,說,不管了,我先随便整一個值出來,看你怎麼變,然後我再根據你的變化調整我的變化,然後如此疊代着不斷互相推導,最終收斂到一個解。這就是 EM 算法。

EM 的意思是“Expectation-Maximazation”,在這個聚類問題裡面,我們是先随便猜一下這兩個正态分布的參數:如核心在什麼地方,方差是多少。然後計算出每個資料點更可能屬于第一個還是第二個正态分布圈,這個是屬于 Expectation 一步。有了每個資料點的歸屬,我們就可以根據屬于第一個分布的資料點來重新評估第一個分布的參數(從蛋再回到雞),這個是 Maximazation 。如此往複,直到參數基本不再發生變化為止。這個疊代收斂過程中的貝葉斯方法在第二步,根據資料點求分布的參數上面。

4.5 最大似然與最小二乘

機器學習(二)-樸素的貝葉斯分類

學過線性代數的大概都知道經典的最小二乘方法來做線性回歸。問題描述是:給定平面上 N 個點,(這裡不妨假設我們想用一條直線來拟合這些點——回歸可以看作是拟合的特例,即允許誤差的拟合),找出一條最佳描述了這些點的直線。

一個接踵而來的問題就是,我們如何定義最佳?我們設每個點的坐标為 (Xi, Yi) 。如果直線為 y = f(x) 。那麼 (Xi, Yi) 跟直線對這個點的“預測”:(Xi, f(Xi)) 就相差了一個 ΔYi = |Yi – f(Xi)| 。最小二乘就是說尋找直線使得 (ΔY1)^2 + (ΔY2)^2 + .. (即誤差的平方和)最小,至于為什麼是誤差的平方和而不是誤差的絕對值和,統計學上也沒有什麼好的解釋。然而貝葉斯方法卻能對此提供一個完美的解釋。

我們假設直線對于坐标 Xi 給出的預測 f(Xi) 是最靠譜的預測,所有縱坐标偏離 f(Xi) 的那些資料點都含有噪音,是噪音使得它們偏離了完美的一條直線,一個合理的假設就是偏離路線越遠的機率越小,具體小多少,可以用一個正态分布曲線來模拟,這個分布曲線以直線對 Xi 給出的預測 f(Xi) 為中心,實際縱坐标為 Yi 的點 (Xi, Yi) 發生的機率就正比于 EXP[-(ΔYi)^2]。(EXP(..) 代表以常數 e 為底的多少次方)。

現在我們回到問題的貝葉斯方面,我們要想最大化的後驗機率是:

P(h|D) ∝ P(h) * P(D|h)

又見貝葉斯!這裡 h 就是指一條特定的直線,D 就是指這 N 個資料點。我們需要尋找一條直線 h 使得 P(h) * P(D|h) 最大。很顯然,P(h) 這個先驗機率是均勻的,因為哪條直線也不比另一條更優越。是以我們隻需要看 P(D|h) 這一項,這一項是指這條直線生成這些資料點的機率,剛才說過了,生成資料點 (Xi, Yi) 的機率為 EXP[-(ΔYi)^2] 乘以一個常數。而 P(D|h) = P(d1|h) * P(d2|h) * .. 即假設各個資料點是獨立生成的,是以可以把每個機率乘起來。于是生成  N 個資料點的機率為 EXP[-(ΔY1)^2] * EXP[-(ΔY2)^2] * EXP[-(ΔY3)^2] * .. = EXP{-[(ΔY1)^2 + (ΔY2)^2 + (ΔY3)^2 + ..]} 最大化這個機率就是要最小化 (ΔY1)^2 + (ΔY2)^2 + (ΔY3)^2 + .. 。 熟悉這個式子嗎?

5. 樸素貝葉斯方法

樸素貝葉斯方法是一個很特别的方法,是以值得介紹一下。我們用樸素貝葉斯在垃圾郵件過濾中的應用來舉例說明。

5.1 貝葉斯垃圾郵件過濾器

問題是什麼?問題是,給定一封郵件,判定它是否屬于垃圾郵件。按照先例,我們還是用 D 來表示這封郵件,注意 D 由 N 個單詞組成。我們用 h+ 來表示垃圾郵件,h- 表示正常郵件。問題可以形式化地描述為求:

P(h+|D) = P(h+) * P(D|h+) / P(D)

P(h-|D) = P(h-) * P(D|h-) / P(D)

其中 P(h+) 和 P(h-) 這兩個先驗機率都是很容易求出來的,隻需要計算一個郵件庫裡面垃圾郵件和正常郵件的比例就行了。然而 P(D|h+) 卻不容易求,因為 D 裡面含有 N 個單詞 d1, d2, d3, .. ,是以P(D|h+) = P(d1,d2,..,dn|h+) 。我們又一次遇到了資料稀疏性,為什麼這麼說呢?P(d1,d2,..,dn|h+) 就是說在垃圾郵件當中出現跟我們目前這封郵件一模一樣的一封郵件的機率是多大!開玩笑,每封郵件都是不同的,世界上有無窮多封郵件。瞧,這就是資料稀疏性,因為可以肯定地說,你收集的訓練資料庫不管裡面含了多少封郵件,也不可能找出一封跟目前這封一模一樣的。結果呢?我們又該如何來計算 P(d1,d2,..,dn|h+) 呢?

我們将 P(d1,d2,..,dn|h+)  擴充為: P(d1|h+) * P(d2|d1, h+) * P(d3|d2,d1, h+) * .. 。熟悉這個式子嗎?這裡我們會使用一個更激進的假設,我們假設 di 與 di-1 是完全條件無關的,于是式子就簡化為 P(d1|h+) * P(d2|h+) * P(d3|h+) * .. 。這個就是所謂的條件獨立假設,也正是樸素貝葉斯方法的樸素之處。而計算 P(d1|h+) * P(d2|h+) * P(d3|h+) * .. 就太簡單了,隻要統計 di 這個單詞在垃圾郵件中出現的頻率即可。關于貝葉斯垃圾郵件過濾更多的内容可以參考這個條目,注意其中提到的其他資料。

一點注記:這裡,為什麼有這個資料稀疏問題,還是因為統計學習方法工作在淺層面,世界上的單詞就算不再變多也是非常之多的,單詞之間組成的句子也是變化多端,更不用說一篇文章了,文章數目則是無窮的,是以在這個層面作統計,肯定要被資料稀疏性困擾。我們要注意,雖然句子和文章的數目是無限的,然而就拿郵件來說,如果我們隻關心郵件中句子的語義(進而更高抽象層面的“意圖”(語義,意圖如何可計算地定義出來是一個人工智能問題),在這個層面上可能性便大大縮減了,我們關心的抽象層面越高,可能性越小。單詞集合和句子的對應是多對一的,句子和語義的對應又是多對一的,語義和意圖的對應還是多對一的,這是個層級體系。神經科學的發現也表明大腦的皮層大緻有一種層級結構,對應着越來越抽象的各個層面,至于如何具體實作一個可放在計算機内的大腦皮層,仍然是一個未解決問題,以上隻是一個原則(principle)上的認識,隻有當 computational 的 cortex 模型被建立起來了之後才可能将其放入電腦。

5.2 為什麼樸素貝葉斯方法令人詫異地好——一個理論解釋

樸素貝葉斯方法的條件獨立假設看上去很傻很天真,為什麼結果卻很好很強大呢?就拿一個句子來說,我們怎麼能魯莽地聲稱其中任意一個單詞出現的機率隻受到它前面的 3 個或 4 個單詞的影響呢?别說 3 個,有時候一個單詞的機率受到上一句話的影響都是絕對可能的。那麼為什麼這個假設在實際中的表現卻不比決策樹差呢?有人對此提出了一個理論解釋,并且建立了什麼時候樸素貝葉斯的效果能夠等價于非樸素貝葉斯的充要條件,這個解釋的核心就是:有些獨立假設在各個分類之間的分布都是均勻的是以對于似然的相對大小不産生影響;即便不是如此,也有很大的可能性各個獨立假設所産生的消極影響或積極影響互相抵消,最終導緻結果受到的影響不大。具體的數學公式請參考這篇 paper 。

6. 層級貝葉斯模型

機器學習(二)-樸素的貝葉斯分類

層級貝葉斯模型是現代貝葉斯方法的标志性建築之一。前面講的貝葉斯,都是在同一個事物層次上的各個因素之間進行統計推理,然而層次貝葉斯模型在哲學上更深入了一層,将這些因素背後的因素(原因的原因,原因的原因,以此類推)囊括進來。一個教科書例子是:如果你手頭有 N 枚硬币,它們是同一個工廠鑄出來的,你把每一枚硬币擲出一個結果,然後基于這 N 個結果對這 N 個硬币的 θ (出現正面的比例)進行推理。如果根據最大似然,每個硬币的 θ 不是 1 就是 0 (這個前面提到過的),然而我們又知道每個硬币的 p(θ) 是有一個先驗機率的,也許是一個 beta 分布。也就是說,每個硬币的實際投擲結果 Xi 服從以 θ 為中心的正态分布,而 θ 又服從另一個以 Ψ 為中心的 beta 分布。層層因果關系就展現出來了。進而 Ψ 還可能依賴于因果鍊上更上層的因素,以此類推。

6.1 隐馬可夫模型(HMM)

機器學習(二)-樸素的貝葉斯分類

吳軍在數學之美系列裡面介紹的隐馬可夫模型(HMM)就是一個簡單的層級貝葉斯模型:

那麼怎麼根據接收到的資訊來推測說話者想表達的意思呢?我們可以利用叫做“隐含馬爾可夫模型”(Hidden Markov Model)來解決這些問題。以語音識别為例,當我們觀測到語音信号 o1,o2,o3 時,我們要根據這組信号推測出發送的句子 s1,s2,s3。顯然,我們應該在所有可能的句子中找最有可能性的一個。用數學語言來描述,就是在已知 o1,o2,o3,…的情況下,求使得條件機率 P (s1,s2,s3,…|o1,o2,o3….) 達到最大值的那個句子 s1,s2,s3,…

吳軍的文章中這裡省掉沒說的是,s1, s2, s3, .. 這個句子的生成機率同時又取決于一組參數,這組參數決定了 s1, s2, s3, .. 這個馬可夫鍊的先驗生成機率。如果我們将這組參數記為 λ ,我們實際上要求的是:P(S|O, λ) (其中 O 表示 o1,o2,o3,.. ,S表示 s1,s2,s3,..)

當然,上面的機率不容易直接求出,于是我們可以間接地計算它。利用貝葉斯公式并且省掉一個常數項,可以把上述公式等價變換成

P(o1,o2,o3,…|s1,s2,s3….) * P(s1,s2,s3,…)

其中

P(o1,o2,o3,…|s1,s2,s3….) 表示某句話 s1,s2,s3…被讀成 o1,o2,o3,…的可能性, 而 P(s1,s2,s3,…) 表示字串 s1,s2,s3,…本身能夠成為一個合乎情理的句子的可能性,是以這個公式的意義是用發送信号為 s1,s2,s3…這個數列的可能性乘以 s1,s2,s3.. 本身可以一個句子的可能性,得出機率。

這裡,s1,s2,s3…本身可以一個句子的可能性其實就取決于參數 λ ,也就是語言模型。是以簡而言之就是發出的語音信号取決于背後實際想發出的句子,而背後實際想發出的句子本身的獨立先驗機率又取決于語言模型。

繼續閱讀