1. 程式人生 > >Bayes' theorem (貝葉斯定理)

Bayes' theorem (貝葉斯定理)

也有 事件 ike 之前 誤差 另一個 nor 條件 一次

前言


  AI時代的到來一下子讓人感覺到數學知識有些捉襟見肘,為了不被這個時代淘汰,我們需要不斷的學習再學習。其中最常見的就是貝葉斯定理,這個定理最早由托馬斯·貝葉斯提出。

  貝葉斯方法的誕生源於他生前為解決一個“逆向概率”問題寫的一篇文章,而這篇文章是在他死後才由他的一位朋友發表出來的。在貝葉斯寫這篇論文之前,人們已經能夠計算“正向概率”,如“袋子裏N個白球,M個黑球,隨機抓一個,抓到白球的概率”。而隨之而來的另一個反過來的問題就是 “如果我們事先並不知道袋子裏面黑白球的比例,而是閉著眼睛摸出一個(或好幾個)球,觀察這些取出來的球的顏色之後,那麽我們可以就此對袋子裏面的黑白球的比例作出什麽樣的推測”。這個問題,就是所謂的“逆概”問題。

  實際上,貝葉斯當時的論文只是對這個問題的一個直接的求解嘗試,並不清楚他當時是不是已經意識到這裏面包含著的深刻的思想。然而後來,貝葉斯方法席卷了概率論,並將應用延伸到各個問題領域,所有需要作出概率預測的地方都可以見到貝葉斯方法的影子,特別需要提的是:貝葉斯是機器學習的核心方法之一。這背後的深刻原因在於,現實世界本身就是不確定的,人類的觀察能力是有局限性的(否則有很大一部分科學就沒有必要做了——設想我們能夠直接觀察到電子的運行,還需要對原子模型爭吵不休嗎?),我們日常所觀察到的只是事物表面上的結果,沿用剛才那個袋子裏面取球的比方,我們往往只能知道從裏面取出來的球是什麽顏色,而並不能直接看到袋子裏面實際的情況。這個時候,我們就需要提供一個猜測(hypothesis,更為嚴格的說法是“假設”,這裏用“猜測”更通俗易懂一點),所謂猜測,當然就是不確定的(很可能有好多種乃至無數種猜測都能滿足目前的觀測),但也絕對不是兩眼一抹黑瞎蒙——具體地說。

  我們需要做兩件事情:1. 算出各種不同猜測的可能性大小。2. 算出最靠譜的猜測是什麽。第一個就是計算特定猜測的後驗概率,對於連續的猜測空間則是計算猜測的概率密度函數。第二個則是所謂的模型比較,模型比較如果不考慮先驗概率的話就是最大似然方法。

歧義句


  下面舉一個自然語言中有歧義的例子:

我看見小明扶著一位老人走下車來,手裏握著一根拐杖。

  當你看到這句話的時候,你肯定會說你對這句話的說的就是“小明扶著老人,老人手裏拿著拐杖”。但實際這句話呢,還可以解釋成“小明扶著老人,且小明拿著拐杖”。那為什麽我們能夠通過這句話迅速的對這種二義性進行消解呢?這裏面到底有什麽樣的思維法則?一會後面解釋。

  

貝葉斯公式


  P(B|A) = P(AB) / P(A) 也可以寫作 P(B|A) = P(A|B)*P(B) / P(A)

  相信大家看到這個公式,應該很不好理解吧,沒關系,我們用一個Wikipedia上實際的例子來推到一下貝葉斯公式。

  一所學校裏面有 60% 的男生,40% 的女生。男生總是穿長褲,女生則一半穿長褲一半穿裙子。我們可以非常容易的算出“隨機選取一個學生,ta穿長褲的概率和穿裙子的概率”,這個也就是我們前面說到的“正向概率”。然而,貝葉斯公式解決問題就是“假設你走在校園中,迎面走來一個穿長褲的學生,你能夠推斷出ta是男生的概率是多大嗎?”

  其實吧,我們可能不善於解決貝葉斯公式,但是一般的概率問題我們還是可以很快解決的,因此剛才那個問題可以被理解為“你在校園裏隨便逛,遇到了 N 個穿長褲的人,求這 N 個人裏面有多少個男生。”這樣是不是就簡單多了:先算出穿長褲人的概率,然後再算出穿長褲人的裏面有多少男生即可。

  假設你遇到了N個人,那麽你遇到:

  穿長褲人 = 穿長褲的男生 + 穿長褲的女生 = 總人數*男生的概率*男生穿長褲的概率 + 總人數*女生的概率*女生穿長褲的概率 = N*P(男)*P(長褲|男) + N*P(女)*P(長褲|女)

  這裏需要註意一下 P(長褲|男) 是條件概率,即“男”這個條件下“穿長褲”的概率,由題目得知男生都穿長褲,因此 P(長褲|男) = 100%;同理 P(長褲|女) = 50%。

  那麽我們最初要求的穿長褲的男生的概率 P(男|長褲) = 穿長褲的男生/穿長褲人 = N*P(男)*P(長褲|男) / N*P(男)*P(長褲|男) + N*P(女)*P(長褲|女)

  我們很容易發現分子分母可以同時約去N,這個公式裏實際結果和N是沒有關系的:P(男|長褲) = P(男)*P(長褲|男) / P(男)*P(長褲|男) + P(女)*P(長褲|女)

  再收縮一下 其實分母就是 P(長褲) 分子是P(長褲,男) (註意是逗號),讀作“穿長褲的男孩”;因此 P(男|長褲) = P(長褲,男)/P(長褲)

  如果我們將 上式中“男”和“褲”替換成其他的內容,例如B和A,那麽:

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

  就這樣貝葉斯公式就被我們推敲了出來。

  我們再解讀一次:

  P(男|長褲) = P(長褲|男) *P(男)/ P(長褲)

  P(男|長褲),叫後驗概率,即穿長褲這個條件下,是男生的概率,也就是我們要計算的概率。  

  P(長褲|男),叫似然度,即男生穿長褲的概率。

  P(男) ,叫做先驗概率,即男生出現的概率。

  P(長褲),叫做標準化常量,和先驗概率定義類型,就是一般情況下,穿長褲人的概率。

  P(男|長褲) = 100%*60%/(60%+40%/2)= 0.75

  P(女|長褲) = 50%*40%/(60%+40%/2)= 0.25

  可以看到我們的計算和我們之前的猜測是一致的。

