1. 程式人生 > >機器學習之最大似然演算法

機器學習之最大似然演算法

機器學習十大演算法之一:EM演算法。能評得上十大之一,讓人聽起來覺得挺NB的。什麼是NB啊,我們一般說某個人很NB,是因為他能解決一些別人解決不了的問題。神為什麼是神,因為神能做很多人做不了的事。那麼EM演算法能解決什麼問題呢?或者說EM演算法是因為什麼而來到這個世界上,還吸引了那麼多世人的目光。

       我希望自己能通俗地把它理解或者說明白,但是,EM這個問題感覺真的不太好用通俗的語言去說明白,因為它很簡單,又很複雜。簡單在於它的思想,簡單在於其僅包含了兩個步驟就能完成強大的功能,複雜在於它的數學推理涉及到比較繁雜的概率公式等。如果只講簡單的,就丟失了EM演算法的精髓,如果只講數學推理,又過於枯燥和生澀,但另一方面,想把兩者結合起來也不是件容易的事。所以,我也沒法期待我能把它講得怎樣。希望各位不吝指導。

一、最大似然

       扯了太多,得入正題了。假設我們遇到的是下面這樣的問題:

       假設我們需要調查我們學校的男生和女生的身高分佈。你怎麼做啊?你說那麼多人不可能一個一個去問吧,肯定是抽樣了。假設你在校園裡隨便地活捉了100個男生和100個女生。他們共200個人(也就是200個身高的樣本資料,為了方便表示,下面,我說“人”的意思就是對應的身高)都在教室裡面了。那下一步怎麼辦啊?你開始喊:“男的左邊,女的右邊,其他的站中間!”。然後你就先統計抽樣得到的100個男生的身高。假設他們的身高是服從高斯分佈的。但是這個分佈的均值u和方差2我們不知道,這兩個引數就是我們要估計的。記θ=[u, ∂]T

       用數學的語言來說就是:在學校那麼多男生(身高)中,我們獨立地按照概率密度p(x|θ)抽取100了個(身高),組成樣本集X,我們想通過樣本集X來估計出未知引數θ。這裡概率密度p(x|θ)我們知道了是高斯分佈N(u,)的形式,其中的未知引數是θ=[u, ∂]T。抽到的樣本集是X={x1,x2,…,xN},其中xi表示抽到的第i個人的身高,這裡N就是100,表示抽到的樣本個數。

      由於每個樣本都是獨立地從p(x|θ)中抽取的,換句話說這100個男生中的任何一個,都是我隨便捉的,從我的角度來看這些男生之間是沒有關係的。那麼,我從學校那麼多男生中為什麼就恰好抽到了這100個人呢?抽到這

100個人的概率是多少呢?因為這些男生(的身高)是服從同一個高斯分佈p(x|θ)的。那麼我抽到男生A(的身高)的概率是p(xA|θ),抽到男生B的概率是p(xB|θ),那因為他們是獨立的,所以很明顯,我同時抽到男生A和男生B的概率是p(xA|θ)* p(xB|θ),同理,我同時抽到這100個男生的概率就是他們各自概率的乘積了。用數學家的口吻說就是從分佈是p(x|θ)的總體樣本中抽取到這100個樣本的概率,也就是樣本集X中各個樣本的聯合概率,用下式表示:

     這個概率反映了,在概率密度函式的引數是θ時,得到X這組樣本的概率。因為這裡X是已知的,也就是說我抽取到的這100個人的身高可以測出來,也就是已知的了。而θ是未知了,則上面這個公式只有θ是未知數,所以它是θ的函式。這個函式放映的是在不同的引數θ取值下,取得當前這個樣本集的可能性,因此稱為引數θ相對於樣本集X的似然函式(likehood function)。記為L(θ)

      這裡出現了一個概念,似然函式。還記得我們的目標嗎?我們需要在已經抽到這一組樣本X的條件下,估計引數θ的值。怎麼估計呢?似然函式有啥用呢?那咱們先來了解下似然的概念。

