形式最簡單的定理往往是最好的定理,比如說中心極限定理,這樣的定理往往會成為某一個領域的理論基礎。機器學習的各種算法中使用的方法,最常見的就是貝葉斯定理。
貝葉斯定理的發現過程我沒有找到相應的資料,不過我相信託馬斯.貝葉斯(1702-1761)是通過生活中的一些小問題去發現這個對後世影響深遠的定理的,而且我相信貝葉斯發現這個定理的時候,還不知道它居然有這麼大的威力呢。下面我用一個小例子來推出貝葉斯定理:
已知:有N個蘋果,和M個梨子,蘋果為黃色的概率為20%,梨子為黃色的概率為80%,問,假如我在這堆水果中觀察到了一個黃色的水果,問這個水果是梨子的概率是多少。
用數學的語言來表達,就是已知P(apple) = N / (N + M), P(pear) = M / (N + M), P(yellow|apple) = 20%, P(yellow|pear) = 80%, 求P(pear|yellow).
要想得到這個答案,我們需要 1. 要求出全部水果中為黃色的水果數目。 2. 求出黃色的梨子數目
對於1) 我們可以得到 P(yellow) * (N + M), P(yellow) = p(apple) * P(yellow|apple) + P(pear) * p(yellow|pear)
對於2) 我們可以得到 P(yellow|pear) * M
2) / 1) 可得:P(pear|yellow) = P(yellow|pear) * p(pear) / [P(apple) * P(yellow|apple) + P(pear) * P(yellow|pear)]
化簡可得:P(pear|yellow) = P(yellow,pear) / P(yellow), 用簡單的話來表示就是在已知是黃色的,能推出是梨子的概率P(pear|yellow)是黃色的梨子佔全部水果的概率P(yellow,pear)除上水果顏色是黃色的概率P(yellow). 這個公式很簡單吧。
我們將梨子代換為A,黃色代換為B公式可以寫成:P(A|B) = P(A,B) / P(B), 可得:P(A,B) = P(A|B) * P(B).貝葉斯公式就這樣推出來了。
本文的一個大概的思路:先講一講我概括出的一個基本的貝葉斯學習框架,然後再舉幾個簡單的例子說明這些框架,最後再舉出一個複雜一點的例子,也都是以貝葉斯機器學習框架中的模塊來講解
二. 貝葉斯機器學習框架對於貝葉斯學習,我每本書都有每本書的觀點和講解的方式方法,有些講得很生動,有些講得很突兀,對於貝葉斯學習裡面到底由幾個模塊組成的,我一直沒有看到很官方的說法,我覺得要理解貝葉斯學習,下面幾個模塊是必須的:
1) 貝葉斯公式機器學習問題中有一大類是分類問題,就是在給定觀測數據D的情況下,求出其屬於類別(也可以稱為是假設h,h ∈ {h0, h1, h2…})的概率是多少, 也就是求出:
P(h|D), 可得:
P(h,D) = P(h|D) * P(D) = P(D|h) * P(h), 所以:P(h|D) = P(D|h) * P(h) / P(D), 對於一個數據集下面的所有數據,P(D),恆定不變。所以可以認為P(D)為常數, 得到:P(h|D) ∝ P(D|h) * P(h)。我們往往不用知道P(h|D)的具體的值,而是知道例如P(h1|D),P(h2|D)值的大小關係就是了。這個公式就是機器學習中的貝葉斯公 式,一般來說我們稱P(h|D)為模型的後驗概率,就是從數據來得到假設的概率,P(h)稱為先驗概率,就是假設空間裡面的概率,P(D|h)是模型的 likelihood概率。
Likelihood(似然)這個概率比較容易讓人迷惑,可以認為是已知假設的情況下,求出從假設推出數據的概率,在實際的機器學習過程中,往往加入了很多的假設,比如一個英文翻譯法文的問題:
給出一個英文句子,問哪一個法文句子是最靠譜的,P(f=法文句子|e=英文句子) = P(e|f) * p(f), p(e|f)就是likelihood函數,P(e|f) 寫成下面的更清晰一點:p(e|f∈{f1,f2…})可以認為,從輸入的英文句子e,推出了很多種不同的法文句子f,p(e|f)就是從這些法文句子中的某一個推出原句子e的概率。
本文之後的內容也將對文章中沒有提到的一些內容,也是貝葉斯學習中容易疑惑、忽略、但是很重要的問題進行一些解釋。
2) 先驗分布估計,likelihood函數選擇貝葉斯方法中,等號右邊有兩個部分,先驗概率與likelihood函數。先驗概率是得到,在假設空間中,某一個假設出現的概率是多少,比如說在街上看到一個動物是長有毛的,問1. 這個動物是哈巴狗的概率是多少,2. 這個動物是爪哇虎的概率是多少, 見下圖:
雖然兩個假設的likelihood函數都非常的接近於1(除非這個動物病了),但是由於爪哇虎已經滅絕了,所以爪哇虎的先驗概率為0,所以P(爪哇虎|有毛的動物)的概率也為0。
先驗概率分布估計在觀測的時候,對於變量是連續的情況下,往往需要一個先驗分布來得到稀疏數據集中沒有出現過的,給出的某一個假設,在假設空間中的概率。比如說有一個很大很大的均勻金屬圓盤,問這個金屬圓盤拋到空中掉下來,正面朝上的概率,這個實驗的成本比較高(金屬圓盤又大又重),所以只能進行有限次數的實驗,可能出現的是,正面向上4次,反面向上1次,但是我們如果完全根據這個數據集去計算先驗概率,可能會出現很大的偏差。不過由於我們已知圓盤是均勻的,我們可以根據這個知識,假設P(X=正面) = 0.5。
我們有的時候,已知了分布的類型,但是不知道分布的參數,還需要根據輸入的數據,對分布的參數進行估計、甚至對分布還需要進行一些修正,以滿足我們算法的需求:比如說我們已知某一個變量x的分布是在某一個連續區間均勻分布,我們觀察了1000次該變量,從小到大排序結果是:1,1.12,1.5 … 199.6, 200, 那我們是否就可以估計變量的分布是從[1,200]均勻分布的?如果出現一個變量是0.995,那我們就能說P(0.995) = 0?如果出現一個200.15怎麼辦呢?所以我們這個時候可能需要對概率的分布進行一定的調整,可能在x<1,x>200的範圍內的概率是一個下降的直線,整個概率密度函數可能是一個梯形的,或者對區域外的值可以給一個很小很小的概率。這個我在之後還將會舉出一些例子來說明。
Likelihood函數選擇對於同一個模型,likelihood函數可能有不同的選擇,對於這些選擇,可能有些比較精確、但是會搜索非常大的空間,可能有些比較粗糙,但是速度會比較快,我們需要選擇不同的likelihood函數來計算後驗概率。對於這些Likelihood函數,可能還需要加上一些平滑等技巧來使得最大的降低數據中噪聲、或者假設的缺陷對結果的影響。
我所理解的用貝葉斯的方法來估計給定數據的假設的後驗概率,就是通過prior * likelihood,變換到後驗分布。是一個分布變換的過程。
3) loss function(損失函數)x是輸入的數據,y(x)是推測出的結果的模型,t是x對應的真實結果,L(t,y(x))就是loss function,E[L]表示使用模型y進行預測,使用L作為損失函數的情況下,模型的損失時多少。通常來說,衡量一個模型是否能夠準確的得到結果,損失函數是最有效的一個辦法,最常用、最簡單的一種損失函數是:
不過我一直不知道為什麼這裡用的平方,而不是直接用絕對值,有詳細一點的解釋嗎?:-p
4) Model Selection(模型選擇)前文說到了對於likelihood函數可以有不同的選擇,對於先驗的概率也可以有不同的選擇,不過假設我們一個構造完整的測試集和一個恰當的損失函數,最終的結果將會是確定的,量化的,我們很容易得到兩個不同參數、方法的模型的優劣性。不過通常情況下,我們的測試集是不夠完整,我們的損失函數也是不那麼 的精確,所以對於在這個測試集上表現得非常完美的模型,我們常常可能還需要打一個問號,是否是訓練集和測試集過於相像,模型又過於複雜。導致了over-fitting(後文將會詳細介紹over-fitting的產生)?
Model Selection本質上來說是對模型的複雜度與模型的準確性做一個平衡,本文後面將有一些類似的例子。
Example 1:Sequential 概率估計註:此例子來自PRML chapter 2.1.1
對於概率密度的估計,有很多的方法,其中一種方法叫做Sequential 概率估計。
這種方法是一個增量的學習過程,在每看到一個樣本的時候都是把之前觀測的數據作為先驗概率,然後在得到新數據的後驗概率後,再把當前的後驗概率作為下一次預測時候的先驗概率。
傳統的二項式分布是:
由於傳統的二項式分布的概率μ是完全根據先驗概率而得到的,而這個先驗分布之前也提到過,可能會由於實驗次數不夠而有很大的偏差,而且,我們無法得知μ的分布,只知道一個μ的期望,這樣對於某些機器學習的方法是不利的。為了減少先驗分布對μ的影響,獲取μ的分布,我們加入了兩個參數,a,b,表示X=0與X=1的出現的次數,這個取值將會改變μ的分布,beta分布的公式如下:
對於不同a,b的取值,將會對μ的概率密度函數產生下面的影響:(圖片來自PRML)
在觀測數據的過程中,我們可以隨時的利用觀測數據的結果,改變當前μ的先驗分布。我們可以將Beta分布加入兩個參數,m,l,表示觀測到的X=0,X=1的次數。(之前的a,b是一個先驗的次數,不是當前觀測到的)
我們令:
a』,b』表示加入了觀測結果的新的a,b 。帶入原式,可以得到
我們可以利用觀測後的μ後驗概率更新μ的先驗概率,以進行下一次的觀測,這樣對不時能夠得到新的數據,並且需要real-time給出結果的情況下很有用。不過Sequential方法有對數據一個i.i.d(獨立同分布)的假設。要求每次處理的數據都是獨立同分布的。
Example 2:拼寫檢查這篇文章的中心思想來自:怎樣寫一個拼寫檢查器,如果有必要,請參見原文,本例子主要談談先驗分布對結果的影響。
直接給出拼寫檢查器的貝葉斯公式:
P(c|w)表示,單詞w(wrong)正確的拼寫為單詞c(correct)的概率,P(w|c)表示likelihood函數,在這裡我們就簡單的認 為,兩個單詞的編輯距離就是它們之間的likelihood,P(c)表示,單詞c在整體文檔集合中的概率,也就是單詞c的先驗概率。
我們在做單詞拼寫檢查的時候肯定會直觀的考慮:如果用戶輸入的單詞如果在字典中沒有出現過,則應該將其修正為一個字典中出現了的,而且與用戶輸入最接近的詞;如果用戶輸入的詞在字典中出現過了,但是詞頻非常的小,則我們可以為用戶推薦一個比較接近這個單詞,但是詞頻比較高的詞。
先驗概率P(c)的統計是一個很重要的內容,一般來說有兩種可行的辦法,一種是利用某些比較權威的詞頻字典,一種是在自己的語料庫(也就是待進行拼寫檢查的語料)中進行統計。我建議是用後面的方法進行統計,這樣詞的先驗概率才會與測試的環境比較匹配。比如說一個遊戲垂直搜索網站需要對用戶輸入的信息進行拼寫糾正,那麼使用通用環境下統計出的先驗概率就不太適用了。
Example 3:奧卡姆剃刀與Model Selection給出下面的一個圖:(來自Mackey的書)
問:大樹背後有多少個箱子?
其實,答案肯定是有很多的,一個,兩個,乃至N箱子都是有可能的(比如說後面有一連排的箱子,排成一條直線),我們只能看到第一個:
但是,最正確,也是最合理的解釋,就是一個箱子,因為如果大樹背後有兩個乃至多個箱子,為什麼從大樹正面看起來,兩邊的高度一樣,顏色也一樣,這樣是不是太巧合了。如果我們的模型根據這張圖片,告訴我們大樹背後最有可能有兩個箱子,這樣的模型的泛化能力是不是太差了。
所以說,本質上來說,奧卡姆剃刀,或者模型選擇,也是人生活中的一種通常行為的數學表示,是一種化繁為簡的過程。數學之美番外篇:平凡而又神奇的貝葉斯方法這篇文章中說的,奧卡姆剃刀工作在likelihood上,對於模型的先驗分布並沒有什麼影響。我這裡不太同意這個說法:奧卡姆剃刀是剪掉了複雜的模型,複雜的模型也是不常見的、先驗概率比較低的,最終的結果是選擇了先驗概率比較高的模型。
Example 4: 曲線擬合:(該例子來自PRML)
問題:給定一些列的點,x = {x1,x2...xn}, t = {t1,t2 .. tn}, 要求用一個模型去擬合這個觀測,能夠使得給定一個新點x', 能夠給出一個t'.
已知給定的點是由y=2πx加上正態分布的噪聲而得到的10個點,如上圖。為了簡單起見,我們用一個多項式去擬合這條曲線:
為了驗證我們的公式是否正確,我們加入了一個loss function:
在loss function最小的情況下,我們繪製了不同維度下多項式生成的曲線:
在M值增高的情況下,曲線變得越來越陡峭,當M=9的時候,該曲線除了可以擬合輸入樣本點外,對新進來的樣本點已經無法預測了。我們可以觀測一下多項式的係數:
可以看出,當M(維度)增加的時候,係數也膨脹得很厲害,為了消除這個係數帶來的影響,我們需要簡化模型,我們為loss function加入一個懲罰因子:
我們把w的L2距離乘上一個係數λ加入新的loss function中,這就是一個奧卡姆剃刀,把原本複雜的係數變為簡單的係數(如果要更具體的量化的分析,請見PRML 1.1節)。如果我們要考慮如何選擇最合適的維度,我們也可以把維度作為一個loss function的一部分,這就是Model Selection的一種。
但是這個問題還沒有解決得很好,目前我們得到的模型只能預測出一個準確的值:輸入一個新的x,給出一個t,但是不能描述t有什麼樣的概率密度函數。概率密度函數是很有用的。假如說我們的任務修正為,給出N個集合,每個集合裡面有若干個點,表示一條曲線,給出一個新的點,問這個新的點最可能屬於哪一條曲線。如果我們僅僅用新的點到這些曲線的距離作為一個衡量標準,那很難得到一個比較有說服力的結果。為了能夠獲取t值的一個分布,我們不妨假設t屬於一個均值為y(x),方差為1/β的一個高斯分布:
在之前的E(w),我們加入了一個w的L2距離,這個看起來有一點突兀的感覺,為什麼要加上一個這樣的距離呢?為什麼不是加入一個其他的東西。我們可以用一個貝葉斯的方法去替代它,得到一個更有說服力的結果。我們令p(w)為一個以0為均值,α為方差的高斯分布,這個分布為w在0點附近密度比較高,作為w的先驗概率,這樣在計算最大化後驗概率的時候,w的絕對值越小,後驗概率將會越大。
我們可以得到新的後驗概率:
這個式子看起來是不是有點眼熟啊?我們令λ=α/β,可以得到類似於之前損失函數的一個結果了。我們不僅還是可以根據這個函數來計算最優的擬合函數,而且可以得到相應的一個概率分布函數。可以為機器學習的很多其他的任務打下基礎。
這裡還想再廢話一句,其實很多機器學習裡面的內容都與本處所說的曲線擬合算法類似,如果我們不用什麼概率統計的知識,可以得到一個解決的方案,就像我們的第一個曲線擬合方案一樣,而且還可以擬合得很好,不過唯一缺少的就是概率分布,有了概率分布可以做很多的事情。包括分類、回歸等等都需要這些東西。從本質上來說,Beta分布和二項式分布,Dirichlet分布和多項式分布,曲線擬合中直接計算w和通過高斯分布估計w,都是類似的關係:Beta分布和Dirichlet分布提供的是μ的先驗分布。有了這個先驗分布,我們可以去更好的做貝葉斯相關的事情。
如果您覺得我們的內容對您還有點兒用,可以嘗試長按上圖二維碼打賞我們!^_^