1. 程式人生 > >斯坦福 機器學習-第二章 生成學習演算法

斯坦福 機器學習-第二章 生成學習演算法

CS229 Lecture notes

Part IV

生成學習演算法,Generative Learning algorithms

目前為止,我們講過的學習演算法的模型都是p (y|x;θ),也就是給定 x 下的 y 的條件分佈,以 θ 為引數。例如,邏輯迴歸中就是以 hθ(x) = g(θT x) 作為 p (y|x;θ) 的模型,這裡的 g 是一個 S型函式(sigmoid function)。接下來,咱們要講一下一種不同型別的學習演算法。

設想有這樣一種分類問題,我們要學習基於一個動物的某個特徵來辨別它是大象(y=1)還是小狗(y=0)。給定一個訓練集,用邏輯迴歸或者基礎版的感知器演算法(perceptron algorithm)這樣的一個演算法能找到一條直線,作為區分開大象和小狗的邊界。接下來,要辨別一個新的動物是大象還是小狗,程式就要檢查這個新動物的值落到了劃分出來的哪個區域中,然後根據所落到的區域來給出預測。

還有另外一種方法。首先,觀察大象,然後我們針對大象的樣子來進行建模。然後,再觀察小狗,針對小狗的樣子另外建立一個模型。最後要判斷一種新動物歸屬哪一類,我們可以把新動物分別用大象和小狗的模型來進比對,看看新動物更接近哪個訓練集中已有的模型。

例如邏輯迴歸之類的直接試圖建立 p(y|x)的演算法,以及感知器演算法(perceptron algorithm)等直接用投圖(mappings directly)的思路來判斷對應 X 的值落到了 {0, 1}中哪個區域的演算法,這些都叫判別式學習演算法(discriminative learning algorithms)。和之前的這些判別式演算法不同,下面我們要講的新演算法是對 p(x|y)和 p(y)來進行建模。這類演算法叫做生成學習演算法(generative learning algorithms

)。例如如果 y 是用來表示一個樣例是 小狗 (0) 或者 大象 (1),那麼p(x|y = 0)就是對小狗特徵的分佈的建模,而p(x|y = 1)就是對大象特徵分佈的建模。