拼寫糾正


  一位大牛Peter Norvig 寫過這樣一篇關於拼寫糾正的文章,裏面用到的就是貝葉斯的思想,我們可以簡單介紹下核心:

  首先第一步就是如果把這個問題轉換到我們的公式上面,我們要做的就是“當用戶輸入了一個不在字典中的單詞,我們需要去猜測他真正想輸入的單詞到底是什麽呢”。

  因此我們需要算的就是

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

  當然這個猜測的結果不止一個,我們需要找到概率最大的那個猜測單詞。比如用戶輸入: thew ,那麽他到底是想輸入 the ,還是想輸入 thaw ?到底哪個猜測可能性更大呢?由於我們可以用貝葉斯公式來直接出它們各自的概率,因此我們不妨多些猜測,我們將多個猜測記為 h1 h2 .. ( h 代表 hypothesis),它們都屬於一個有限且離散的猜測空間 H (單詞總共就那麽多而已),將用戶實際輸入的單詞記為 D ( D 代表 Data ,即觀測數據),於是:

  P(我們猜測他想輸入的單詞 | 他實際輸入的單詞) 可以抽象地記為: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)

  可以記為:P(h | D) ∝ P(h) * P(D | h) (∝ 這個符號代表“正比例於”)

  P(h) * P(D | h)的含義,我們可以抽象為:對於給定觀測數據,一個猜測是好是壞,取決於“這個猜測本身獨立的可能性大小(先驗概率,Prior )”和“這個猜測生成我們觀測到的數據的可能性大小”(似然概率,Likelihood )的乘積。具體到我們的那個 thew 例子上,含義就是,用戶實際是想輸入 the 的可能性大小取決於 the 本身在詞匯表中被使用的可能性(頻繁程度)大小(先驗概率)和 想打 the 卻打成 thew 的可能性大小(似然概率)的乘積。

  那麽這個問題就解決了,對於我們猜測為可能的每個單詞計算一下 P(h) * P(D | h) 這個值,然後取最大的,得到的就是最靠譜的猜測。

  

奧卡姆剃刀


  我們繼續上面的例子,當我們要計算 P(D | h) 這個似然概率的時候,我們通常使用編輯距離的方法,來判斷這兩個單詞的一個相似度。

  然而 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 ”)

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

回歸原始問題


  最後我們回到最開始的問題上來。

我看見小明扶著一位老人走下車來,手裏握著一根拐杖。

  相信大家這時候應該已經比較清楚了吧,顯示生活中 似然概率小明恰好拿著拐杖的概率要比一個老人拿著拐杖的概率要低的多,所以這裏的歧義我們都會自動的消除掉,這也就是為什麽會有說小孩子也能解決貝葉斯問題。

  最後,我們先不管算法,也不管各種公式,我們就看看貝葉斯理論體系是在幹什麽?在我看來,貝葉斯的理論體系其實揭示的是一種非常典型的人類自身的推測邏輯行為。

  例如,在黃昏的時候走在自己居住的小區裏,光線很昏暗,前面突然閃過一個影子,從路一邊的草叢躥到另一邊,速度較快體型較大,其他信息沒捕捉到。這時候大概會猜測,這有可能是一只較大的家犬。而如果是在非洲大草原上,從越野車裏同樣看到昏暗的草原上躥過一個速度較快體型較大的動物,也許會猜測那是一頭獅子,或者一頭獵豹。這兩種猜測對於捕捉到的對象信息都是非常有限的,而且內容相近,但是得出兩種不同的推測。

  原因很簡單,就是因為當時的環境不同,導致的兩種事件的概率不同,帶有比較明確的傾向性。也就是說,正常人的邏輯推斷不會和上述例子相反,不會在小區裏推斷出現獅子或者獵豹,也不會推斷在非洲大草原上出現家犬。這種推斷的思路或者方式本身就是貝葉斯理論體系的核心內容。樸素貝葉斯是一種機器學習的思想,而不是一個簡單的直接套用的公式。而且在用樸素貝葉斯方式進行分類機器學習時還經常需要使用其他一些輔助的建模手段。樸素貝葉斯在生產生活中作為機器學習手段的場景確實非常多,是一種使用很廣泛的方式,所以也很重要。後面的文章裏我還會繼續講解一些貝葉斯的東西。

 

  這篇文章的內容大部分是參考未鵬老師,這也是唯一一篇,不是自己原創的文章,但是所有文字都是我自己讀了不下5遍的,裏面也有些我自己加入的內容,如有侵權及時告知我刪除。

Bayes' theorem (貝葉斯定理)