概率論只不過是把常識用數學公式表達了出來。
——拉普拉斯
記得讀本科的時候,最喜歡到城里的計算機書店里面去閑逛,一逛就是好幾個小時;有一次,在書店看到一本書,名叫貝葉斯方法。當時數學系的課程還沒有學到概率統計。我心想,一個方法能夠專門寫出一本書來,肯定很牛逼。後來,我發現當初的那個樸素歸納推理成立了——這果然是個牛逼的方法。
——題記
目錄
0. 前言
1. 歷史
2. 拼寫糾正
3. 模型比較與貝葉斯奧卡姆剃刀
4. 無處不在的貝葉斯
5. 樸素貝葉斯方法(又名“愚蠢者的貝葉斯(idiot’s bayes)”)
6. 層級貝葉斯模型
7. 貝葉斯網絡
0.
這是一篇關於貝葉斯方法的科普文,我會盡量少用公式,多用平白的語言敘述,多舉實際例子。更嚴格的公式和計算我會在相應的地方註明參考資料。貝葉斯方法被證明是非常general 且強大的推理框架,文中你會看到很多有趣的應用。
1.
托馬斯·貝葉斯(Thomas Bayes)同學的詳細生平在這里。以下摘一段wikipedia 上的簡介:
所謂的貝葉斯方法源於他生前為解決一個“逆概”問題寫的一篇文章,而這篇文章是在他死後才由他的一位朋友發表出來的。在貝葉斯寫這篇文章之前,人們已經能夠計算“正向概率”,如“假設袋子里面有N個白球,M個黑球,你伸手進去摸一把,摸出黑球的概率是多大”。而一個自然而然的問題是反過來:“如果我們事先並不知道袋子里面黑白球的比例,而是閉著眼睛摸出一個(或好幾個)球,觀察這些取出來的球的顏色之後,那麽我們可以就此對袋子里面的黑白球的比例作出什麽樣的推測”。這個問題,就是所謂的逆概問題。
實際上,貝葉斯當時的論文只是對這個問題的一個直接的求解嘗試,並不清楚他當時是不是已經意識到這里面包含著的深刻的思想。然而後來,貝葉斯方法席卷了概率論,並將應用延伸到各個問題領域,所有需要作出概率預測的地方都可以見到貝葉斯方法的影子,特別地,貝葉斯是機器學習的核心方法之一。這背後的深刻原因在於,現實世界本身就是不確定的,人類的觀察能力是有局限性的(否則有很大一部分科學就沒有必要做了——設想我們能夠直接觀察到電子的運行,還需要對原子模型爭吵不休嗎?),我們日常所觀察到的只是事物表面上的結果,沿用剛才那個袋子里面取球的比方,我們往往只能知道從里面取出來的球是什麽顏色,而並不能直接看到袋子里面實際的情況。這個時候,我們就需要提供一個猜測(hypothesis,更為嚴格的說法是“假設”,這里用“猜測”更通俗易懂一點),所謂猜測,當然就是不確定的(很可能有好多種乃至無數種猜測都能滿足目前的觀測),但也絕對不是兩眼一抹黑瞎蒙——具體地說,我們需要做兩件事情:1.算出各種不同猜測的可能性大小。2.算出最靠譜的猜測是什麽。第一個就是計算特定猜測的後驗概率,對於連續的猜測空間則是計算猜測的概率密度函數。第二個則是所謂的模型比較,模型比較如果不考慮先驗概率的話就是最大似然方法。
1.1
下面舉一個自然語言的不確定性的例子。當你看到這句話:
The girl saw the boy with a telescope.
你對這句話的含義有什麽猜測?平常人肯定會說:那個女孩拿望遠鏡看見了那個男孩(即你對這個句子背後的實際語法結構的猜測是:The girlsaw-with-a-telescope the boy)。然而,仔細一想,你會發現這個句子完全可以解釋成:那個女孩看見了那個拿著望遠鏡的男孩(即:The girl sawthe-boy-with-a-telescope)。那為什麽平常生活中我們每個人都能夠迅速地對這種二義性進行消解呢?這背後到底隱藏著什麽樣的思維法則?我們留到後面解釋。
1.2
貝葉斯公式是怎麽來的?
我們還是使用 wikipedia 上的一個例子:
一所學校里面有 60% 的男生,40%的女生。男生總是穿長褲,女生則一半穿長褲一半穿裙子。有了這些信息之後我們可以容易地計算“隨機選取一個學生,他(她)穿長褲的概率和穿裙子的概率是多大”,這個就是前面說的“正向概率”的計算。然而,假設你走在校園中,迎面走來一個穿長褲的學生(很不幸的是你高度近似,你只看得見他(她)穿的是否長褲,而無法確定他(她)的性別),你能夠推斷出他(她)是男生的概率是多大嗎?
一些認知科學的研究表明(《決策與判斷》以及《RationalityforMortals》第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)
難怪拉普拉斯說概率論只是把常識用數學公式表達了出來。
然而,後面我們會逐漸發現,看似這麽平凡的貝葉斯公式,背後卻隱含著非常深刻的原理。
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 的關聯提取。