對 p(y) (叫做 class priors,我沒找到合適的中文翻譯對應這個概念) 和p(x|y) 進行建模之後,我沒的演算法就是用貝葉斯規則(Bayes rule來推導對應給定的 x 的 y 的後驗分佈(posterior distribution

這裡的**分母(denominator)**為:p(x) = p(x|y = 1)p(y = 1) + p(x|y = 0)p(y = 0)(這個等式關係可以根據概率的標準性質來推導驗證,譯者注:其實就是條件概率),這樣接下來就可以把它表示成我們熟悉的 p(x|y)和 p(y) 的形式了。實際上如果我們計算p(y|x) 來進行預測,那就並不需要去計算這個分母,因為有下面的等式關係:

1 高斯判別分析(Gaussian discriminant analysis)

咱們要學的第一個生成學習演算法就是高斯判別分析(Gaussian discriminant analysis ,縮寫為GDA。譯者注:高斯真棒!)在這個模型裡面,我們假設 p(x|y)是一個多元正態分佈。所以首先咱們簡單講一下多元正態分佈的一些特點,然後再繼續講 GDA高斯判別分析模型。

1.1 多元正態分佈(multivariate normal distribution)

n維多元正態分佈,也叫做多變數高斯分佈,引數為一個均值n維向量μ ∈ Rn ,以及一個協方差矩陣Σ ∈ Rn×n,其中Σ ≥ 0 是一個對陣(symmetric)的半正定(positive semi-definite)矩陣。當然也可以寫成“N (μ, Σ)” 的分佈形式,密度(density)函式為:

在上面的等式中,“|Σ|”的意思是矩陣Σ的行列式(determinant)。對於一個在 N(μ,Σ)分佈中的隨機變數 X ,其平均值(跟正態分佈裡面差不多,所以並不意外)就是 μ了:

隨機變數Z是一個有值的向量(vector-valued random variable),Z 的協方差(covariance)的定義是:Cov(Z) = E[(Z _ E[Z])(Z _ E[Z])T ]。這是對實數隨機變數的方差(variance)這一概念的泛化擴充套件。這個協方差還可以定義成Cov(Z) = E[ZZT](E[Z])(E[Z])T(你可以自己證明一下這兩個定義實際上是等價的。)如果 X 是一個多變數正態分佈,即 X N (μ, Σ),則有:

下面這些樣例是一些高斯分佈的密度圖,如下圖所示:

最左邊的圖,展示的是一個均值為0(實際上是一個2x1 的零向量)的高斯分佈,協方差矩陣就是Σ = I (一個 2x2的單位矩陣,identity matrix)。這種均值為0 並且協方差矩陣為單位矩陣的高斯分佈也叫做標準正態分佈。中間的圖中展示的是均值為0而協方差陣是0.6I 的高斯分佈的密度;最右邊的展示的是協方差陣Σ = 2I。從這幾個圖可以看出,隨著協方差矩陣Σ變大,高斯分佈的形態就變得更寬平(spread-out),而如果協方差矩陣Σ變小,分佈就會更加集中(compressed)。

來看一下更多的樣例:

上面這幾個圖展示的是均值為0,但協方差矩陣各不相同的高斯分佈,其中的協方差矩陣依次如下所示:

第一幅圖還跟之前的標準正態分佈的樣子很相似,然後我們發現隨著增大協方差矩陣Σ 的反對角線(off-diagonal)的值,密度影象開始朝著  45_ 方向 (也就是 x1 = x2 所在的方向)逐漸壓縮(compressed)。 看一下三個同樣分佈密度圖的輪廓圖(contours)能看得更明顯:

下面的是另外一組樣例,調整了協方差矩陣Σ:

上面這三個影象對應的協方差矩陣分別如下所示:

從最左邊的到中間(譯者注:注意,左邊和中間的這兩個協方差矩陣中,右上和左下的元素都是負值!)很明顯隨著協方差矩陣中右上左下這個對角線方向元素的值的降低,影象還是又被壓扁了(compressed),只是方向是反方向的。最後,隨著我們修改引數,通常生成的輪廓圖(contours)都是橢圓(最右邊的圖就是一個例子)。

再舉一些例子,固定協方差矩陣為單位矩陣,即Σ = I,然後調整均值μ,我們就可以讓密度影象隨著均值而移動:

上面的影象中協方差矩陣都是單位矩陣,即 Σ = I,對應的均值μ如下所示:

1.2 高斯判別分析模型(Gaussian Discriminant Analysis model)

假如我們有一個分類問題,其中輸入特徵 x 是一系列的連續隨機變數(continuous-valued random variables),那就可以使用高斯判別分析(Gaussian Discriminant Analysis ,縮寫為 GDA)模型,其中對 p(x|y)用多元正態分佈來進行建模。這個模型為:

分佈寫出來的具體形式如下:

在上面的等式中,模型的引數包括φ, Σ, μ0 和 μ1。(要注意,雖然這裡有兩個不同方向的均值向量μ0 和 μ1,針對這個模型還是一般只是用一個協方差矩陣Σ。)取對數的似然函式(log-likelihood)如下所示:

通過使 l 取得最大值,找到對應的引數組合,然後就能找到該引數組合對應的最大似然估計,如下所示(參考習題集1):

用圖形化的方式來表述,這個演算法可以按照下面的圖示所表示:

圖中展示的點就是訓練資料集,圖中的兩個高斯分佈就是針對兩類資料各自進行的擬合。要注意這兩個高斯分佈的輪廓圖有同樣的形狀和拉伸方向,這是因為他們都有同樣的協方差矩陣Σ,但他們有不同的均值μ0 和 μ1 。此外,圖中的直線給出了p (y = 1|x) = 0.5 這條邊界線。在這條邊界的一側,我們預測 y = 1是最大可能的結果,而另一側,就估計 y = 0。

1.3 討論:高斯判別分析(GDA)與邏輯迴歸(logistic regression)

高斯判別分析模型與邏輯迴歸有很有趣的相關性。如果我們把變數(quantity)p (y = 1|x; φ, μ0, μ1, Σ) 作為一個 x 的函式,就會發現可以用如下的形式來表達:

其中的 θ 是對φ, Σ, μ0, μ1的某種函式。這就是邏輯迴歸(也是一種判別分析演算法)用來對p (y = 1|x) 建模的形式。

注:上面這裡用到了一種轉換,就是重新對x(i)向量進行了定義,在右手側(right-hand-side)增加了一個額外的座標x(i) = 1,然後使之成為了一個 n+1維的向量;具體內容參考習題集1。

這兩個模型中什麼時候該選哪一個呢?一般來說,高斯判別分析(GDA)和邏輯迴歸,對同一個訓練集,可能給出的判別曲線是不一樣的。哪一個更好些呢?

我們剛剛已經表明,如果p(x|y)是一個多變數的高斯分佈(且具有一個共享的協方差矩陣Σ),那麼p(y|x)則必然符合一個邏輯函式(logistic function)。然而,反過來,這個命題是不成立的。例如假如p(y|x)是一個邏輯函式,這並不能保證p(x|y)一定是一個多變數的高斯分佈。這就表明高斯判別模型能比邏輯迴歸對資料進行更強的建模和假設(stronger modeling assumptions)。這也就意味著,在這兩種模型假設都可用的時候,高斯判別分析法去擬合數據是更好的,是一個更好的模型。尤其當p(x|y)已經確定是一個高斯分佈(有共享的協方差矩陣Σ),那麼高斯判別分析是漸進有效的(asymptotically efficient)。實際上,這也意味著,在面對非常大的訓練集(訓練樣本規模 m 特別大)的時候,嚴格來說,可能就沒有什麼別的演算法能比高斯判別分析更好(比如考慮到對 p(y|x)估計的準確度等等)。所以在這種情況下就表明,高斯判別分析(GDA)是一個比邏輯迴歸更好的演算法;再擴充套件一下,即便對於小規模的訓練集,我們最終也會發現高斯判別分析(GDA)是更好的。

奈何事有正反,由於邏輯迴歸做出的假設要明顯更弱一些(significantly weaker),所以因此邏輯迴歸給出的判斷也更健壯(robust),也對錯誤的建模假設不那麼敏感。有很多不同的假設集合都能夠將p(y|x)引向邏輯迴歸函式。例如,如果x|y = 0 _ Poisson(λ0) 是一個泊松分佈,而x|y = 1 _ Poisson(λ1)也是一個泊松分佈,那麼p(y|x)也將是適合邏輯迴歸的(logistic)。邏輯迴歸也正適用於這類的泊松分佈的資料。但對這樣的資料,如果我們強行使用高斯判別分析(GDA),然後用高斯分佈來擬合這些非高斯資料,那麼結果的可預測性就會降低,而且GDA這種方法也許可行,也有可能是不能用。

總結一下也就是:高斯判別分析方法(GDA)能夠建立更強的模型假設,並且在資料利用上更加有效(比如說,需要更少的訓練集就能有“還不錯的”效果),當然前提是模型假設爭取或者至少接近正確。邏輯迴歸建立的假設更弱,因此對於偏離的模型假設來說更加健壯(robust)得多。然而,如果訓練集資料的確是非高斯分佈的(non-Gaussian),而且是有限的大規模資料(in the limit of large datasets),那麼邏輯迴歸幾乎總是比GDA要更好的。因此,在實際中,邏輯迴歸的使用頻率要比GDA高得多。(關於判別和生成模型的對比的相關討論也適用於我們下面要講的樸素貝葉斯演算法(Naive Bayes),但樸素貝葉斯演算法還是被認為是一個非常優秀也非常流行的分類演算法。)

2 樸素貝葉斯法(Naive Bayes)

在高斯判別分析(GDA)方法中,特徵向量 x 是連續的,值為實數的向量。下面我們要講的是當 xi 是離散值的時候來使用的另外一種學習演算法。

下面就來繼續看一個之前見過的樣例,來嘗試建立一個郵件篩選器,使用機器學習的方法。這回咱們要來對郵件資訊進行分類,來判斷是否為商業廣告郵件(就是垃圾垃圾垃圾郵件),還是非垃圾郵件。在學會了怎麼實現之後,我們就可以讓郵件閱讀器能夠自動對垃圾資訊進行過濾,或者單獨把這些垃圾郵件放進一個單獨的資料夾中。對郵件進行分類是一個案例,屬於文字分類這一更廣泛問題集合。

假設我們有了一個訓練集(也就是一堆已經標好了是否為垃圾郵件的郵件)。要構建垃圾郵件分選器,咱們先要開始確定用來描述一封郵件的特徵xi有哪些。

我們將用一個特徵向量來表示一封郵件,這個向量的長度等於字典中單詞的個數。如果郵件中包含了字典中的第 i 個單詞,那麼久令 xi = 1;反之則xi = 0。例如下面這個向量:

就用來表示一個郵件,其中包含了兩個單詞 “a” 和 “buy”,但沒有單詞 “aardvark”, “aardwolf” 或者 “zymurgy” 。這個單詞集合編碼整理成的特徵向量也成為詞彙表(vocabulary,),所以特徵向量 x 的維度就等於詞彙表的長度。

注:實際應用中並不需要遍歷整個英語詞典來組成所有英語單詞的列表,實踐中更常用的方法是遍歷一下訓練集,然後把出現過一次以上的單詞才編碼成特徵向量。這樣做除了能夠降低模型中單詞表的長度之外,還能夠降低運算量和空間佔用,此外還有一個好處就是能夠包含一些你的郵件中出現了而詞典中沒有的單詞,比如本課程的縮寫CS229。有時候(比如在作業裡面),還要排除一些特別高頻率的詞彙,比如像冠詞the,介詞of 和and 等等;這些高頻率但是沒有具體意義的虛詞也叫做stop words,因為很多文件中都要有這些詞,用它們也基本不能用來判定一個郵件是否為垃圾郵件。

選好了特徵向量了,接下來就是建立一個生成模型(generative model)。所以我們必須對p(x|y)進行建模。但是,假如我們的單詞有五萬個詞,則特徵向量n x ∈ {0, 1}50000 (即 x是一個 50000維的向量,其值是0或者1),如果我們要對這樣的 x進行多項式分佈的建模,那麼就可能有250000 種可能的輸出,然後就要用一個 (250000 _1)維的引數向量。這樣引數明顯太多了。

要給p(x|y)建模,先來做一個非常強的假設。我們假設特徵向量xi 對於給定的 y 是獨立的。這個假設也叫做樸素貝葉斯假設(Naive Bayes ,NB assumption),基於此假設衍生的演算法也就叫做樸素貝葉斯分選器(Naive Bayes classifier)。例如,如果 y = 1 意味著一個郵件是垃圾郵件;然後其中“buy” 是第2087個單詞,而 “price”是第39831個單詞;那麼接下來我們就假設,如果我告訴你 y = 1,也就是說某一個特定的郵件是垃圾郵件,那麼對於x2087 (也就是單詞 buy 是否出現在郵件裡)的瞭解並不會影響你對x39831 (單詞price出現的位置)的採信值。更正規一點,可以寫成 p(x2087|y) = p(x2087|y, x39831)。(要注意這個並不是說x2087 和 x39831這兩個特徵是獨立的,那樣就變成了p(x2087) = p(x2087|x39831),我們這裡是說在給定了 y 的這樣一個條件下,二者才是有條件的獨立。)

然後我們就得到了等式:

第一行的等式就是簡單地來自概率的基本性質,第二個等式則使用了樸素貝葉斯假設。這裡要注意,樸素貝葉斯假設也是一個很強的假設,產生的這個演算法可以適用於很多種問題。

我們這個模型的引數為 φi|y=1 = p (xi = 1|y = 1), φi|y=0 = p (xi = 1|y = 0), 而 φy = p (y = 1)。和以往一樣,給定一個訓練集{(x(i),y(i)); i = 1, ..., m},就可以寫出下面的聯合似然函式:

找到使聯合似然函式取得最大值的對應引數組合 φy , φi|y=0 和 φi|y=1 就給出了最大似然估計:

在上面的等式中,“∧”這個符號的意思是邏輯“和”。這些引數有一個非常自然的解釋。例如φj|y=1 is正是單詞 j 出現的郵件中垃圾郵件所佔(y = 1)的比例。

擬合好了全部這些引數之後,要對一個新樣本的特徵向量 x 進行預測,只要進行如下的簡單地計算:

然後選擇有最高後驗概率的概率。

最後我們要注意,剛剛我們對樸素貝葉斯演算法的使用中,特徵向量 xi 都是二值化的,其實特徵向量也可以是多個離散值,比如{1, 2, ..., ki}這樣也都是可以的。這時候只需要把對p(xi|y) 的建模從伯努利分佈改成多項式分佈。實際上,即便一些原始的輸入值是連續值(比如我們第一個案例中的房屋面積),也可以轉換成一個小規模的離散值的集合,然後再使用樸素貝葉斯方法。例如,如果我們用特徵向量 xi 來表示住房面積,那麼就可以按照下面所示的方法來對這一變數進行離散化:

這樣,對於一個面積為 890 平方英尺的房屋,就可以根據上面這個集合中對應的值來把特徵向量的這一項的值設定為3.然後就可以用樸素貝葉斯演算法,並且將p(xi|y)作為多項式分佈來進行建模,就都跟前面講過的內容一樣了。當原生的連續值的屬性不太容易用一個多元正態分佈來進行建模的時候,將其特徵向量離散化然後使用樸素貝葉斯法(NB)來替代高斯判別分析法(GDA),通常能形成一個更好的分類器。

2.1 拉普拉斯光滑(Laplace smoothing)

剛剛講過的樸素貝葉斯演算法能夠解決很多問題了,但還能對這種方法進行一點小調整來進一步提高效果,尤其是應對文字分類的情況。我們來簡要討論一下一個演算法當前狀態的一個問題,然後在講一下如何解決這個問題。

還是考慮垃圾郵件分類的過程,設想你學完了CS229的課程,然後做了很棒的研究專案,之後你決定在2003年6月(譯者注:作者這講義一定寫得很早)把自己的作品投稿到NIPS會議,這個NIPS是機器學習領域的一個頂級會議,遞交論文的截止日期一般是六月末到七月初。你通過郵件來對這個會議進行了討論,然後你也開始受到帶有 nips 四個字母的資訊。但這個是你第一個NIPS論文,而在此之前,你從來沒有接到過任何帶有 nips 這個單詞的郵件;尤其重要的是,nips 這個單詞就從來都沒有出現在你的垃圾/正常郵件訓練集裡面。加入這個 nips 是你字典中的第35000個單詞那麼你的樸素貝葉斯垃圾郵件篩選器就要對引數φ35000|y 進行最大似然估計,如下所示:

也就是說,因為之前程式從來沒有在別的垃圾郵件或者正常郵件的訓練樣本中看到過 nips 這個詞,所以它就認為看到這個詞出現在這兩種郵件中的概率都是0.因此當要決定一個包含 nips 這個單詞的郵件是否為垃圾郵件的時候,他就檢驗這個類的後驗概率,然後得到了:

這是因為對於“ ni=1 p(xi|y)”中包含了p(x35000|y) = 0的都加了起來,也就還是0。所以我們的演算法得到的就是 0/0,也就是不知道該做出怎麼樣的預測了。

然後進一步拓展一下這個問題,統計學上來說,只因為你在自己以前的有限的訓練資料集中沒見到過一件事,就估計這個事件的概率為零,明顯是個壞主意。假設問題是估計一個多項式隨機變數 z ,其取值範圍在{1,  ..., k} 之內。接下來就可以用φi = p (z = i) 來作為多項式引數。給定一個 m 個獨立觀測{z(1), ..., z(m)} 組成的集合,然後最大似然估計的形式如下:

正如咱們之前見到的,如果我們用這些最大似然估計,那麼一些φj可能最終就是零了,這就是個問題了。要避免這個情況,咱們就可以引入拉普拉斯光滑(Laplace smoothing),這種方法把上面的估計替換成:

這裡首先是對分子加1,然後對分母加K,要注意Σkj=1 φj = 1依然成立(自己檢驗一下),這是一個必須有的性質,因為φj 是對概率的估計,然後所有的概率加到一起必然等於1。另外對於所有的 j 值,都有φj ≠0,這就解決了剛剛的概率估計為零的問題了。在某些特定的條件下(相當強的假設條件下,arguably quite strong),可以發現拉普拉斯光滑還真能給出對引數φj 的最佳估計(optimal estimator)。

回到我們的樸素貝葉斯分選器問題上,使用了拉普拉斯光滑之後,對引數的估計就寫成了下面的形式:

(在實際應用中,通常是否對φy 使用拉普拉斯並沒有太大影響,因為通常我們會對每個垃圾郵件和非垃圾郵件都有一個合適的劃分比例,所以φy 會是對p (y = 1)的一個合理估計,無論如何都會與零點有一定距離。)

2.2 針對文字分類的事件模型(Event models for text classification)

到這裡就要給咱們關於生成學習演算法的討論進行一下收尾了,所以就接著講一點關於文字分類方面的另一個模型。我們剛已經演示過的樸素貝葉斯方法能夠解決很多分類問題了,不過還有另一個相關的演算法,在針對文字的分類效果還要更好。

在針對文字進行分類的特定背景下,咱們上面講的樸素貝葉斯方法使用的是一種叫做多元伯努利事件模型。在這個模型裡面,我們都是在假設這個郵件中的內容首先是隨機生成的(根據類的先驗class priors, p(y),就是一個隨機變數),而不管這個垃圾郵件或者非垃圾郵件的傳送者是否還會再給你發一次訊息。然後,這個發郵件的人就遍歷整個詞典,然後根據概率分佈p (xi = 1|y) = φi|y,獨立地決定是否在郵件中包含每一個單詞 i 。這樣的話,這個訊息的概率就是p(y) ni=1 p(xi|y)。

下面就是一個不同的模型,叫做多項式事件模型。要描述這個模型,我們要用一個不同的記號和特徵集合來表示郵件。我們用xi 來表示郵件中的第i個單詞。這樣xi 現在就是一個整形了,取值範圍在 {1, ..., |V |}中,其中|V |指代的是詞彙表(也就是字典)的長度。這樣一個由n個單片語成的郵件現在就表示成了一個n維向量(x1,x2,...,xn);要注意這裡的n可以根據文件的變化而變化。例如,如果一個郵件的開頭是“A NIPS . . .” ,那麼x1 = 1 (“a” 是詞典中的第一個),而x2 = 35000 (這是假設 “nips”是詞典中的第35000個)。

在多項式事件模型中,我們假設郵件的生成是通過一個隨機過程的,而是否為垃圾郵件是首先決定的(根據p(y)),這個和之前的模型假設一樣。然後郵件的傳送者寫郵件首先是要生成 從對單詞(p(x1|y))的某種多項式分佈中生成 x1.然後第二部是獨立於 x1 來生成 x2,但也是從相同的多項式分佈中來選取,然後是 x3、x4 等等,以此類推,直到生成了整個郵件中的所有的此。因此,一個郵件的總體概率就是p(y) ni=1 p(xi|y)。咬住以這個方程看著和我們之前那個多元伯努利事件模型裡面的郵件概率很相似,但實際上這裡面的意義完全不同了。尤其是這裡的xi|y現在是一個多項式分佈了,而不是伯努利分佈了。

我們新模型的引數還是φy = p(y),這個跟以前一樣,然後還有φk|y=1 = p(xj =k|y=1) (對任何 j)以及 φi|y=0 =p(xj =k|y=0)。要注意這裡我們已經假設了對於任何j 的值,p(xj|y)這個概率都是相等的,也就是意味著在這個哪個詞會生成的這個分佈不依賴這個詞在郵件中的位置j(the distribution according to which a word is generated does not depend on its position j within the email)。

如果給定一個訓練集{(x(i),y(i)); i = 1, ..., m},其中 x(i) = (x(i),x(i),...,x(i))(這裡的n是在第i個訓練樣本中的單詞數目),那麼這個資料的似然函式如下所示:

 

讓上面的這個函式最大化就可以產生對引數的最大似然估計:

如果使用拉普拉斯光滑(實踐中會用這個方法來提高效能)來估計φk|y=0 和 φk|y=1,就在分子上加1,然後分母上加|V |,就得到了下面的等式:

當然了,這個並不見得就是一個最好的分類演算法,不過樸素貝葉斯分選器通常用起來還都出乎意料地那麼好。所以這個方法就是一個很好的“首發選擇”,因為它很簡單又很好實現。