02.26 從貝葉斯出發,如何真正的理解算法?

源/與數據同行

大學時學習了很多高深的課程,什麼數學物理方法、小波函數等等,但現在腦海裡估計已經一片空白,反正大概是一堆公式和解題方法吧,其實就是在當時,也根本沒深究過這些數學公式的來龍去脈,更無法理解這些公式後面的光輝思想。

貝葉斯算法大名鼎鼎,但用過貝葉斯的估計沒幾個能從業務的角度去真正理解貝葉斯吧?有多少人能將貝葉斯思想自然的用於解釋生活中的各種現象呢?在電梯裡你能用幾句話跟領導解釋清楚嗎?

當然直接拿著貝葉斯公式或者調用一個函數的確可以快速解決問題,但這種方法顯然沒法內化,邏輯上的推導才是算法精神和樂趣所在,對於一個建模的人來說,如果有時間,還是要儘量讓一個算法長在自己心裡,語言和工具總會不斷被更新,你也許永遠跟不上這個節奏,唯有裡面的思想是持久的,也是一大把年紀後能留下的唯一的算法資產,特別是如果其還能指導你的生活,知道為什麼總是很重要。

1、關於信念

你相信上帝嗎?你相信中醫嗎?你相信全球變暖是人為造成的嗎?你相信轉基因食品安全嗎?你相信大年初一去靈隱寺燒香能帶來好運嗎?信或不信,我們可以用一個量化數字來表示,比如說概率,大年初一去靈隱寺燒香能帶來好運的可能性是90%,這是主觀概率,就好比天氣預報說明天下雨的概率90%一樣。

真正的深信不疑或徹底不信都是很少的,一般情況下對一般有爭議的問題我們都是抱著將信將疑的態度,信念值在0.01%到99.99%之間,而且,我們對大多數事物的信念值都在動態變化,比如有什麼特別突兀的新東西出來,我們一開始可能是不信的,隨著證據增多,慢慢增加信念,那麼,我如何基於這些證據去計算新的信念值?

2、貝葉斯的困惑

所謂的貝葉斯方法源於他生前為解決一個“逆概”問題寫的一篇文章,而這篇文章是在他死後才由他的一位朋友發表出來的。在貝葉斯寫這篇文章之前,人們已經能夠計算“正向概率”,如“假設袋子裡面有N個白球,M個黑球,你伸手進去摸一把,摸出黑球的概率是多大?”

而一個自然而然的問題是反過來:“如果我們事先並不知道袋子裡面黑白球的比例,而是閉著眼睛摸出一個(或好幾個)球,觀察這些取出來的球的顏色之後,那麼我們可以就此對袋子裡面的黑白球的比例作出什麼樣的推測,隨著取出的球越來越多,我的推測是否也會變化?”

實際上,貝葉斯當時的論文只是對這個問題的一個直接的求解嘗試,並不清楚他當時是不是已經意識到這裡麵包含著的深刻的思想。然而後來,貝葉斯方法席捲了概率論,並將應用延伸到各個問題領域,所有需要作出概率預測的地方都可以見到貝葉斯方法的影子,特別地,貝葉斯成為機器學習的核心方法之一。

3、從業務出發推導貝葉斯定理

如果我在決策時掌握所有的信息,我當然能計算一個客觀的概率,比如在一個桶裡有黑白色的球,如果我事先知道里面黑白球的比例,我自然知道我隨機拿到一個白球的概率是多少,如果我事先知道去靈隱寺獲得好運的可能性就是90%,我自然會在某次路過靈隱寺的時候進去燒香。

可是生活中絕大多數決策面臨的信息是不全的,我們手裡只有有限的幾個證據,而貝葉斯定理的精神在於,人類的觀察能力是有限的,既然無法得到全面的信息,我們就在證據有限(表面)的情況下,儘可能地做一個更好的判斷,下面我們先祭出貝葉斯公式,然後嘗試用靈隱寺燒香能否顯靈的例子推導出它:

P(A/B)=P(B/A)/P(B)*P(A)

這裡P(A)代表認為升職的概率,B代表一個與A相關的事件(實例),比如“我朋友去年去了靈隱寺燒香,結果他升職了”,P(A/B)代表在B發生的情況下,A發生的概率,其他類似。

P(A)代表了我的原始信念A,就是說我對於升職有一個初始的判斷概率,比如15%。P(A/B)代表某個實際事件發生後,有了新的證據,我需要對於原始的信念A做個調整,你可以把A當成你對一般情況的理論預言,而B是一次實驗結果,有了新的實驗結果,你就調整自己的理論預言,這個新的預言就是P(A/B)。

那麼P(A/B)這個新的預言如何計算呢?

首先,跟初始的P(A)有關係,假如P(A)一開始極小,則再多的事件發生你也不會改變初衷,我們的當前觀點肯定受先前觀點的影響。

其次,跟P(B/A)/P(B)也有關係,就是說如果在原始信念P(A)作用下發生某個特定事件(B)的可能性相對更高了,則我由於這個事件改變原始信念的可能性就越高,比如這裡P(B)代表去靈隱寺的概率,P(B/A)就代表升職的人中去過靈隱寺的的概率,兩者比值就表示信念由於事實改變的相對大小,注意好好理解這句話。

