本系列第三篇,承接前面的《淺談機器學(xué)習(xí)基礎(chǔ)》和《淺談深度學(xué)習(xí)基礎(chǔ)》。
自然語言處理緒論
什么是自然語言處理?
自然語言處理是研究人與人交際中以及人與計算機交際中的語言問題的一門學(xué)科。自然語言處理要研制表示語言能力和語言應(yīng)用的模型,建立計算框架來實現(xiàn)這樣的語言模型,提出相應(yīng)的方法來不斷完善這樣的語言模型,根據(jù)這樣的語言模型設(shè)計各種實用系統(tǒng),并探討這些實用系統(tǒng)的評測技術(shù)。
一般認(rèn)為,自然語言處理中存在兩種不同的研究方法,一種是理性主義方法,一種是經(jīng)驗主義方法。
理性主義的代表人物是喬姆斯基,主張建立符號處理系統(tǒng),試圖刻畫人類思維的模型或方法,由人工編寫自然語言處理規(guī)則。系統(tǒng)根據(jù)規(guī)則將自然語言理解為符號結(jié)構(gòu),再通過符號的意義推導(dǎo)出該結(jié)構(gòu)的意義。
按這種思路,在自然語言處理系統(tǒng)中,一般先由詞法分析器按照人編寫的詞法規(guī)則對輸入句子的單詞進行詞法分析,然后,語法分析器根據(jù)人設(shè)計的語法規(guī)則對輸入句子進行句法分析,最后再根據(jù)一套變換規(guī)則將語法結(jié)構(gòu)映射到語義符號(如邏輯表達(dá)式,語義網(wǎng)絡(luò),中間語言等),進行語義分析。
而經(jīng)驗主義認(rèn)為,人腦并不是從一開始就具有一些具體的處理原則和對具體語言成分的處理方法,而是假定孩子的大腦一開始具有處理聯(lián)想、模式識別和泛化處理的能力,這些能力能夠使孩子充分利用感官輸入來掌握具體的自然語言處理結(jié)構(gòu)。
理性主義試圖刻畫的是人類思維的模型或方法。對于這種方法而言,某種語言的真實文本數(shù)據(jù)只是提供間接地證據(jù)。而經(jīng)驗主義方法則直接關(guān)心如何刻畫這種真實的語言本身。
在系統(tǒng)實現(xiàn)方法上,經(jīng)驗主義方法主張通過建立特定的數(shù)學(xué)模型來學(xué)習(xí)復(fù)雜的、廣泛的語言結(jié)構(gòu),然后利用統(tǒng)計學(xué)、模式識別和機器學(xué)習(xí)等方法來訓(xùn)練模型的參數(shù),以擴大語言使用的規(guī)模。因此,經(jīng)驗主義的自然語言處理方法是建立在統(tǒng)計方法基礎(chǔ)之上的,因此,我們稱其為統(tǒng)計自然語言處理。
20世紀(jì)20年代到60年代的近40年里,經(jīng)驗主義處于主導(dǎo)地位;
大約從20世紀(jì)60年代中期到20世紀(jì)80年代中后期,理性主義的研究方法控制著自然語言處理等領(lǐng)域的研究;
大約在20世紀(jì)80年代后期,人們越來越關(guān)注工程化、實用化的解決問題方法,經(jīng)驗主義方法被人們重新認(rèn)識并得到迅速發(fā)展,人們開始傾向于結(jié)合經(jīng)驗主義與理性主義的方法。
預(yù)備知識
熵
熵H(X)
又稱自信息,是描述一個隨機變量不確定性大小的量,熵越大則不確定性越大,則需要用更多的信息量來消除這種不確定性。前面《淺談機器學(xué)習(xí)基礎(chǔ)》中講決策樹的時候就提到了香農(nóng)熵。
在只掌握關(guān)于未知分布的部分知識的情況下,符合已知知識的概率分布可能有多個,但使熵值最大的概率分布真實的反映了事件的分布情況。以此為依據(jù)構(gòu)建的模型叫做最大熵模型,后面會詳細(xì)講,這里只做簡單介紹。
然后是聯(lián)合熵H(X,Y)
、條件熵H(Y|X)
和互信息I(X;Y)
:
熵H(X)
是描述一個隨機變量X
所需要的信息量,而聯(lián)合熵H(X,Y)
就是描述兩個隨機變量X
和Y
所需要的信息量,聯(lián)合熵大于或等于這兩個變量中任一個的熵。
互信息I(X;Y)
描述的是兩個隨機變量X
和Y
之間的相關(guān)性,也即已知X
后,Y
不確定性的減少量(熵H(Y)的減少量),反之亦成立。換句話講,X
與Y
關(guān)聯(lián)越大,越相關(guān),則互信息I(X;Y)
越大。
條件熵H(Y|X)
就是在已知X
的條件下,Y
的熵。因為互信息I(X;Y)
的存在,已知X
會使Y
的熵減少,減少后的Y
的熵就是H(Y|X)
。
從圖中也可以看出:H(X,Y) = H(X) + H(Y|X) = H(Y) + H(X|Y)
。回想一下,是不是和條件概率的計算公式有相似的地方。
接下來是相對熵D(p||q)
,相對熵又稱Kullback-Leibler差異,或簡稱KL距離,是衡量相同事件空間里兩個概率分布相對差距的測度,當(dāng)兩個隨機分布完全相同時,相對熵為0。當(dāng)兩個隨機分布的差別增加時,其相對熵期望值也增大。
然后是交叉熵H(X,q)
,X
是隨機變量,q
是模型。我們前面講過交叉熵?fù)p失函數(shù),交叉熵的概念就是用來衡量估計模型與真實概率分布之間差異情況的。而困惑度的概念與交叉熵相似,交叉熵對應(yīng)的困惑度的計算方式為:2的交叉熵次方。交叉熵與困惑度都是越小越證明模型有效。
形式語言與自動機
在喬姆斯基的語法理論中,文法被劃分為4種:3型文法、2型文法、1型文法和0型文法,分別稱為正則文法、上下文無關(guān)文法、上下文相關(guān)文法和無約束文法。從0型文法到3型文法,對規(guī)則的約束越來越多,每一個正則文法都可以被認(rèn)為是上下文無關(guān)文法,每一個上下文無關(guān)文法都是上下文有關(guān)文法,而每一個上下文有關(guān)文法都可以認(rèn)為是0型文法。
正則文法要求所有含非終結(jié)符號的規(guī)則形式為A->Bx
(或A->xB
),分別為左線性正則文法和右線性正則文法。
上下文無關(guān)文法不要求所有含非終結(jié)符號的規(guī)則右側(cè)為Bx
或xB
。
上下文相關(guān)文法對左側(cè)的A增加了上下文要求,也即αAβ->αγβ
,只有A
前為α
、A
后為β
才能進行狀態(tài)轉(zhuǎn)換,也可以看出,若αβ
為空,也即成為了上下文無關(guān)文法。
自動機因為后面并沒有用到,所以這里只簡單提一下。
正則文法與有限狀態(tài)自動機(FA)一一對應(yīng),F(xiàn)A是為研究有限內(nèi)存的計算過程和某些語言類而抽象出的一種計算模型。有限狀態(tài)自動機擁有有限數(shù)量的狀態(tài),每個狀態(tài)可以遷移到零個或多個狀態(tài),輸入字串決定執(zhí)行哪個狀態(tài)的遷移。有限狀態(tài)自動機可以表示為一個有向圖。FA又分為確定有限狀態(tài)自動機(DFA)和不確定有限狀態(tài)自動機(NFA),NFA可以轉(zhuǎn)化為DFA。
上下文無關(guān)文法與下推自動機(PDA)一一對應(yīng)。上下文相關(guān)文法與線性界限自動機相對應(yīng)。無約束文法與圖靈機一一對應(yīng)。
語料庫與語言知識庫
自然語言處理系統(tǒng)離不開數(shù)據(jù)和知識庫的支持。語料庫(corpus base)就是存放語言材料的數(shù)據(jù)庫,而語言知識庫比語料庫包含更廣泛的內(nèi)容,可以分為兩種不同的類型:一類是詞典、規(guī)則庫、語義概念庫等,分別與解析過程中的詞法分析、句法分析和語義分析相對應(yīng);另一類語言知識存在于語料庫之中,每個語言單位的出現(xiàn),其范疇、意義、用法都是確定的。
這部分內(nèi)容我主要想講兩種為我?guī)韱l(fā)的知識庫組織形式。
首先是知網(wǎng):
它著力反映概念的共性和個性,比如對于『患者』與『醫(yī)生』,他們的共性是『人』,同時又具有個性,與類之間的繼承關(guān)系相似;此外,還反映了概念之間以及概念的屬性之間的各種關(guān)系,通過對各種關(guān)系的標(biāo)注,知網(wǎng)把這種知識網(wǎng)絡(luò)系統(tǒng)明確教給了計算機,進而使知識對計算機而言成為可計算的。
知網(wǎng)定義了如下各種關(guān)系:上下位關(guān)系、同義關(guān)系、反義關(guān)系、對義關(guān)系、部件-整體關(guān)系、屬性-宿主關(guān)系、材料-成品關(guān)系、施事/經(jīng)驗者/關(guān)系主體-事件關(guān)系(醫(yī)生、雇主)、受事/內(nèi)容/領(lǐng)屬物等-事件關(guān)系(患者、雇員)、工具-事件關(guān)系(手表、計算機)、場所-事件關(guān)系(銀行、醫(yī)院)、時間-事件關(guān)系(假日、孕期)、值-屬性關(guān)系(藍(lán)、慢)、實體-值關(guān)系(矮子、傻瓜)、事件-角色關(guān)系(購物、盜墓)、相關(guān)關(guān)系(谷物、煤田)。
然后是動態(tài)演化認(rèn)知架構(gòu)系統(tǒng)(Dynamically Evolving Cognitive Architecture System,簡稱DECAS),DECAS是前蘋果Siri開發(fā)團隊離職后所設(shè)計的bot創(chuàng)建平臺Viv所使用的技術(shù)。這部分介紹參考了Chatbot 4: Viv能攪動bot市場嗎?
DECAS中主要包含了兩種對象:概念對象(Concept Object)和動作對象(Action Object),其中概念對象指的就是實體,而動作對象就是執(zhí)行的動作。
概念對象之間定義了兩種關(guān)系:擴展(extension),相當(dāng)于“is a”的關(guān)系,比如“跑步鞋”概念對象擴展自“鞋”概念對象;屬性(property),相當(dāng)于“has a”的關(guān)系,比如“跑步鞋”概念對象有屬性“尺碼”概念對象。
動作接收一些概念對象,然后產(chǎn)出一些新的概念對象,類似于函數(shù)有輸入和輸出。動作接收的概念對象包含了兩類,一類是必須要有的,沒有動作就沒法執(zhí)行;另一類是可選的,可有可無,類似提供了默認(rèn)參數(shù)。
以概念和動作對象為節(jié)點,Viv構(gòu)建了規(guī)模龐大的有向網(wǎng)絡(luò)圖。概念節(jié)點到動作節(jié)點的邊表示此動作以此概念為輸入?yún)?shù),而動作節(jié)點到概念節(jié)點的邊表示此動作的輸出中包含了此概念。如果兩個概念節(jié)點存在擴展或者屬性關(guān)系,那么它們之間也會存在有向邊。隨著開發(fā)者不斷把新的概念和動作對象加入到Viv系統(tǒng),這個網(wǎng)絡(luò)圖會逐漸延伸,越來越大。借助于Viv的動態(tài)演化認(rèn)知架構(gòu)系統(tǒng),Viv能做的事會隨著網(wǎng)絡(luò)圖的增大而指數(shù)增長。
舉一個具體的例子,有條這樣的問句『我是學(xué)生,買什么Asics跑步鞋合適呢?』,Viv首先將問句進行詞法分析,得到語義組塊序列,然后對其進行意圖識別,意圖分為兩部分,一部分是目標(biāo)概念對象,另一部分是條件概念對象。如下圖:
Viv的核心技術(shù)就是利用DECAS找到從條件概念對象到目標(biāo)概念對象的連通路徑,Viv把一條路徑稱為一個計劃(Plan)。
前面提到,動作接收一些概念對象,然后產(chǎn)出一些新的概念對象,如果執(zhí)行一個動作就可以由條件到目標(biāo),那當(dāng)然直接執(zhí)行下這個動作就搞定了,但顯然實際情況復(fù)雜得多。
舉個例子,開發(fā)者定義了兩種動作,1) transform_occupation_to_price
,轉(zhuǎn)化職業(yè)為價格偏好;2) rec_shoes_based_on_price
,轉(zhuǎn)化價格偏好為跑鞋推薦。也就是上圖中的計劃一,這樣就實現(xiàn)了由條件概念對象到目標(biāo)概念對象的推理。當(dāng)然達(dá)到目標(biāo)的計劃也許并不只有一個,開發(fā)者可以為每個計劃設(shè)定一個價值函數(shù),DECAS則只需要選擇價值最高的topN計劃具體執(zhí)行即可,或者做得更復(fù)雜,比如依據(jù)用戶反饋實時調(diào)整計劃。
如果一個計劃包含的動作所需的必須輸入概念對象缺失,那么就需要與用戶進行多次交互以收集缺失概念對象的值,也即多輪對話。多輪對話的目的從來不應(yīng)該是為了炫技或是強行提高與用戶的對話輪數(shù),而是幫助不能清晰表達(dá)自己意思的用戶補全自己的需求。
語言模型
語言模型(language model,LM)在基于統(tǒng)計模型的語音識別、機器翻譯、漢語自動分詞和句法縫隙等相關(guān)研究領(lǐng)域得到了廣泛的應(yīng)用。
目前主要采用的是n元文法模型(n-gram model),這種模型構(gòu)建簡單、直接,但同時也因為數(shù)據(jù)缺乏而必須采取平滑(smoothing)算法。
一個語言模型通常構(gòu)建為字符串s
的概率分布p(s)
,這里p(s)
試圖反映的是字符串s作為一個句子出現(xiàn)的頻率。
對于一個由l
個基元(“基元”可以為字、詞或短語等,為了表述方便,以后我們只用“詞”來通指)構(gòu)成的句子s=w1w2…wl
,其概率計算公式可以表示為:
也即產(chǎn)生第i
個詞的概率是由已經(jīng)產(chǎn)生的i-1
個詞w1w2…w(i-1)
決定的,這i-1
個詞被稱為第i
個詞的歷史,隨著歷史長度的增加,不同歷史數(shù)目按指數(shù)級增長,這會導(dǎo)致我們根本無法在訓(xùn)練數(shù)據(jù)中對參數(shù)進行估計。
所以我們假定,出現(xiàn)在第i
個位置上的詞wi
僅與它前面的n-1個歷史詞有關(guān),n取多少,我們就稱其為幾元文法模型,一般來講,我們一般取n<=3來避免前面的自由參數(shù)過多的問題。
當(dāng)n=1時,被稱為一元文法模型(unigram或uni-gram或monogram),也即出現(xiàn)于第i
位的詞獨立于歷史,在《淺談機器學(xué)習(xí)基礎(chǔ)》中樸素貝葉斯算法中的樸素假設(shè),實際上就是一元文法模型。
當(dāng)n=2時,被稱為二元文法模型(bigram或bi-gram),即出現(xiàn)在第i
位的詞只與它前面第一個歷史詞有關(guān),二元文法模型又被稱為一階馬爾可夫鏈。
三元文法模型被稱為二階馬爾可夫鏈,記作trigram或tri-gram。
用于構(gòu)建語言模型的文本被稱為訓(xùn)練語料(training corpus)。訓(xùn)練語料的規(guī)模一般要有幾百萬個詞。舉個例子,我們通過訓(xùn)練語料計算出p(a|<BOS>)、p(b|a)、p(c|b)、p(d|c)、p(<EOS>|d)
,那我們自然就能得到句子a b c d
的出現(xiàn)概率為上面的概率依次相乘。<BOS>
為句首標(biāo)志,<EOS>
為句尾標(biāo)志。上面的例子是bigram的,《淺談機器學(xué)習(xí)基礎(chǔ)》中的樸素貝葉斯算法給出了unigram下的計算方法,都是大同小異。
接下來是如何評價一個語言模型的性能。
首先,我們需要一個用于評價語言模型性能的測試集,然后按照上面的方法,我們計算測試集中每個句子的生成概率,然后將它們?nèi)砍似饋恚吹玫皆摐y試集的生成概率,測試集的生成概率越大,則語言模型的效果越好。
當(dāng)然我們也可以通過前面提到的交叉熵和困惑度作為評價語言模型性能的測度,交叉熵與困惑度越小越好,具體的計算方法比較復(fù)雜,這里不講。
然后是數(shù)據(jù)平滑問題。
我們前面說了,我們要根據(jù)訓(xùn)練語料來計算詞的出現(xiàn)概率,進而計算句子的生成概率,但是這樣就有一個問題,如果我們的訓(xùn)練語料不那么全怎么辦?
這樣就會導(dǎo)致比如某一個概率p(b|a)
為0,因為訓(xùn)練語料中沒有出現(xiàn)過這樣的詞,但是p(b|a)
真的應(yīng)該為0嗎,帶a b
的句子真的永遠(yuǎn)不會出現(xiàn)嗎?顯然不是的,只是概率小而已,但不應(yīng)該為0。
所以我們需要進行數(shù)據(jù)平滑,為這些在訓(xùn)練語料中沒有出現(xiàn)過的詞分配一些概率,使其不為0。但因為總概率還要保持為1的,所以我們選擇降低略微降低高概率詞的概率來留出一部分概率分配給這些沒在訓(xùn)練語料中出現(xiàn)過的詞。
首先我們介紹一種經(jīng)典的平滑方法,即古德-圖靈(Good-Turing)估計法。
nr
和n(r+1)
的意思是訓(xùn)練語料中出現(xiàn)r
及r+1
次的詞的個數(shù)。r
和r+1
自然就是它們在訓(xùn)練語料中實際出現(xiàn)的次數(shù)了。
上文提到,對于沒有看見的事件,我們不能認(rèn)為它發(fā)生的概率就是0,因此我們從概率的總量中分配一個很小的比例給這些沒有看見的事件。所以對于任何一個出現(xiàn)了r
次的n元語法,我們都假定其出現(xiàn)了r*
次,r*
的計算方法如上式所示。
首先我們將,r=0
代入,可以發(fā)現(xiàn)新計算出來的r*
已經(jīng)不等于0了,也即為這些未出現(xiàn)的詞分配了一定的出現(xiàn)概率。
我們用相對頻度來估計出現(xiàn)了r
次的詞的概率和,也即r*nr/N
,N
為訓(xùn)練語料的大小。
總概率是一定的,既然r=0
的概率增加了,那誰的概率減少了呢?
我們考慮這樣一個問題,一般出現(xiàn)次數(shù)越少的詞的個數(shù)越多,也即出現(xiàn)一次的詞的個數(shù)多于出現(xiàn)兩次的詞的個數(shù),也多于出現(xiàn)三次的詞的個數(shù),這叫做Zipf定律。而且往往這種分布符合長尾理論,也即n2/n1
要比n3/n2
小,以此類推。
回到上面的式子中,n(r+1)
是小于nr
的,所以r*
等于r+1
乘以了一個小于1的數(shù),這樣一般情況下r*
是小于r
的,用r*
替代r
,代入r*nr/N
中計算,可以發(fā)現(xiàn)其概率減小了。
而且,其實詞在訓(xùn)練語料中的出現(xiàn)次數(shù)越少,依照訓(xùn)練語料對其概率進行估計的結(jié)果就越不可信,而越是不可信的,其概率就越應(yīng)該被折扣。所以往往我們定一個閾值,出現(xiàn)次數(shù)大于這個閾值的,仍然用原來的r
來表示其出現(xiàn)次數(shù),概率不變;只對出現(xiàn)次數(shù)低于這個閾值的詞,頻率才下調(diào),下調(diào)得到的頻率總和給未出現(xiàn)的詞。
這樣,對于頻率超過一定閾值的詞,它們的概率估計就是它們在語料中的出現(xiàn)的相對頻度,對于頻率小于這個閾值的詞,它們的概率估計就小于它們的相對頻度,出現(xiàn)次數(shù)越少的,折扣越多(因為n2/n1
要比n3/n2
小,所以r
越小,r*
就比r
小的越多,所以算出來的概率也就小的更多)。對于未看見的詞,也給予了一個比較小的概率,這樣所有詞的概率估計都很平滑了。
而且這樣估計了,求和之后就會發(fā)現(xiàn),總概率仍然等于1。
古德-圖靈估計法是種經(jīng)典的平滑方法,但仍然存在很多的不足,比如,我們?yōu)闆]出現(xiàn)的詞平均分配了概率。需要明確的一點是,前面提到過,這里的『詞』并不都指真正意義上的詞,舉個例子,在二元語法中,a b
是一個基元,是一個『詞』,我們發(fā)現(xiàn)a b
不存在,所以我們用古德-圖靈估計法為所有不存在的基元平均的賦予概率,比如賦予了同樣沒出現(xiàn)過的a b
和c d
同樣的概率。但是我們考慮一個問題,如果a b
和c d
都沒出現(xiàn)過,但要是a
、b
都出現(xiàn)過呢,如果a
、b
的出現(xiàn)概率都很高,只是a b
沒有出現(xiàn)過而已,但對于c
和d
,不僅c d
,c
和d
也根本都沒有出現(xiàn)過,那么a b
和c d
應(yīng)該被賦予相同的出現(xiàn)概率嗎?顯然不該,平滑二元文法模型時應(yīng)該考慮到一元文法模型,根據(jù)低階的語法模型分配由于減值而節(jié)省下來的剩余概率給未見事件,要比將剩余概率平均分配給未見事件要合理的多。這就是Katz平滑方法的思想。
其實還有不足,比如『San Francisco』這個詞中的『Francisco』,它作為一元模型時出現(xiàn)的次數(shù)是非常多,但是它只會跟在『San』后面,如果我們根據(jù)上一段的思想,因為它的一元模型出現(xiàn)次數(shù)很多,就在平滑時為『Francisco』和別的詞的搭配賦予了更高的概率,這顯然也是不對的。所以使用的一元文法的概率不應(yīng)該單純和它的出現(xiàn)次數(shù)有關(guān),而是與它前面的不同單詞的數(shù)目成正比。這就是Kneser-Ney平滑方法的思想。
平滑的方法還有很多,當(dāng)前平滑效果最好的方法就是在Kneser-Ney平滑方法上經(jīng)過修正得到的。
概率圖模型
概述
這部分將會講到貝葉斯網(wǎng)絡(luò)、馬爾可夫模型、隱馬爾可夫模型、層次化的隱馬爾可夫模型、馬爾可夫網(wǎng)絡(luò)、最大熵模型、最大熵馬爾可夫模型和條件隨機場,可以說這一章是書名中『統(tǒng)計』兩個字的核心。
動態(tài)貝葉斯網(wǎng)絡(luò)用于處理隨時間變化的動態(tài)系統(tǒng)中的推斷和預(yù)測問題。其中,隱馬爾可夫模型(hidden Markov model,HMM)在語音識別、漢語自動分詞與詞性標(biāo)注和統(tǒng)計機器翻譯等若干語音語言處理任務(wù)中得到了廣泛應(yīng)用;卡爾曼濾波器則在信號處理領(lǐng)域有廣泛的用途。馬爾可夫網(wǎng)絡(luò)又稱馬爾可夫隨機場(MRF),馬爾可夫網(wǎng)絡(luò)下的條件隨機場(CRF)廣泛應(yīng)用于自然語言處理中的序列標(biāo)注、特征選擇、機器翻譯等任務(wù),玻爾茲曼機近年來被用于依存句法分析和語義角色標(biāo)注。
橫向是由點到線(序列結(jié)構(gòu))、到面(圖結(jié)構(gòu))。縱向是在一定條件下生成模型轉(zhuǎn)變?yōu)榕袆e式模型。
在《淺談機器學(xué)習(xí)基礎(chǔ)》中,我們也講過了樸素貝葉斯算法和邏輯回歸算法,了解了樸素貝葉斯算法是生成模型,而邏輯回歸算法是判別模型。
樸素貝葉斯算法是先在不同類別的訓(xùn)練語料上構(gòu)造一元文法模型,也即得到了計算聯(lián)合概率分布所需的先驗概率,然后依照貝葉斯公式通過聯(lián)合概率分布計算測試語句在不同文法模型下的生成概率,選取生成概率最高的那個文法模型所對應(yīng)的類別。
而邏輯回歸算法是用的最大似然估計,先利用默認(rèn)的參數(shù)和模型表示出訓(xùn)練集每個樣本的生成概率,依次相乘得到整個訓(xùn)練集的生成概率,然后對模型參數(shù)進行優(yōu)化,使得整個訓(xùn)練集的總生成概率最大化,當(dāng)需要對測試樣本進行分類時,不需要計算聯(lián)合概率分布,直接代入訓(xùn)練好參數(shù)的模型即可。
這里再深入說一下生成模型與判別模型,生成模型與判別模型的本質(zhì)區(qū)別在于模型中觀測序列x
和狀態(tài)序列y
之間的決定關(guān)系,前者假設(shè)y
決定x
,后者假設(shè)x
決定y
。我們通常說的模型輸入序列就是x
,而輸出序列是y
。
生成模型認(rèn)為,輸出序列y
按照一定的規(guī)律生成輸入序列x
,也即認(rèn)為同一分類結(jié)果對應(yīng)的輸入具有一定規(guī)律,針對聯(lián)合概率分布p(x,y)
進行建模,并且通過估計使生成概率最大的生成序列來獲取y
,也即找出什么樣的輸出序列y
最有可能生成輸入序列x
,這種情況下,y
就是輸入x
后的輸出,通過貝葉斯公式計算出來的p(y|x)
可以這么理解,我們已經(jīng)得到了輸入序列x
,這個輸入序列是由怎樣的輸出序列y
生成的呢?我們選取生成概率最大的生成序列y
作為輸入序列x
的輸出結(jié)果。典型的生成模型有:n元語法模型、HMM、樸素的貝葉斯分類器、概率上下文無關(guān)文法。
判別模型則符合傳統(tǒng)的模型分類思想,認(rèn)為輸出序列y
由輸入序列x
決定,直接對后驗概率p(y|x)
進行建模,它從x
中提取特征,學(xué)習(xí)模型參數(shù),使得條件概率符合一定形式的最優(yōu),也即判別模型知道輸入序列x
應(yīng)該對應(yīng)輸出序列y1
而不是y2
。代表性的判別模型有:最大熵模型、條件隨機場、支持向量機、最大熵馬爾可夫模型、感知機等。
舉一個不太恰當(dāng)?shù)睦樱赡P途褪怯?個男人y1
、y2
、y3
,現(xiàn)在有一個小孩x
,我們看x
最像誰生的,誰就是x
的爸爸。而判別模型就是,這個小孩x
知道他爸爸的特征,x
直接通過特征判斷誰是他爸爸。(我這個例子舉得真是太好了)
貝葉斯網(wǎng)絡(luò)
貝葉斯網(wǎng)絡(luò)是一種基于概率推理的數(shù)學(xué)模型,其理論基礎(chǔ)是貝葉斯公式,其目的是通過概率推理處理不確定和不完整性問題。
形式上,如上圖,一個貝葉斯網(wǎng)絡(luò)就是一個有向無環(huán)圖,節(jié)點表示隨機變量,可以是可觀測變量、隱含變量、未知參量或假設(shè)等;節(jié)點之間的有向邊表示條件依存關(guān)系,箭頭指向的節(jié)點依存于箭頭發(fā)出的節(jié)點(父節(jié)點)。兩個節(jié)點沒有連接表示兩個隨機變量能夠在某些特定情況下條件獨立,而兩個節(jié)點有連接關(guān)系表示兩個隨機變量在任何條件下都不存在條件獨立。
每個節(jié)點還都與一個概率函數(shù)相關(guān),如上圖,對于事件『News』,T的概率為0.2、F的概率為0.8;對于事件『Sightseeing』,在『News』為F的情況下為T的概率0.4、為F的概率為0.6,在『News』為T的情況下為T的概率為0.1、為F的概率為0.9;事件『History』也是同理。
這樣的模型可以回答如下類似的問題:如果『History』為T,那『News』為T的可能性有多大?下式中用H代指『History』,S代指『Sightseeing』,N代指『News』。
第一步推導(dǎo)就是簡單的貝葉斯公式,第二步推導(dǎo)用到了全概率公式的變形(讓我想到了數(shù)理邏輯中的排中律):
第三步就是依照已有的條件概率代入進行計算了。
構(gòu)造貝葉斯網(wǎng)絡(luò)是一項復(fù)雜的任務(wù),涉及表示、推斷和學(xué)習(xí)三個方面內(nèi)容。
首先是表示,貝葉斯網(wǎng)絡(luò)的表示代價很高,即便在上例中隨機變量僅有兩種取值的簡單情況下,一個聯(lián)合概率分布也需要提供2^n
種不同取值下的概率。
然后是推斷,由于貝葉斯網(wǎng)絡(luò)是變量及其關(guān)系的完整模型,因此可以回答關(guān)于變量的詢問,比如,當(dāng)觀察到某些變量(證據(jù)變量)時,推斷另一些變量子集的變化。常用的精確推理方法包括變量消除法和團樹法。
最后是學(xué)習(xí),貝葉斯網(wǎng)絡(luò)的學(xué)習(xí)有兩種,一種是參數(shù)學(xué)習(xí),另一種是結(jié)構(gòu)學(xué)習(xí)。參數(shù)學(xué)習(xí)的目的是確定變量之間相互關(guān)聯(lián)的量化關(guān)系,即依存強度估計。結(jié)構(gòu)學(xué)習(xí)是尋找變量之間的圖關(guān)系。
貝葉斯網(wǎng)絡(luò)是一種不定性因果關(guān)聯(lián)模型,能夠在已知有限的、不完整、不確定信息的條件下進行學(xué)習(xí)和推理,因此廣泛應(yīng)用于故障診斷和維修決策等領(lǐng)域。在自然語言處理中也被應(yīng)用于漢語自動分詞和詞義消歧等任務(wù)。
其實貝葉斯網(wǎng)絡(luò)與我們在《淺談深度學(xué)習(xí)基礎(chǔ)》中講過的人工神經(jīng)網(wǎng)絡(luò)非常相似。他們的共同點如下:
- 它們都是有向圖,每一個節(jié)點只取決于前一級節(jié)點,而與更前面的節(jié)點無關(guān),也就是說遵從馬爾可夫假設(shè)。貝葉斯網(wǎng)絡(luò)其實就是馬爾可夫鏈的拓展。
- 它們的訓(xùn)練方式相似。
- 對于很多模式分類問題,這兩種方法在效果上相似,也就是說很多用人工神經(jīng)網(wǎng)絡(luò)解決的問題,也能用貝葉斯網(wǎng)絡(luò)解決,反之亦然,但是效率可能不同。如果將它們都看做是統(tǒng)計模型,那么這兩種模型的準(zhǔn)確性也是類似的。
- 它們的訓(xùn)練計算量都特別大。
它們也有很多不同之處:
- 人工神經(jīng)網(wǎng)絡(luò)在結(jié)構(gòu)上是完全標(biāo)準(zhǔn)化的,而貝葉斯網(wǎng)絡(luò)更靈活。
- 在人工神經(jīng)網(wǎng)絡(luò)中,雖然神經(jīng)元的激活函數(shù)可以為非線性函數(shù),但是各個輸入變量只能先進行線性組合,最后對前面組合出來的結(jié)果進行非線性變換,因此用計算機實現(xiàn)起來比較容易。而貝葉斯網(wǎng)絡(luò),變量可以組合成任意的函數(shù),毫無限制,在獲得靈活性的同時,也增加了復(fù)雜性。
- 貝葉斯網(wǎng)絡(luò)更容易考慮上下文的相關(guān)性,因此可以解碼一個輸入的序列,比如將一段語音識別成文字,或者將一個英語句子翻譯成中文,而普通的人工神經(jīng)網(wǎng)絡(luò)的輸出相對孤立,它可以識別一個個字,但是很難處理一個序列(RNN就是為了解決這個問題而設(shè)計的)。
馬爾可夫模型
前面的貝葉斯網(wǎng)絡(luò)用于在已知某隨機變量值的前提下推斷其它隨機變量的可能取值,而馬爾可夫模型描述的是一個狀態(tài)轉(zhuǎn)化的隨機過程。
如果一個系統(tǒng)有N個有限狀態(tài),那么隨著時間的推移,該系統(tǒng)將從某一狀態(tài)轉(zhuǎn)移到另一個狀態(tài)。對該系統(tǒng)的描述,通常需要給出當(dāng)前時刻的狀態(tài)和其前面所有狀態(tài)的關(guān)系,如果在特定條件下,系統(tǒng)在時間t的狀態(tài)j
只與其在時間t-1的狀態(tài)i
相關(guān),則該系統(tǒng)構(gòu)成一個離散的一階馬爾可夫鏈。
進一步,如果只考慮獨立于時間t的隨機過程,那我們就能得到兩個狀態(tài)之間的轉(zhuǎn)移概率aij
,該隨機過程為馬爾可夫模型,aij
需要大于0,而且從i
出發(fā)到達(dá)所有可能的j
的概率和應(yīng)該為1。
例如,一段文字中名詞、動詞、形容詞三類詞性出現(xiàn)的情況可由三個狀態(tài)的馬爾可夫模型描述:s1
:名詞、s2
:動詞、s3
:形容詞。假定狀態(tài)之間的轉(zhuǎn)移矩陣如下:
那么根據(jù)這一模型M,一個以名詞開頭的句子O的詞性序列為名詞、動詞、形容詞、名詞的概率為:
馬爾可夫模型又可視為隨機的有限狀態(tài)自動機:
如上例,一個馬爾可夫鏈的狀態(tài)序列的概率可以通過計算形成該狀態(tài)序列的所有狀態(tài)之間轉(zhuǎn)移弧上的概率乘積而得出。
前面也講過,n元文法模型就是n-1階馬爾可夫模型。
隱馬爾可夫模型
接下來是隱馬爾可夫模型,隱馬爾可夫模型是一種經(jīng)典的概率圖模型,應(yīng)用非常廣泛。
在馬爾可夫模型中,每個狀態(tài)代表了一個可觀察的事件,所以馬爾可夫模型有時又可稱作可視馬爾可夫模型(VMM),這在某種程度上限制了模型的適應(yīng)性。
在隱馬爾可夫模型(HMM)中,有兩個序列,一個序列是狀態(tài)序列,類似于VMM中的狀態(tài)轉(zhuǎn)換過程,狀態(tài)序列是隱蔽的;另一個是觀察序列,可以觀察到,觀察序列由狀態(tài)序列經(jīng)過相應(yīng)的隨機函數(shù)得到。也即隱馬爾可夫模型是一個雙重的隨機過程,隱蔽的狀態(tài)轉(zhuǎn)換是一個隨機過程,由狀態(tài)序列得到觀察序列又是一個隨機過程。
舉個例子,一個暗室中有N個口袋,每個口袋中有M種不同顏色的球。一個實驗員根據(jù)概率分布隨機選擇了一個口袋,再根據(jù)口袋中不同顏色球的概率分布,隨機的取出一個球,向室外報告球的顏色,然后再根據(jù)口袋的概率分布選擇另一個口袋,根據(jù)不同顏色球的概率分布從中隨機選擇另外一個球,重復(fù)進行這個過程。
對于暗室外面的人,他不知道口袋的序列,只知道球的序列。
描述一個HMM需要五個部分,通過上例也可以看出來:
- 模型中狀態(tài)的數(shù)目N(上例中口袋的數(shù)目)
- 每個狀態(tài)可能輸出的不同符號的數(shù)目M(上例中球的不同顏色數(shù))
- 狀態(tài)轉(zhuǎn)移矩陣A={
aij
}(上例中口袋的轉(zhuǎn)換概率) - 從狀態(tài)觀察到符號的概率分布矩陣B={
bj(k)
},即從第j個口袋取出第k種顏色的球的概率,觀察符號的概率又稱符號發(fā)射概率。 - 初始狀態(tài)概率分布π={
πi
},所有πi
之和為1。
觀察序列的產(chǎn)生步驟如下:
- 根據(jù)初始狀態(tài)的概率分布
πi
選擇一個初始狀態(tài) - 假定時間t=1
- 根據(jù)狀態(tài)的輸出概率分布輸出觀察符號
- 根據(jù)狀態(tài)轉(zhuǎn)移概率分布,由當(dāng)前時刻t的狀態(tài)
qt
轉(zhuǎn)移到新的狀態(tài)q(t+1)
- 重復(fù)執(zhí)行上兩步直到t到達(dá)總時間長度T
HMM中有三個假設(shè):
- 有限歷史性假設(shè):也即一階馬爾可夫模型,認(rèn)定t時刻出現(xiàn)的狀態(tài)只與t-1時刻的狀態(tài)有關(guān)
- 齊次性假設(shè):假定P(
s(i+1)
|si
)=P(s(j+1)
,sj
) - 輸出獨立性假設(shè):假定輸出僅與當(dāng)前狀態(tài)有關(guān)
HMM中有三個基本問題:
- 估計問題:給定一個觀察序列O=O1O2...OT和模型μ=(A, B, π),如何快速地計算出給定模型μ的情況下,觀察序列O的概率,即P(O|μ)?
- 解碼問題:給定一個觀察序列O=O1O2...OT和模型μ=(A, B, π),如何快速有效地選擇在一定意義下的最優(yōu)狀態(tài)序列Q=q1q2...qT,使得該狀態(tài)序列最好地解釋觀察序列?
- 訓(xùn)練問題或參數(shù)估計問題:給定一個觀察序列O=O1O2...OT,如何根據(jù)最大似然估計來求模型的參數(shù)值?即如何調(diào)節(jié)模型μ=(A, B, π)的參數(shù),使得P(O|μ)最大?
先說第一個估計問題,也即求解觀察序列的概率,我們先來想一種最直接的推導(dǎo)方式:假設(shè)狀態(tài)序列Q已經(jīng)給定,那我們將Q到O對應(yīng)位置上的符號發(fā)射概率依次相乘即可得到觀察序列的概率。但是因為目前不知道Q,我們應(yīng)該將給定模型μ下,所有可能的Q都列舉出來,然后將其得到O的概率全部相加。也即下式:
不過這樣存在一個很大的問題,就是復(fù)雜度過高,如果模型中有N個狀態(tài),時間長度為T,那就有N^T種可能的序列,當(dāng)T很大時,幾乎不可能有效的執(zhí)行這個過程。
為了解決這個問題,我們利用動態(tài)規(guī)劃算法的思想,這里我們提出前向算法。
首先我們定義一個前向變量αt(i)
,αt(i)
是給定模型μ下,在時間t,HMM輸出了序列O1O2...Ot,并且當(dāng)前狀態(tài)為si
的概率:
前向算法的主要思想是,如果可以快速的計算前向變量αt(i)
,那么就可以利用αt(i)
計算出P(O|μ),因為P(O|μ)其實就是所有狀態(tài)qt
下觀察到序列O1O2...OT的概率:
因為αT(i)
就是輸出O1O2...OT,且狀態(tài)為si
的概率,其實我們要的只是輸出O1O2...OT,si
為哪個都可以,所以這里利用全概率公式的思想,我們把時刻T下出現(xiàn)任意狀態(tài)且觀察到O1O2...OT的概率相加,即得到了觀察到O1O2...OT的概率。
我們還可以觀察出前向變量αt(i)
的遞推公式,因為t+1時刻的前向變量α(t+1)(j)
實際上就是t時刻之后,狀態(tài)序列增加了一個sj
,然后觀察序列多輸出了一個O(t+1)。所以我們先根據(jù)前面提過的全概率公式的思想計算出輸出序列O1O2...Ot的概率,然后因為狀態(tài)由所有可能的狀態(tài)si
變到了某一特定sj
所以自然要乘一個對應(yīng)的aij
,然后我們就得到了t+1時刻下的狀態(tài)序列,這個狀態(tài)序列的最后一個狀態(tài)是sj
。然后為了得到輸出序列O1O2...OtO(t+1),只需要再多乘一個bj(O(t+1))
,也即狀態(tài)sj
發(fā)射出符號O(t+1)的概率,因為前面已經(jīng)是O1O2...Ot了。也即如下式:
前向變量的歸納關(guān)系圖如下,其實也就是我上一段講的東西:
t時刻已經(jīng)輸出到Ot了,然后先讓所有可能的狀態(tài)轉(zhuǎn)移到狀態(tài)sj
,然后再讓sj
發(fā)射出符號O(t+1)。
由此我們得到了前向算法,首先依照初始狀態(tài)概率分布和初始輸出符號O1對狀態(tài)進行初始化,然后依照遞推公式計算出所有的αT(i)
,將其求和即得到P(O|μ)。
前向算法的時間復(fù)雜度為O(T*N2),N2是兩層相乘,T是層數(shù)。
求解P(O|μ),除了前向算法之外,相應(yīng)的,我們還要提出一個后向算法。
對應(yīng)于前向變量,我們定義一個后向變量βt(i)
,βt(i)
是在給定模型μ,并且t時刻狀態(tài)為si
的條件下,HMM輸出觀察序列O(t+1)O(t+2)...OT的概率。這里和前向變量有一個明顯的不同,對于前向變量,條件只有模型μ,說的是『輸出O1O2...OT,且狀態(tài)為si
的概率』,而后向變量說的是『狀態(tài)為si
的條件下,輸出O(t+1)O(t+2)...OT的概率』,條件除了μ之外,狀態(tài)si
也成了前提條件。后向變量表達(dá)式如下:
我們思考一下怎么用后向變量表示P(O|μ),看著后向變量的表達(dá)式,我們考慮,如果t=1呢?那么后向變量βt(i)
就成了初始狀態(tài)為si
然后輸出后續(xù)觀察序列為O2O3...OT的概率了,那還缺什么?缺兩部分,一個是初始狀態(tài),而且我們要考慮所有可能的si
初始狀態(tài),第二個就是我們還缺觀察序列的第一個符號,也就是O1,那么我們只要讓s1
輸出O1
就可以了,也即我們用后向變量表示出了P(O|μ),如下式:
∑求和考慮了所有的初始狀態(tài),然后πi給出了任意初始狀態(tài)的出現(xiàn)概率,然后后面bi(O1)
是該初始狀態(tài)發(fā)射出觀察符號O1的概率。
對照前向算法,我們還缺后向變量的遞推公式,我們想一下t+1時刻的后向變量和t時刻的后向變量的關(guān)系,因為最后我們需要的是β1(i)
,所以我們的遞推公式應(yīng)該是由β(t+1)(j)
得到β(t)(i)
,β(t)(i)
是狀態(tài)為si
下,后續(xù)輸出為O(t+1)O(t+2)...OT,β(t+1)(j)
是狀態(tài)為sj
下,后續(xù)狀態(tài)為O(t+2)O(t+3)...OT的概率。我們考慮一下由β(t+1)(j)
到β(t)(i)
需要什么,首先我們?nèi)币粋€輸出符號O(t+1),這個輸出符號正是由t+1時刻的狀態(tài)sj
輸出的,所以我們需要乘以一個bj(O(t+1))
,然后我們的狀態(tài)不對,我們需要由狀態(tài)sj
轉(zhuǎn)移到si
,所以需要乘以aij
,而且t時刻對應(yīng)狀態(tài)si
下,t+1
時刻對應(yīng)的狀態(tài)sj
是任意的,所以我們需要∑求和。
我們參考一下后向變量的歸納關(guān)系圖,和我上一段講的是一個意思:
t+1時刻后面的O(t+2)已經(jīng)有了,缺O(jiān)(t+1),我們就讓所有可能的sj
都去生成O(t+1),然后再讓這些sj
都轉(zhuǎn)化成β(t)(i)
里面的那個si
。
由此我們得到了后向算法,首先初始化βT(i)
=1,然后根據(jù)遞推公式計算出β1(i)
,最后按照前面的公式通過β1(i)
計算出P(O|μ)。
然后其實更一般的,我們可以采用前向算法和后向算法相結(jié)合的方法來計算P(O|μ):
對于任意合理時刻t,前向變量與后向變量的乘以剛好就是P(O|μ),當(dāng)然我們也要考慮到t時刻所對應(yīng)的狀態(tài)是任意的,所以我們要將概率∑求和,考慮到所有情況。不過這個算法不是前向后向算法,前向后向算法是用來解決第三個問題的。
然后是HMM的第二個問題,即給定一個觀察序列O=O1O2...OT和模型μ=(A, B, π),如何快速有效地選擇在一定意義下的最優(yōu)狀態(tài)序列Q=q1q2...qT,使得該狀態(tài)序列最好地解釋觀察序列。我們這里將最優(yōu)狀態(tài)序列理解為,在給定模型μ和觀察序列O的前提下,使條件概率P(Q|O,μ)最大的狀態(tài)序列。這樣我們優(yōu)化的不是狀態(tài)序列中的單個狀態(tài),而是整個狀態(tài)序列,不會存在因為優(yōu)化單個狀態(tài)概率而導(dǎo)致產(chǎn)生不合法序列或無法達(dá)到全局最優(yōu)。
解決這個問題采用的是維特比算法,維特比算法采用了動態(tài)規(guī)劃的思想來求解這種最優(yōu)狀態(tài)序列。
首先我們定義一個維特比變量δt(i)
,δt(i)
是在時間t時,HMM沿著某一條路徑到達(dá)狀態(tài)si
,并輸出觀察序列O1O2...Ot的最大概率,也即如下式:
維特比變量也有自己的遞推公式,與前向變量的相似:
看起來挺簡單的,先狀態(tài)轉(zhuǎn)化,由j到i,取最大值,然后狀態(tài)序列就到了狀態(tài)si
,然后由si
發(fā)射出符號O(t+1)就結(jié)束了。但是這里需要明確一個問題,也就是δ(t+1)(i)
為什么會由
δ(t)(j)
得到,也即t+1時刻(到某特定狀態(tài)si
)擁有最大概率的狀態(tài)序列和t時刻(到所有可能狀態(tài)sj
)擁有最大概率的狀態(tài)序列們是什么關(guān)系?
首先是,t時刻(到所有可能狀態(tài)sj
)擁有最大概率的狀態(tài)序列們對于計算t+1時刻(到某特定狀態(tài)si
)擁有最大概率的狀態(tài)序列為什么是必要的。
如果t+1時刻概率最大的狀態(tài)序列t時刻經(jīng)過了某個狀態(tài)sj
,那這個狀態(tài)序列從初始狀態(tài)到狀態(tài)sj
的子狀態(tài)序列一定是從初始狀態(tài)到sj
狀態(tài)的所有可能的狀態(tài)序列里面,概率最大的那一條。因為sj
到si
的概率是一定的,如果sj
到初始狀態(tài)的序列不是概率最大的那一條,那t+1時刻的這個狀態(tài)序列也一定不是概率最大的狀態(tài)序列。
然后是,為什么t時刻(到所有可能狀態(tài)sj
)擁有最大概率的狀態(tài)序列們對于計算t+1時刻(到某特定狀態(tài)si
)擁有最大概率的狀態(tài)序列是充分的。
要產(chǎn)生t+1時刻的狀態(tài)si
必然要先產(chǎn)生t時刻的某個狀態(tài)sj
,假定所有可能的狀態(tài)sj
有k個(這里不是N個的原因,是因為可能有的狀態(tài)sj
到si
的轉(zhuǎn)化概率aji
為0,不可能出現(xiàn)在t+1時刻產(chǎn)生si
的這個序列里面),然后我們記錄了這k個狀態(tài)sj
到初始狀態(tài)且擁有最大概率的狀態(tài)序列,那t+1時刻概率最大的那個狀態(tài)序列必然經(jīng)過其中的一條,也即其中必然有一條是t+1時刻概率最大的那個狀態(tài)序列t時刻的子狀態(tài)序列。這樣,任何時刻,只要考慮非常有限條候選路徑即可。
這樣我們只用記錄t時刻(到所有可能狀態(tài)sj
)擁有最大概率的狀態(tài)序列們,也即δt(j)
,就能得到t+1時刻到狀態(tài)si
擁有最大概率的狀態(tài)序列δ(t+1)(i)
。一直遞推下去,我們就能得到δT(i)
,也即最后一個時刻擁有最大概率的狀態(tài)序列了,也即求得了使P(Q|O,μ)概率最大的狀態(tài)序列Q。
接下來是第三個問題,即給定一個觀察序列O=O1O2...OT,如何根據(jù)最大似然估計來求模型的參數(shù)值?即如何調(diào)節(jié)模型μ=(A, B, π)的參數(shù),使得P(O|μ)最大?
隱馬爾可夫模型μ包括三部分,分別是初始狀態(tài)概率分布π={πi
}、狀態(tài)轉(zhuǎn)移矩陣A={aij
}、從狀態(tài)觀察到符號的概率分布矩陣B={bj(k)
},如果產(chǎn)生觀察序列的狀態(tài)序列Q=q1q2...qT已知,那我們根據(jù)最大似然估計,HMM的參數(shù)就可以通過如下公式計算:
第一行是描述初始概率分布,其中,δ(x,y)為克羅奈克函數(shù),當(dāng)x=y時,δ(x,y)=1;否則δ(x,y)=0。這個其實很好理解,如果狀態(tài)序列都有了,那什么樣的初始概率分布最能擬合這個狀態(tài)序列呢?當(dāng)然是讓初始概率分布中,狀態(tài)序列里真實的那個初始狀態(tài)作為初始狀態(tài)的概率為1,其余的都是0了。
第二個式子描述的是狀態(tài)轉(zhuǎn)移概率,同樣的,狀態(tài)序列都有了,就按照狀態(tài)序列的結(jié)果去構(gòu)造模型就好了。比如,狀態(tài)序列中,si
只轉(zhuǎn)移到sj
,那aij
我們就定為100%,如果sj
一次轉(zhuǎn)移到了sk
一次轉(zhuǎn)移到了sl
,那ajk
和ajl
的概率就都是50%好了。
第三個式子描述的是符號發(fā)射概率,同樣的思路,狀態(tài)序列也有,觀察序列也有,我們直接計算一下這兩個序列所反映出來的實際符號發(fā)射概率是多少,然后把它們作為參數(shù)賦給模型就好了,這肯定是概率最大的情況。
上面的想法看起來很好,但是關(guān)鍵問題是我們要處理的是隱馬爾可夫模型,也就意味著我們是不知道狀態(tài)序列Q的,所以沒辦法直接用這種最大似然估計。但是期望最大化算法(expection maximization,EM)可以用于這種含有隱變量的統(tǒng)計模型的最大似然估計。
前面的《淺談機器學(xué)習(xí)基礎(chǔ)》和《淺談深度學(xué)習(xí)基礎(chǔ)》提到過最大似然估計、梯度上升/下降算法,現(xiàn)在又提到了期望最大化算法,那它們有什么區(qū)別呢?
講邏輯回歸算法(LR)的時候我們就提到了最大似然估計,我們根據(jù)最大似然估計得到了目標(biāo)函數(shù),也即最大自然估計是一種求得目標(biāo)函數(shù)的方法;而梯度上升/下降算法是一種最優(yōu)化算法,在LR中,最大似然估計得到的目標(biāo)函數(shù)就是由梯度上升算法進行優(yōu)化的。
EM與梯度上升/下降算法一樣,也是一種最優(yōu)化方法,用于優(yōu)化目標(biāo)函數(shù),但區(qū)別就在于梯度上升/下降算法的『梯度』上,我們知道梯度實際上是偏導(dǎo),梯度上升/下降算法實際上是根據(jù)不同維度上的偏導(dǎo)來決定參數(shù)的改變,但是EM并不求導(dǎo),因為并不是所有的式子都是方便求導(dǎo)的。
EM 算法是作為一種求參數(shù)極大似然估計的方法而被提出的,舉個形象的例子,比如說食堂的大師傅炒了一份菜,要等分成兩份給兩個人吃,顯然沒有必要拿來天平一點一點的精確的去稱分量,最簡單的辦法是先隨意的把菜分到兩個碗中,然后觀察是否一樣多,把比較多的那一份取出一點放到另一個碗中,這個過程一直迭代地執(zhí)行下去,直到大家看不出兩個碗所容納的菜有什么分量上的不同為止。
EM算法就是這樣,假設(shè)我們估計知道A和B兩個參數(shù),在開始狀態(tài)下二者都是未知的,并且知道了A的信息就可以得到B的信息,反過來知道了B也就得到了A。可以考慮首先賦予A某種初值,以此得到B的估計值,然后從B的當(dāng)前值出發(fā),重新估計A的取值,這個過程一直持續(xù)到收斂為止。
如果將EM算法的思想應(yīng)用于最大似然估計HMM模型的參數(shù),其基本思想是,初始時隨機地給模型的參數(shù)賦值(隨意的給第一個同學(xué)打飯),該賦值遵循模型對參數(shù)的限制(飯的總量是一定的),例如,從某一狀態(tài)出發(fā)的所有轉(zhuǎn)移概率的和為1。給模型參數(shù)賦值以后,得到模型μ0,然后根據(jù)μ0可以得到模型中隱變量的期望值(剩下的飯給第二個同學(xué)),例如,從μ0得到從某一狀態(tài)轉(zhuǎn)移到另一狀態(tài)的期望次數(shù),用期望次數(shù)來替代我們不知道的實際狀態(tài)轉(zhuǎn)移次數(shù),這樣可以得到模型參數(shù)的新估計值,由此得到新的模型μ1(發(fā)現(xiàn)第二個同學(xué)飯多了,取一部分給第一個同學(xué)),然后不斷迭代,直到參數(shù)收斂于最大似然估計值(兩個同學(xué)飯一樣多)。
這種迭代爬山算法可以局部地使P(O|μ)最大化,HMM中具體實現(xiàn)這種EM方法的算法叫做Baum-Welch算法,也叫前向后向算法,下面我們詳細(xì)介紹這種算法:
這里我們引入這樣一個變量ξt(i,j)
,ξt(i,j)
是給定HMM的參數(shù)μ和觀察序列O=O1O2...OT,在時間t位于狀態(tài)si
,時間t+1位于狀態(tài)sj
的概率。與前向變量和后向變量的定義很相近:
那ξt(i,j)
與前向變量和后向變量的關(guān)系是什么呢?首先是計算公式:
計算公式只是代入計算的時候用到的,我們還是要理解它們的本質(zhì)。
我們先來回想一下前向變量和后向變量有什么關(guān)系,前面在解決HMM的第一個問題的時候,提出了一種結(jié)合前向變量和后向變量的方法,從那個方法中我們能夠發(fā)現(xiàn),前向變量和后向變量的設(shè)計是非常巧妙的,我們再看一下它們的表達(dá)式:
我們想一下前向變量αt(i)
和后向變量βt(i)
相乘是什么,前向變量的條件是模型μ,前向變量是已知模型μ,得到觀察序列O1O2...Ot,且當(dāng)前狀態(tài)為si
的概率,然后再乘以后向變量,后向變量的條件是模型μ和當(dāng)前狀態(tài)為si
,這個當(dāng)前狀態(tài)為si
正好與前向變量的結(jié)論契合的嚴(yán)絲合縫,然后我們繼續(xù)看,后向變量的結(jié)論是O(t+1)O(t+2)...OT,當(dāng)時提出后向變量的時候有沒有想過這樣一個問題,為什么是O(t+1)O(t+2)...OT,而不是OtO(t+1)...OT,從Ot而不是O(t+1)開始?為的就是與前向變量向契合,前向變量的結(jié)論是O1O2...Ot,再加上后向變量的結(jié)論O(t+1)O(t+2)...OT,正好是全部的觀察序列O1O2...OT。
然后我們再看ξt(i,j)
,它的定義是給定HMM的參數(shù)μ和觀察序列O=O1O2...OT,在時間t位于狀態(tài)si
,時間t+1位于狀態(tài)sj
的概率。
ξt(i,j)
與前向變量αt(i)
和后向變量β(t+1)(j)
的關(guān)系如下:
前面講了αt(i)
與β(t)(i)
的關(guān)系,這里有些區(qū)別,不是β(t)(i)
而是t+1時刻的β(t+1)(j)
。根據(jù)ξt(i,j)
的定義,我們需要觀察序列O=O1O2...OT、在時間t位于狀態(tài)si
和時間t+1位于狀態(tài)sj
,依次補齊即可,αt(i)
提供了O1O2...Ot和在時間t位于狀態(tài)si
,β(t+1)(j)
提供了O(t+2)O(t+3)...OT和在時間t+1位于狀態(tài)sj
,還缺什么?還缺狀態(tài)si
到狀態(tài)sj
的轉(zhuǎn)化和符號O(t+1),這就很清楚了,乘以aij
和bj(O(t+1))
即可,我們再看一下上面的式子:
分子就與我們推理出來的表達(dá)式相同,但是多了一個分母P(O|μ),是因為在ξt(i,j)
的定義里,觀察序列O屬于已知條件,應(yīng)該放在豎線的右側(cè),所以除以P(O|μ),根據(jù)貝葉斯公式轉(zhuǎn)化得到ξt(i,j)
。
根據(jù)ξt(i,j)
,依照全概率公式的思想,我們可以知道給定μ和觀察序列O下,在時間t位于狀態(tài)si
的概率γt(i)
:
有了ξt(i,j)
和γt(i)
,我們就可以重新計算出μ參數(shù)估計值了(也即把第二個同學(xué)的飯分一部分給第一個同學(xué)):
前向后向算法的基本過程:
-
初始化,隨機給μ的參數(shù)賦值,同時保證:
EM計算
E-步驟:根據(jù)模型μ計算ξt(i,j)
和γt(i)
M-步驟:根據(jù)ξt(i,j)
和γt(i)
重新估計模型μ重復(fù)執(zhí)行EM計算,直到模型μ的參數(shù)收斂
HMM在自然語言處理研究中有著非常廣泛的應(yīng)用,除了上面的理論問題之外,還有一些技術(shù)上的問題需要注意,比如連乘引起的浮點數(shù)下溢,或者取對數(shù)使乘法變成加法,還有在前向后向算法中給出一個足夠小的實數(shù)來判定模型參數(shù)是否收斂。