直接舉個例子:

      某位同學與一位獵人一起外出打獵,一隻野兔從前方竄過。只聽一聲槍響,野兔應聲到下,如果要你推測,這一發命中的子彈是誰打的?你就會想,只發一槍便打中,由於獵人命中的概率一般大於這位同學命中的概率,看來這一槍是獵人射中的。

      這個例子所作的推斷就體現了極大似然法的基本思想。

      再例如:下課了,一群男女同學分別去廁所了。然後,你閒著無聊,想知道課間是男生上廁所的人多還是女生上廁所的人比較多,然後你就跑去蹲在男廁和女廁的門口。蹲了五分鐘,突然一個美女走出來,你狂喜,跑過來告訴我,課間女生上廁所的人比較多,你要不相信你可以進去數數。呵呵,我才沒那麼蠢跑進去數呢,到時還不得上頭條。我問你是怎麼知道的。你說:“5分鐘了,出來的是女生,女生啊,那麼女生出來的概率肯定是最大的了,或者說比男生要大,那麼女廁所的人肯定比男廁所的人多”。看到了沒,你已經運用最大似然估計了。你通過觀察到女生先出來,那麼什麼情況下,女生會先出來呢?肯定是女生出來的概率最大的時候了,那什麼時候女生出來的概率最大啊,那肯定是女廁所比男廁所多人的時候了,這個就是你估計到的引數了。

      從上面這兩個例子,你得到了什麼結論?

       回到男生身高那個例子。在學校那麼男生中,我一抽就抽到這100個男生(表示身高),而不是其他人,那是不是表示在整個學校中,這100個人(的身高)出現的概率最大啊。那麼這個概率怎麼表示?哦,就是上面那個似然函式L(θ)。所以,我們就只需要找到一個引數θ,其對應的似然函式L(θ)最大,也就是說抽到這100個男生(的身高)概率最大。這個叫做θ的最大似然估計量,記為:

      有時,可以看到L(θ)是連乘的,所以為了便於分析,還可以定義對數似然函式,將其變成連加的:

      好了,現在我們知道了,要求θ,只需要使θ的似然函式L(θ)極大化,然後極大值對應的θ就是我們的估計。這裡就回到了求最值的問題了。怎麼求一個函式的最值?當然是求導,然後讓導數為0,那麼解這個方程得到的θ就是了(當然,前提是函式L(θ)連續可微)。那如果θ是包含多個引數的向量那怎麼處理啊?當然是求L(θ)對所有引數的偏導數,也就是梯度了,那麼n個未知的引數,就有n個方程,方程組的解就是似然函式的極值點了,當然就得到這n個引數了。

      最大似然估計你可以把它看作是一個反推。多數情況下我們是根據已知條件來推算結果,而最大似然估計是已經知道了結果,然後尋求使該結果出現的可能性最大的條件,以此作為估計值。比如,如果其他條件一定的話,抽菸者發生肺癌的危險時不抽菸者的5倍,那麼如果現在我已經知道有個人是肺癌,我想問你這個人抽菸還是不抽菸。你怎麼判斷?你可能對這個人一無所知,你所知道的只有一件事,那就是抽菸更容易發生肺癌,那麼你會猜測這個人不抽菸嗎?我相信你更有可能會說,這個人抽菸。為什麼?這就是“最大可能”,我只能說他“最有可能”是抽菸的,“他是抽菸的”這一估計值才是“最有可能”得到“肺癌”這樣的結果。這就是最大似然估計。

      好了,極大似然估計就講到這,總結一下:

      極大似然估計,只是一種概率論在統計學的應用,它是引數估計的方法之一。說的是已知某個隨機樣本滿足某種概率分佈,但是其中具體的引數不清楚,引數估計就是通過若干次試驗,觀察其結果,利用結果推出引數的大概值。最大似然估計是建立在這樣的思想上:已知某個引數能使這個樣本出現的概率最大,我們當然不會再去選擇其他小概率的樣本,所以乾脆就把這個引數作為估計的真實值。

求最大似然函式估計值的一般步驟:

1)寫出似然函式;

2)對似然函式取對數,並整理;

3)求導數,令導數為0,得到似然方程;

4)解似然方程,得到的引數即為所求;

二、EM演算法

       好了,重新回到上面那個身高分佈估計的問題。現在,通過抽取得到的那100個男生的身高和已知的其身高服從高斯分佈,我們通過最大化其似然函式,就可以得到了對應高斯分佈的引數θ=[u, ∂]T了。那麼,對於我們學校的女生的身高分佈也可以用同樣的方法得到了。

       再回到例子本身,如果沒有“男的左邊,女的右邊,其他的站中間!”這個步驟,或者說我抽到這200個人中,某些男生和某些女生一見鍾情,已經好上了,糾纏起來了。咱們也不想那麼殘忍,硬把他們拉扯開。那現在這200個人已經混到一起了,這時候,你從這200個人(的身高)裡面隨便給我指一個人(的身高),我都無法確定這個人(的身高)是男生(的身高)還是女生(的身高)。也就是說你不知道抽取的那200個人裡面的每一個人到底是從男生的那個身高分佈裡面抽取的,還是女生的那個身高分佈抽取的。用數學的語言就是,抽取得到的每個樣本都不知道是從哪個分佈抽取的。

        這個時候,對於每一個樣本或者你抽取到的人,就有兩個東西需要猜測或者估計的了,一是這個人是男的還是女的?二是男生和女生對應的身高的高斯分佈的引數是多少?

       只有當我們知道了哪些人屬於同一個高斯分佈的時候,我們才能夠對這個分佈的引數作出靠譜的預測,例如剛開始的最大似然所說的,但現在兩種高斯分佈的人混在一塊了,我們又不知道哪些人屬於第一個高斯分佈,哪些屬於第二個,所以就沒法估計這兩個分佈的引數。反過來,只有當我們對這兩個分佈的引數作出了準確的估計的時候,才能知道到底哪些人屬於第一個分佈,那些人屬於第二個分佈。

       這就成了一個先有雞還是先有蛋的問題了。雞說,沒有我,誰把你生出來的啊。蛋不服,說,沒有我,你從哪蹦出來啊。(呵呵,這是一個哲學問題。當然了,後來科學家說先有蛋,因為雞蛋是鳥蛋進化的)。為了解決這個你依賴我,我依賴你的迴圈依賴問題,總得有一方要先打破僵局,說,不管了,我先隨便整一個值出來,看你怎麼變,然後我再根據你的變化調整我的變化,然後如此迭代著不斷互相推導,最終就會收斂到一個解。這就是EM演算法的基本思想了。

       不知道大家能否理解其中的思想,我再來囉嗦一下。其實這個思想無處在不啊。

       例如,小時候,老媽給一大袋糖果給你,叫你和你姐姐等分,然後你懶得去點糖果的個數,所以你也就不知道每個人到底該分多少個。咱們一般怎麼做呢?先把一袋糖果目測的分為兩袋,然後把兩袋糖果拿在左右手,看哪個重,如果右手重,那很明顯右手這代糖果多了,然後你再在右手這袋糖果中抓一把放到左手這袋,然後再感受下哪個重,然後再從重的那袋抓一小把放進輕的那一袋,繼續下去,直到你感覺兩袋糖果差不多相等了為止。呵呵,然後為了體現公平,你還讓你姐姐先選了。

       EM演算法就是這樣,假設我們想估計知道AB兩個引數,在開始狀態下二者都是未知的,但如果知道了A的資訊就可以得到B的資訊,反過來知道了B也就得到了A。可以考慮首先賦予A某種初值,以此得到B的估計值,然後從B的當前值出發,重新估計A的取值,這個過程一直持續到收斂為止。

         EM的意思是“Expectation Maximization”,在我們上面這個問題裡面,我們是先隨便猜一下男生(身高)的正態分佈的引數:如均值和方差是多少。例如男生的均值是17,方差是0.1米(當然了,剛開始肯定沒那麼準),然後計算出每個人更可能屬於第一個還是第二個正態分佈中的(例如,這個人的身高是18,那很明顯,他最大可能屬於男生的那個分佈),這個是屬於Expectation一步。有了每個人的歸屬,或者說我們已經大概地按上面的方法將這200個人分為男生和女生兩部分,我們就可以根據之前說的最大似然那樣,通過這些被大概分為男生的n個人來重新估計第一個分佈的引數,女生的那個分佈同樣方法重新估計。這個是Maximization。然後,當我們更新了這兩個分佈的時候,每一個屬於這兩個分佈的概率又變了,那麼我們就再需要調整E步……如此往復,直到引數基本不再發生變化為止。

      這裡把每個人(樣本)的完整描述看做是三元組yi={xi,zi1,zi2},其中,xi是第i個樣本的觀測值,也就是對應的這個人的身高,是可以觀測到的值。zi1zi2表示男生和女生這兩個高斯分佈中哪個被用來產生值xi,就是說這兩個值標記這個人到底是男生還是女生(的身高分佈產生的)。這兩個值我們是不知道的,是隱含變數。確切的說,zijxi由第j個高斯分佈產生時值為1,否則為0。例如一個樣本的觀測值為1.8,然後他來自男生的那個高斯分佈,那麼我們可以將這個樣本表示為{1.8, 1, 0}。如果zi1zi2的值已知,也就是說每個人我已經標記為男生或者女生了,那麼我們就可以利用上面說的最大似然演算法來估計他們各自高斯分佈的引數。但是它們未知,因此我們只能用EM演算法。

       咱們現在不是因為那個噁心的隱含變數(抽取得到的每個樣本都不知道是從哪個分佈抽取的)使得本來簡單的可以求解的問題變複雜了,求解不了嗎。那怎麼辦呢?人類解決問題的思路都是想能否把複雜的問題簡單化。好,那麼現在把這個複雜的問題逆回來,我假設已經知道這個隱含變量了,哎,那麼求解那個分佈的引數是不是很容易了,直接按上面說的最大似然估計就好了。那你就問我了,這個隱含變數是未知的,你怎麼就來一個假設說已知呢?你這種假設是沒有根據的。呵呵,我知道,所以我們可以先給這個給分佈弄一個初始值,然後求這個隱含變數的期望,當成是這個隱含變數的已知值,那麼現在就可以用最大似然求解那個分佈的引數了吧,那假設這個引數比之前的那個隨機的引數要好,它更能表達真實的分佈,那麼我們再通過這個引數確定的分佈去求這個隱含變數的期望,然後再最大化,得到另一個更優的引數,……迭代,就能得到一個皆大歡喜的結果了。

       這時候你就不服了,說你老迭代迭代的,你咋知道新的引數的估計就比原來的好啊?為什麼這種方法行得通呢?有沒有失效的時候呢?什麼時候失效呢?用到這個方法需要注意什麼問題呢?呵呵,一下子丟擲那麼多問題,搞得我適應不過來了,不過這證明了你有很好的搞研究的潛質啊。呵呵,其實這些問題就是數學家需要解決的問題。在數學上是可以穩當的證明的或者得出結論的。那咱們用數學來把上面的問題重新描述下。(在這裡可以知道,不管多麼複雜或者簡單的物理世界的思想,都需要通過數學工具進行建模抽象才得以使用併發揮其強大的作用,而且,這裡面蘊含的數學往往能帶給你更多想象不到的東西,這就是數學的精妙所在啊)

三、EM演算法推導

       假設我們有一個樣本集{x(1),…,x(m)},包含m個獨立的樣本。但每個樣本i對應的類別z(i)是未知的(相當於聚類),也即隱含變數。故我們需要估計概率模型p(x,z)的引數θ,但是由於裡面包含隱含變數z,所以很難用最大似然求解,但如果z知道了,那我們就很容易求解了。

       對於引數估計,我們本質上還是想獲得一個使似然函式最大化的那個引數θ,現在與最大似然不同的只是似然函式式中多了一個未知的變數z,見下式(1)。也就是說我們的目標是找到適合的θzL(θ)最大。那我們也許會想,你就是多了一個未知的變數而已啊,我也可以分別對未知的θz分別求偏導,再令其等於0,求解出來不也一樣嗎?

      本質上我們是需要最大化(1)式(對(1)式,我們回憶下聯合概率密度下某個變數的邊緣概率密度函式的求解,注意這裡z也是隨機變數。對每一個樣本i的所有可能類別z求等式右邊的聯合概率密度函式和,也就得到等式左邊為隨機變數x的邊緣概率密度),也就是似然函式,但是可以看到裡面有“和的對數”,求導後形式會非常複雜(自己可以想象下log(f1(x)+ f2(x)+ f3(x)+…)複合函式的求導),所以很難求解得到未知引數zθ。那OK,我們可否對1)式做一些改變呢?我們看2)式,(2)式只是分子分母同乘以一個相等的函式,還是有“和的對數”啊,還是求解不了,那為什麼要這麼做呢?咱們先不管,看(3)式,發現(3)式變成了“對數的和”,那這樣求導就容易了。我們注意點,還發現等號變成了不等號,為什麼能這麼變呢?這就是Jensen不等式的大顯神威的地方。

Jensen不等式:

      設f是定義域為實數的函式,如果對於所有的實數x。如果對於所有的實數xf(x)的二次導數大於等於0,那麼f是凸函式。當x是向量時,如果其hessian矩陣H是半正定的,那麼f是凸函式。如果只大於0,不等於0,那麼稱f是嚴格凸函式。

Jensen不等式表述如下:

如果f是凸函式,X是隨機變數,那麼:E[f(X)]>=f(E[X])