最後,我們就得到了能業務化解釋的貝葉斯公式:P(A/B)=P(B/A)/P(B)*P(A),假如你真理解了,你就不會糾結搞混這個公式。

4、從技術出發推導貝葉斯定理

當然,如果純粹去推導出這個公式,其實也是容易的,筆者這裡簡要示意下:

從貝葉斯出發,如何真正的理解算法?

U代表全空間,A代表升職,B代表去靈隱寺,C代表交集,很容易推導:

P(A,B)=C/U

P(A/B)*P(B)=C/B*B/U=C/U

P(B/A)*P(A)=C/A*A/U=C/U

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

5、生活的啟示

請看以下第一張圖,你認為大樹後面是一個箱子,還是兩個箱子,或是三個箱子,為什麼? 如果你認為是一個箱子,請看第二張圖,你到底憑什麼判斷是一個箱子?

從貝葉斯出發,如何真正的理解算法?

從貝葉斯出發,如何真正的理解算法?

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

那麼,如何證明?

我們可以很容易用貝葉斯來解釋這個生活常識問題,假如A1代表認為是一個箱子,A2代表二個箱子,B代表觀察到的事件,則其實求解P(A1/B)、P(A2/B)哪個概率最大?

P(A1/B)=P(B/A1)/P(B)*P(A1)

P(A2/B)=P(B/A2)/P(B)*P(A2)

顯然P(B/A2)猜測後面是兩個箱子使得我們的觀測結果成為小概率的時候,我們才會說才怪呢?哪能這麼巧呢?

6、中文分詞問題

中文分詞領域就用到了貝葉斯,分詞問題的描述為:給定一個句子(字串),如:南京市長江大橋,如何對這個句子進行分詞(詞串)才是最靠譜的,例如:

1. 南京市/長江大橋

2. 南京市長/江大橋

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

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

P(A分詞/B句子)=P(B/A)/P(B)*P(A)

由於P(B)對於每個A都一樣,P( B/A )近似為1,則P(A/B)主要由P(A)決定,也就是要尋找一種分詞A使得這個句子B的概率最大化。

如何計算一個詞串,A=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 個詞(1個詞就是樸素貝葉斯),這個就是所謂的“有限地平線”假設。

雖然這個假設很傻很天真,但結果卻表明它的結果往往是很好很強大的,現在式子變成了:P(W1) * P(W2|W1) * P(W3|W2) * P(W4|W3) ..。

對於我們上面提到的例子“南京市長江大橋”由於“南京市長”和“江大橋”在語料庫中一起出現的頻率為 0 ,這個整句的概率便會被判定為 0 ,從而使得“南京市/長江大橋”這一分詞方式勝出。

其他應用案例比如:

垃圾郵件識別(過濾器):P(A(垃圾郵件)/B(N個單詞組成的垃圾郵件));

統計機器翻譯:P(A(翻譯成的外文)/B(待翻譯的句子));

語音識別:P(A(推測出發送的句子)/B(觀測到的語音信號));

7、一個具體計算案例

一般人中艾滋病的攜帶者比例是0.01%,如果一個人檢測血液呈陽性,其得艾滋的概率是多少?(如果是真艾滋,血液檢測的準確性達到99.9%,如果是假艾滋,血液檢測準確率是99.99%)。

P(A(得艾滋)/B(檢測呈陽性))= P(B/A)/P(B)*P(A)=99.9%/(0.01%*99.9%+99.9%*0.01%)*0.01%=50%。

真沒想到,在這麼高的血液檢測準確性條件下,一個檢測血液呈陽性的人真得艾滋的概率也只有50%。

直觀解釋:隨機找1萬人做實驗,根據分佈,只有1人得艾滋,由於檢測手段強,這個人會被檢測出來,但剩下的9999人雖然沒艾滋,但檢測出艾滋的概率由於0.01%,還是有1人被錯誤檢測,因此共有2人檢測成陽性,得艾滋的概率為50%。

因此,如果一個事情很罕見,即先驗概率很低,即使再多的可疑事實出現,也要注意可能誤判,比如不要對抓特務報太大信心!

筆者學習貝葉斯也是東看看,西看看,看了忘,忘了看,這次把學習的綜合寫成一篇還算易懂的文章,算是了卻一個心願,對於任何一個公式一定要在業務上搞懂搞透,起碼能自圓其說吧,貝葉斯算是好懂的,但很多算法不是這樣,公式的推導就已經讓人發瘋,更別提搞懂來龍去脈甚至跟生活去接軌了,從歷史上看,牛人一般也只願意show 結果,而不願意把思考過程寫下來,比如費馬定理的證明,這個非常遺憾。

好了,貝葉斯介紹完了,如果你真的看到這裡,是否對於其思想有一個新的理解?作為傳統企業的一個技術人員,其實對於算法的掌控深度是非常糾結的,因為即使理解透了也可能於工作無益,這並非是性價比很高的方式,工程上能搞定就可以了。

但筆者想的是,這是一種學習方式,也許不用那麼功利,自己覺得值就去幹吧,沒有誰能說現在學哪個知識就一定將來有用,或者沒用,未來是如此不確定,在這個大數據時代。


分享到:


相關文章: