1、生成學習算法(Generative Learning Algorithm)
1.1、判別模型與生成模型
判別模型:訓練出一個總模型,把新來的樣本放到這個總模型中,直接判斷這個新樣本是貓還是狗。
生成模型:先訓練出一個貓的模型,再訓練出一個狗的模型。把新來的樣本放到貓的模型裏,看它生成的概率是多少,再把它放到狗的模型裏,看它生成的概率是多少。如果用貓的模型生成的概率比較大,就把新樣本判斷爲貓,如果用狗的模型生成的概率比較大,就把新樣本判斷爲狗。
- |
判別模型 |
生成模型 |
區別 |
反映異類數據之間的差異 |
反映同類數據之間的相似度 |
形式化 |
直接對p(y∣x) 建模 |
對p(x∣y) 建模,再求p(y∣x) |
生產性能 |
高(直接判斷) |
低(逐個生成概率並對比) |
學習難度 |
簡單,容易學習 |
複雜,較難學習 |
轉化關係 |
判別模型不能轉化爲生成模型 |
生成模型能轉化爲判別模型 |
其他 |
黑盒,不可視; 能清晰分辨出各類差異特徵; 使用範圍更廣 |
研究單類問題更靈活; 可以把整個場景描述出來; 要滿足特定條件才能使用 |
常見模型 |
logistic迴歸; SVM; 神經網絡等 |
高斯判別分析; 貝葉斯算法; 隱馬爾科夫模型等 |
1.2、生成模型的一般做法
因爲目前還沒有做過相關工程,而且本人也還只是處於學習階段,下面只是一些自己的總結,若有錯誤的地方,請指正。
判別模型是直接對p(y∣x) 建模進行估計,生成模型是先求p(x∣y) 再求p(y∣x) ,它們之間是怎麼轉換的?
首先引出貝葉斯規則:
p(y∣x)=p(x∣y)p(y)p(x)(1)
再配合上聯合概率我一般是這麼記的,這樣就可以隨便切來切去不會搞混了:
p(y∣x)p(x)=p(x,y)=p(x∣y)p(y)(2)
上面說了,我們需要生成一個貓的模型:
p(y=貓∣x)=p(x∣y=貓)p(y=貓)p(x)(3)
再生成一個狗的模型:
p(y=狗∣x)=p(x∣y=狗)p(y=狗)p(x)(4)
然後比較是
p(y=貓∣x) “這個樣本是貓的概率”更大,還是
p(y=狗∣x) “這個樣本是狗的概率”更大。
我們可以看到(3)式和(4)式的分母是一樣的,就只比較分子的大小,所以問題就變成了是
p(x∣y=貓)p(y=貓) 更大還是
p(x∣y=狗)p(y=狗) 更大。
形式化一下就是:
argmaxyp(y∣x)=argmaxyp(x∣y)p(y)(5)
p(y) ,先驗概率(Prior),表示:對於給定觀測數據,一個猜測是好是壞,取決於“這個猜測本身獨立的可能性大小”,比如貓或者狗在我們的生活中出現的頻率(這個看起來是一樣的,但如果是狗和狼,就有
p(y=狗)>p(y=狼) ,因爲狼比狗更常見);
p(x∣y) ,似然性(Likelihood),表示:“這個猜測生成我們觀測到的數據的可能性大小”。(如果樣本里有一項特徵表達出“鼻子較長”這個信息,那麼假設樣本是貓的同時觀察到“鼻子較長”,和假設樣本是狗的同時觀察到“鼻子較長”的可能性是不一樣的,明顯後者的可能性更高)
每一個猜測都有屬於自己的先驗概率p(y=n) 與似然性p(x∣y=n) 的乘積,用來對p(y=n∣x) 做估計,表示“同一組輸入產生的每個猜測的可能性大小”。
比如同一組數據x ,通過對p(y=n)p(x∣y=n) 的建模與計算,產生了p(y=貓∣x) 、p(y=狗∣x) 、p(y=狼∣x) 三個概率,通過對比這三個概率的大小,選取概率最大的那個猜測作爲最終的預測結果,這就是生成模型的一般做法。
2、高斯判別分析(Gaussian Discriminant analysis)
高斯判別分析(GDA)名字中雖然有“判別”二字,卻是地地道道的生成算法。
GDA解決的是連續型隨機變量的分類問題。
什麼是連續型隨機變量呢?舉兩個例子:
公交車15分鐘一趟,某人的等車時間x 是區間[0,15) 中的一個數,x 是連續型隨機變量,因爲x 可以取小數甚至無理數。
拋20枚硬幣,硬幣朝上的數量x 只能取0 ~20 之間的整數,不能取0.1,3√ 這樣的小數或者無理數,所以這裏的x 是離散型隨機變量。
而且只有連續型隨機變量的分佈函數可以積分,得到概率密度函數,這樣才能用多元高斯分佈對p(x∣y) 建模,進而使用高斯判別式啊。
下面給出高斯判別分析的假設:
y ~Bernoulli(ϕ)
x∣y=0 ~N(μ0,Σ)
x∣y=1 ~N(μ1,Σ)
接着給出一個
k 維向量
x ,以
(μ,Σ) 爲參數的多元高斯分佈原始定義爲:
f(x)=12πk|Σ|−−−−−−√exp(−12(x−μ)TΣ−1(x−μ))(6)
由此可以得到下面的分佈(
x 是n維向量):
p(y)p(x∣y=0)p(x∣y=1)=ϕy(1−ϕ)1−y=12πn|Σ|−−−−−−√exp(−12(x−μ0)TΣ−1(x−μ0))=12πn|Σ|−−−−−−√exp(−12(x−μ1)TΣ−1(x−μ1))(7)
這裏有先驗概率
p(y) (因爲是伯努利分佈,所以
y 的取值是0或者1),具體猜測的似然性
p(x∣y=0) 與
p(x∣y=1) ,在生成模型中,會對
p(y=n)p(x∣y=n) 進行計算,分別得到輸入
x 被分類爲0與被分類爲1的概率,然後再對這兩個概率進行比較,取較大的那個最爲分類結果。
而這些分佈裏面一共有
ϕ,μ0,μ1,Σ 4個參數,如果我們求得了這幾個參數,就可以對實際的輸入
x 進行計算了。
進一步地,得到我們的似然函數(m是樣本數量):
l(ϕ,μ0,μ1,Σ)=log∏i=1mp(x(i),y(i);ϕ,μ0,μ1,Σ)=log∏i=1mp(x(i)∣y(i);μ0,μ1,Σ)p(y(i);ϕ)(8)
然後通過最大似然估計得到我們的參數:
ϕμ0μ0Σ=1m∑i=1mI{y(i)=1}=∑mi=1I{y(i)=0}x(i)∑mi=1I{y(i)=0}=∑mi=1I{y(i)=1}x(i)∑mi=1I{y(i)=1}=1m∑i=1m(x(i)−μ(i)y)(x(i)−μ(i)y)T(9)
ϕ :
y 的取值是1的樣本在整個樣本集中的比例;
μ0 :
y 的取值是0的特徵均值;
μ1 :
y 的取值是1的特徵均值;
Σ :樣本特徵方差均值。
下面是講義裏給出的一個分類結果的圖:
3、樸素貝葉斯(Naive Bayes)
3.1、具體例子-文本分類
GDA針對的是特徵向量x 是連續值的問題,樸素貝葉斯針對的是特徵向量x 是 離散值的問題。但是對於特徵是連續值的情況,我們也可以採用分段的方法來將連續值轉化爲離散值:
樸素貝葉斯算法的標準應用也是最常見的的應用就是文本分類問題,例如郵件是否爲垃圾郵件的分類。
樸素貝葉斯也是生成模型,按照前面提到的生成模型的一般做法,我們應該先計算出一封郵件是垃圾郵件的概率,再計算出這封郵件不是垃圾郵件的概率,取較大的那個概率爲分類結果。
對此,我們假設y=1 表示分類結果爲垃圾郵件,y=0 表示分類結果爲非垃圾郵件,向量x 表示需要判斷的郵件本身,它由n 個單詞組成。
那麼,這封郵件是垃圾郵件的概率爲:
p(y=1∣x)=p(x∣y=1)p(y=1)p(x)=p(x∣y=1)p(y=1)p(x∣y=1)p(y=1)+p(x∣y=0)p(y=0)(10)
同樣地,我們可以得到這封郵件不是垃圾郵件的概率爲:
p(y=0∣x)=p(x∣y=0)p(y=0)p(x)=p(x∣y=0)p(y=0)p(x∣y=1)p(y=1)+p(x∣y=0)p(y=0)(11)
又因爲要比較這兩者的大小,它們的分母又一樣,所以我們只需要比較
p(x∣y=1)p(y=1) 與
p(x∣y=0)p(y=0) 的大小即可得到分類結果。
目前爲止都還只是很一般性的推導,樸素貝葉斯體現在哪裏?在郵件x 上。
前面說到要用向量x 來表示一封郵件,具體要怎麼表示?然後怎麼對上面的一般性式子做進一步的處理?
講義裏給出了兩種用向量表示郵件的方法,進而推導出了兩種模型,一種稱爲多元伯努利事件模型(Multivariate Bernoulli Event Model,以下簡稱NB-MBEM),另一種稱爲多項式事件模型(Multivariate Event Model,以下簡稱NB-MEM),下面就對這兩個模型進行說明。
3.2、文本表示方法一——多元伯努利事件模型(NB-MBEM)
在多元伯努利模型下(NB-MBEM),一封郵件的特徵向量可以表示成如下形式:
x=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢x1x2x3⋮x4123⋮x50000⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢100⋮1⋮0⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥aaardvarkconony⋮buy⋮qwerr(12)
在此模型下,向量
x 是一本詞典,它的每一個元素都是一個單詞,對於詞典中的每一個詞都有一個向量中對應的元素
xi 作爲標記,
xi 的取值爲0或者1,1表示郵件中這個詞出現過,0表示這個詞沒有出現過。
接着因爲我們要求p(x∣y) ,假設x 中的特徵是條件獨立的(條件獨立與獨立不同),這個稱爲樸素貝葉斯假設。
P(X,Y∣Z)=P(X∣Z)P(Y∣Z)(13)
上面的式子表示,在給定Z的情況下,X與Y條件獨立。
還要引出鏈式規則:
P(X1,X2,⋯,Xn)=P(X1)P(X2∣X1)⋯P(Xn∣X1,X2,⋯,Xn−1)(14)
可以看到,當
n=2 的時候,它的形式跟(2)式是一樣的,當
n=3 的時候,我們可以來推導一下:
P(X1,X2,X3)=P(X3,X1,X2)=P(X3∣X1,X2)P(X1,X2)=P(X3∣X1,X2)P(X2,X1)=P(X3∣X1,X2)P(X2∣X1)P(X1)=P(X1)P(X2∣X1)P(X3∣X1,X2)(15)
這跟式(14)的形式是一致的。
由鏈式規則與條件獨立假設,我們對p(x∣y) 有如下展開:
p(x∣y)=p(x1,⋯,x50000∣y)=p(x1∣y)p(x2∣y,x1)p(x3∣y,x1,x2)⋯p(x50000∣y,x1,⋯,x49999)=p(x1∣y)p(x2∣y)p(x3∣y)⋯p(x50000∣y)=∏j=1np(xj∣y)(16)
這裏的
xj 只能取值爲0或者1,所以
xj∣y 實際上是一個伯努利分佈。
回到我們的式(10)與式(11),我們有(這裏省去了分母):
p(y=1∣x)=p(x∣y=1)p(y=1)=(∏j=1np(xj=1∣y=1))p(y=1)(17)
p(y=0∣x)=p(x∣y=0)p(y=0)=(∏j=1np(xj=1∣y=0))p(y=0)=(∏j=1np(xj=1∣y=0))(1−p(y=1))(18)
這樣我們就得到了下面的參數:
p(y=1)=ϕy(19)
p(xj=1∣y=1)=ϕj∣y=1(20)
p(xj=1∣y=0)=ϕj∣y=0(21)
又到了求參數的時間,我們希望模型在訓練數據上概率積能達到最大(m爲樣本數量,n爲詞典中單詞的數量),所以有:
L(ϕy,ϕj∣y=1,ϕj∣y=0)=∏i=1mp(x(i),y(i))=∏i=1mp(x(i)∣y(i))p(y(i))=∏i=1m(∏j=1np(x(i)j∣y(i);ϕj∣y=1,ϕj∣y=0))p(y(i);ϕy)(22)
對其做最大似然估計就得到了參數值,帶入式(17)與式(18)中即可對新樣本進行分類:
p(y=1)=ϕy=∑mi=1I{y(i)=1}m=垃圾郵件數量總樣本郵件數量(23)
p(xj=1∣y=1)=ϕj∣y=1=∑mi=1I{(x(i)j=1)Λ(y(i)=1)}∑mi=1I{y(i)=1}=出現了詞典中第j個詞的垃圾郵件的數量樣本中垃圾郵件的數量(24)
p(xj=1∣y=0)=ϕj∣y=0=∑mi=1I{(x(i)j=1)Λ(y(i)=0)}∑mi=1I{y(i)=0}=出現了詞典中第j個詞的非垃圾郵件的數量樣本中非垃圾郵件的數量(25)
以上就是最基本的樸素貝葉斯方法。
3.3、文本表示方法二——多項式事件模型(NB-MEM)
在上面的在多元伯努利模型(NB-MBEM)下,向量x 是一本詞典,每個詞用0或者1標記,詞典裏被標記了1的單詞組成了我們的郵件(式(12)):
x=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢x1x2x3⋮x4123⋮x50000⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢100⋮1⋮0⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥aaardvarkconony⋮buy⋮qwerr
雖然上一節裏推導出了這種表示形式下的解法,但是
x 未免維數太大了,有沒有另外的表示方法可以降低
x 的維度,同時得到類似的效果?
那就是在多項式事件模型(NB-MEM)下,第二種郵件的特徵向量表示形式了:
x=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢x1x2x3⋮x36⋮x125⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢460003700018000⋮1⋮16000⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥theproductis⋮a⋮it(26)
向量
x 在這裏不再是一本詞典,而是郵件本身,每一個元素都是郵件中的一個單詞,對應地,向量
x 中每個元素的取值不再是0或者1,而是
[1,2,⋯,|V|] 裏的整數(
|V|] 是詞典中單詞的個數),表示郵件中某個單詞在詞典中的位置(比如“the”是詞典中的第46000個單詞,“a”是第一個單詞)
在多項式事件模型(NB-MEM)中,我們假設一封郵件是由隨機過程生成的。首先確定這封郵件是垃圾或者非垃圾郵件(p(y) ),在此前提下,我們假設郵件中的第一個單詞x1 是根據多項式分佈來確認的(p(x1∣y) ),第二個單詞x2 在與x1 條件獨立的情況下,通過同一個多項式分佈來確定,再以同樣的方式確定x3 、x4 等,直到這封郵件被生成。
所以,同樣地,我們對p(x∣y) 展開:
p(x∣y)=p(x1,⋯,x125∣y)=p(x1∣y)p(x2∣y,x1)p(x3∣y,x1,x2)⋯p(x125∣y,x1,⋯,x124)=p(x1∣y)p(x2∣y)p(x3∣y)⋯p(x124∣y)=∏j=1np(xj∣y)(27)
形式上看起來跟式(16)是一樣的,但是
xj∣y 在這裏是多項式分佈,不再是伯努利分佈。
而且這裏n的取值不是再是詞典的中單詞的個數,而是郵件中單詞的個數;同時
xj 的取值不再是0或者1,而是1~詞典中單詞的個數
|V| 。
同樣地,我們有省去分母的垃圾郵件模型與非垃圾郵件模型:
p(y=1∣x)=p(x∣y=1)p(y=1)=(∏j=1np(xj=k∣y=1))p(y=1)(28)
p(y=0∣x)=p(x∣y=0)p(y=0)=(∏j=1np(xj=k∣y=0))p(y=0)=(∏j=1np(xj=k∣y=0))(1−p(y=1))(29)
這裏的
k 表示詞典中的第
k 個單詞。
於是我們有如下參數:
p(y=1)=ϕy(30)
p(xj=k∣y=1)=ϕk∣y=1(31)
p(xj=k∣y=0)=ϕk∣y=0(32)
並得到幾乎一樣的似然函數:
L(ϕy,ϕk∣y=1,ϕk∣y=0)=∏i=1mp(x(i),y(i))=∏i=1m(∏j=1np(x(i)j∣y(i);ϕk∣y=1,ϕk∣y=0))p(y(i);ϕy)(33)
對其做最大似然估計,最終得到如下參數:
p(y=1)=ϕy=∑mi=1I{y(i)=1}m=垃圾郵件數量總樣本郵件數量(34)
p(xj=k∣y=1)=ϕk∣y=1=∑mi=1∑nij=1I{(x(i)j=k)Λ(y(i)=1)}∑mi=1I{y(i)=1}ni=所有垃圾郵件裏出現詞典中第k個單詞的總次數樣本中所有垃圾郵件的單詞的總數量(35)
p(xj=k∣y=0)=ϕk∣y=0=∑mi=1∑nij=1I{(x(i)j=k)Λ(y(i)=0)}∑mi=1I{y(i)=0}ni=所有非垃圾郵件裏出現詞典中第k個單詞的總次數樣本中所有非垃圾郵件的單詞的總數量(36)
我們可以看到,在用兩種向量x 來表示同樣的郵件樣本的時候,第二種方法NB-MEM中向量x 的規模遠遠小於第一種方法NB-MBEM中向量x 的規模,但是最終得到的參數規模幾乎是一樣的——
ϕy 都表示垃圾郵件的概率;
第一種方法NB-MBEM的參數ϕj 裏的j 取值範圍是詞典中單詞的數量,
第二種方法NB-MEM的參數ϕk 裏的k 取值範圍也是詞典中單詞的數量。
這表示詞典中的每一個單詞都有屬於自己的一個概率值ϕ[jk] ,如果這本詞典裏有50000個單詞,那麼就會有50000個ϕ[jk] 。而且,還是兩份ϕ[jk] ,垃圾郵件一份,非垃圾郵件一份,如果分類結果多起來,還會乘上與分類數目相同的份數。既然如此,區別這兩個方法的意義何在?
回到我們最開始的地方,樸素貝葉斯是生成學習算法,生成學習算法的一般做法是分別做一個貓的模型與一個狗的模型,把新模型分別放到這兩個模型中比較所得概率的大小。
在這裏的文本分類中,我們對應地要分別做出一個垃圾郵件的模型與一個非垃圾郵件的模型,新郵件到來之後,把它分別放到這兩個郵件模型中,看它是垃圾郵件的概率更大還是非垃圾郵件的概率更大。
以垃圾郵件的模型來看,我們最終使用參數的地方在:
式(17),NB-MBEM——p(y=1∣x)=(∏nj=1p(xj=1∣y=1))p(y=1) ;
與式(28),NB-MEM——p(y=1∣x)=(∏nj=1p(xj=k∣y=1))p(y=1)
這兩個式子中p(y=1) 都表示新樣本是垃圾郵件的概率,區別就在於連乘的後驗概率p(x∣y=1)=ϕ[jk]∣y=1 了,直觀上來看僅是xj 的取值從1變成了k而已。
但是,在式(17)中,向量x 是詞典,這裏的n是詞典中單詞的數量,如果該詞典中有50000個單詞,n就等於50000,所以每計算一個新樣本是垃圾郵件的概率,都必須把50000個ϕj 連乘起來;
在式(28)中,向量x 是郵件本身,n是郵件中單詞的數量,如果新樣本郵件中有125個單詞,那麼n等於125,每計算一個新樣本是垃圾郵件的概率只需要把125個ϕk 做連乘。
雖然兩個方法都需要計算出50000∗2 個ϕ[jk] ,但是在NB-MBEM中,每個ϕj 在每一次分類時都會被使用;而在NB-MEM中,只有該單詞在郵件中出現了,該ϕk 纔會被使用。
正常來看,一本詞典中單詞的數量是遠遠多於一封郵件中單詞的數量的,所以明顯後者的效率更高。
3.4、拉普拉斯平滑(Laplace smoothing)
上面的推導已經告一段落,但以上面的形式來看,還面臨着一個致命的問題:樸素貝葉斯方法對數據稀疏的問題過於敏感。
比如,單詞“go”沒有在某類樣本郵件中出現過,這就會使得求得的某個參數ϕ[jk]=0 ,如果這個時候新樣本中出現了“go”這個單詞,那麼這個等於0的ϕ[jk] 是要拿來做連乘的,一旦乘起來就出事了,結果是0,這顯然是不合理的,不能因爲某個單詞沒有出現過就判斷這個郵件肯定不屬於這一類。
爲了解決這個問題,我們應該給未出現過的特徵值對應的參數,賦予一個很小的值,而不是0。
對於一個隨機變量z ,它的取值範圍是{1,2,3,⋯,k },對於m次試驗後的觀測結果{z(1),z(2),z(3),⋯,z(m) },最大似然估計按照下式計算:
ϕj=∑mi=1I{z(i)=j}m(37)
並有
∑mj=1ϕj=1
使用拉普拉斯平滑,它的具體做法是假設每個特徵值都出現過一次,公式變爲:
ϕj=∑mi=1I{z(i)=j}+1m+k(38)
也有
∑mj=1ϕj=1
形象一點。拋一個骰子,它的取值範圍是{1,2,3,4,5,6 },10次試驗後 的結果是{3,4,3,4,5,6,3,4,5,6 },式(37)表示“某個結果出現的次數在總試驗次數中的比例”,它們的概率累加爲1就顯得自然而然了,而這裏分子的主體是拋骰子的結果,每個結果都多出現一次,那分母要加上6即k=6 才能繼續保持概率累加爲1。
回到NB-MBEM與NB-MEM的參數ϕ[jk] 中,我們要對式(24)(25)與式(35)(36)做拉普拉斯平滑,使得ϕ[jk] 不爲0。
NB-MBEM:
p(xj=1∣y=1)=ϕj∣y=1=∑mi=1I{(x(i)j=1)Λ(y(i)=1)}+1∑mi=1I{y(i)=1}+2(39)
p(xj=1∣y=0)=ϕj∣y=0=∑mi=1I{(x(i)j=1)Λ(y(i)=0)}+1∑mi=1I{y(i)=0}+2(40)
在這裏,式子的主體是郵件(參看式(24)(25)中其所表達的意義),郵件可能的取值有兩個,垃圾郵件或非垃圾郵件,所以
k=2 。
NB-MEM:
p(xj=k∣y=1)=ϕk∣y=1=∑mi=1∑nij=1I{(x(i)j=k)Λ(y(i)=1)}+1∑mi=1I{y(i)=1}ni+|V|(41)
p(xj=k∣y=0)=ϕk∣y=0=∑mi=1∑nij=1I{(x(i)j=k)Λ(y(i)=0)}+1∑mi=1I{y(i)=0}ni+|V|(42)
在這裏,式子的主體是單詞(參看式(35)(36)中其所表達的意義),單詞的取值就多了,{
1,2,3,⋯,|V| },所以
k=|V| ,這樣才能保證其概率累加和仍然爲1。
經過這樣的處理,就算某個單詞在訓練樣本中未出現,在新樣本分類時出現了,也不會使某個ϕ[jk]=0 ,而是會賦予它一個較小的值,避免了某個分類結果直接變成0的情況,讓分類過程更合理。