特別地,如果f是嚴格凸函式,當且僅當X是常量時,上式取等號。

       如果用圖表示會很清晰:

 

       圖中,實線f是凸函式,X是隨機變數,有0.5的概率是a,有0.5的概率是b。(就像擲硬幣一樣)。X的期望值就是ab的中值了,圖中可以看到E[f(X)]>=f(E[X])成立。

       當f是(嚴格)凹函式當且僅當-f是(嚴格)凸函式。

        Jensen不等式應用於凹函式時,不等號方向反向。

       回到公式(2),因為f(x)=log x為凹函式(其二次導數為-1/x2<0)。

2)式中的期望,(考慮到E(X)=∑x*p(x)f(X)X的函式,則E(f(X))=∑f(x)*p(x)),又,所以就可以得到公式(3)的不等式了(若不明白,請拿起筆,呵呵):

        OK,到這裡,現在式(3)就容易地求導了,但是式(2)和式(3)是不等號啊,式(2)的最大值不是式(3)的最大值啊,而我們想得到式(2)的最大值,那怎麼辦呢?

      現在我們就需要一點想象力了,上面的式(2)和式(3)不等式可以寫成:似然函式L(θ)>=J(z,Q),那麼我們可以通過不斷的最大化這個下界J,來使得L(θ)不斷提高,最終達到它的最大值。

     見上圖,我們固定θ,調整Q(z)使下界J(z,Q)上升至與L(θ)在此點θ處相等(綠色曲線到藍色曲線),然後固定Q(z),調整θ使下界J(z,Q)達到最大值(θtθt+1),然後再固定θ,調整Q(z)……直到收斂到似然函式L(θ)的最大值處的θ*。這裡有兩個問題:什麼時候下界J(z,Q)L(θ)在此點θ處相等?為什麼一定會收斂?

     首先第一個問題,在Jensen不等式中說到,當自變數X是常數的時候,等式成立。而在這裡,即:

     再推導下,由於(因為Q是隨機變數z(i)的概率密度函式),則可以得到:分子的和等於c(分子分母都對所有z(i)求和:多個等式分子分母相加不變,這個認為每個樣例的兩個概率比值都是c),則:

      至此,我們推出了在固定引數θ後,使下界拉昇的Q(z)的計算公式就是後驗概率,解決了Q(z)如何選擇的問題。這一步就是E步,建立L(θ)的下界。接下來的M步,就是在給定Q(z)後,調整θ,去極大化L(θ)的下界J(在固定Q(z)後,下界還可以調整的更大)。那麼一般的EM演算法的步驟如下:

EM演算法(Expectation-maximization):

     期望最大演算法是一種從不完全資料或有資料丟失的資料集(存在隱含變數)中求解概率模型引數的最大似然估計方法。

EM的演算法流程:

初始化分佈引數θ

重複以下步驟直到收斂

        E步驟:根據引數初始值或上一次迭代的模型引數來計算出隱性變數的後驗概率,其實就是隱性變數的期望。作為隱藏變數的現估計值:

        M步驟:將似然函式最大化以獲得新的引數值:

          

        這個不斷的迭代,就可以得到使似然函式L(θ)最大化的引數θ了。那就得回答剛才的第二個問題了,它會收斂嗎?

感性的說,因為下界不斷提高,所以極大似然估計單調增加,那麼最終我們會到達最大似然估計的最大值。理性分析的話,就會得到下面的東西:

具體如何證明的,看推導過程參考:Andrew NgThe EM algorithm

四、EM演算法另一種理解

座標上升法(Coordinate ascent):

       圖中的直線式迭代優化的路徑,可以看到每一步都會向最優值前進一步,而且前進路線是平行於座標軸的,因為每一步只優化一個變數。

       這猶如在x-y座標系中找一個曲線的極值,然而曲線函式不能直接求導,因此什麼梯度下降方法就不適用了。但固定一個變數後,另外一個可以通過求導得到,因此可以使用座標上升法,一次固定一個變數,對另外的求極值,最後逐步逼近極值。對應到EM上,E步:固定θ,優化QM步:固定Q,優化θ;交替將極值推向最大。

五、EM的應用

       EM演算法有很多的應用,最廣泛的就是GMM混合高斯模型、聚類、HMM等等。具體可以參考JerryLeadcnblog中的Machine Learning專欄:

EM演算法)The EM Algorithm

混合高斯模型(Mixtures of Gaussians)和EM演算法