轉載請注明地址(http://blog.csdn.net/xinzhangyanxiang/article/details/8522078)
學習概率的時候,大家一定都學過馬爾科夫模型吧,當時就覺得很有意思,后來看了數學之美之隱馬模型在自然語言處理中的應用后,看到隱馬爾科夫模型竟然能有這么多的應用,並且取得了很好的成果,更覺的不可思議,特地深入學習了一下,這里總結出來。
馬爾科夫過程
馬爾科夫過程可以看做是一個自動機,以一定的概率在各個狀態之間跳轉。
考慮一個系統,在每個時刻都可能處於N個狀態中的一個,N個狀態集合是 {S1,S2,S3,...SN}。我們現在用q1,q2,q3,…qn來表示系統在t=1,2,3,…n時刻下的狀態。在t=1時,系統所在的狀態q取決於一個初始概率分布PI,PI(SN)表示t=1時系統狀態為SN的概率。
馬爾科夫模型有兩個假設:
1. 系統在時刻t的狀態只與時刻t-1處的狀態相關;(也稱為無后效性)
2. 狀態轉移概率與時間無關;(也稱為齊次性或時齊性)
第一條具體可以用如下公式表示:
P(qt=Sj|qt-1=Si,qt-2=Sk,…)= P(qt=Sj|qt-1=Si)
其中,t為大於1的任意數值,Sk為任意狀態
第二個假設則可以用如下公式表示:
P(qt=Sj|qt-1=Si)= P(qk=Sj|qk-1=Si)
其中,k為任意時刻。
下圖是一個馬爾科夫過程的樣例圖:

可以把狀態轉移概率用矩陣A表示,矩陣的行列長度均為狀態數目,aij表示P(Si|Si-1)。
隱馬爾科夫過程
與馬爾科夫相比,隱馬爾科夫模型則是雙重隨機過程,不僅狀態轉移之間是個隨機事件,狀態和輸出之間也是一個隨機過程,如下圖所示:
此圖是從別處找來的,可能符號與我之前描述馬爾科夫時不同,相信大家也能理解。
該圖分為上下兩行,上面那行就是一個馬爾科夫轉移過程,下面這一行則是輸出,即我們可以觀察到的值,現在,我們將上面那行的馬爾科夫轉移過程中的狀態稱為隱藏狀態,下面的觀察到的值稱為觀察狀態,觀察狀態的集合表示為 O={O1,O2,O3,…OM}。
相應的,隱馬爾科夫也比馬爾科夫多了一個假設,即輸出僅與當前狀態有關,可以用如下公式表示:
P(O1,O2,…,Ot|S1,S2,…,St)=P(O1|S1)*P(O2|S2)*...*P(Ot|St)
其中,O1,O2,…,Ot為從時刻1到時刻t的觀測狀態序列,S1,S2,…,St則為隱藏狀態序列。
另外,該假設又稱為輸出獨立性假設。
舉個例子
舉個常見的例子來引出下文,同時方便大家理解!比如我在不同天氣狀態下去做一些事情的概率不同,天氣狀態集合為{下雨,陰天,晴天},事情集合為{宅着,自習,游玩}。假如我們已經有了轉移概率和輸出概率,即P(天氣A|天氣B)和P(事情a|天氣A)的概率都已知道,那么則有幾個問題要問(注意,假設一天我那幾件事情中的一件),
1. 假如一周內的天氣變化是 下雨->晴天->陰天->下雨->陰天->晴天->陰天,那么我這一周 自習->宅着->游玩->自習->游玩->宅着->自習的概率是多大?
2. 假如我這一周做事序列是 自習->宅着->游玩->自習->游玩->宅着->自習,
不知道天氣狀態的情況下這個做事序列的概率是多大?
3. 假如一周內的天氣變化是 下雨->晴天->陰天->下雨->陰天->晴天->陰天,那我們這一周最有可能的做事序列是什么?
4. 假如我這一周做事序列是 自習->宅着->游玩->自習->游玩->宅着->自習,那么這一周的天氣變化序列最有可能是什么?
對於第一個問題,我想大家應該都能很快知道怎么算。(啥?不知道,答案在本文最后)
隱馬模型基本要素及基本三問題
綜上所述,我們可以得到隱馬爾科夫的基本要素,即一個五元組{S,N,A,B,PI};
S:隱藏狀態集合;
N:觀察狀態集合;
A:隱藏狀態間的轉移概率矩陣;
B:輸出矩陣(即隱藏狀態到輸出狀態的概率);
PI:初始概率分布(隱藏狀態的初始概率分布);
其中,A,B,PI稱為隱馬爾科夫的參數,用X表示。
由上述問題可以引出隱馬爾科夫的三個基本問題的其中兩個,下文中為了簡便,將隱馬爾科夫模型簡稱為HMM(Hiden Markov Model)。
HMM的三個基本問題是:
1. 給定模型(五元組),求某個觀察序列O的概率(樣例問題2)
2. 給定模型和觀察序列O,求可能性最大的隱藏狀態序列(樣例問題4)。
3. 對於給定的觀察序列O,調整HMM的參數,使觀察序列出現的概率最大。
前向算法
對於第一個基本問題,計算公式為:
即對於觀察序列O,我們需要找出所有可能的隱藏狀態序列S,計算出在給定模型下S輸出為O的概率(就是樣例問題一啊),然后計算概率之和。
直觀上看,假如序列O的長度為T,模型的隱藏狀態集合大小為N,那么一共有NT個可能的隱藏狀態序列,計算復雜度極高O(NT),暴力算法太慢了。
解決方案就是動態規划(Dynamic Programming)。
假設觀察序列為O1,O2,O3,….,Ot. 在時刻i(1<i<=t)時,定義C為產生序列O1,O2,…,Oi且Si=Sk的概率:
其中,Sk為任意一個隱藏狀態值。
則C(i+1,Or)的計算公式為:
其中,Sr為任意一個隱藏狀態值。A為轉移概率。B為隱藏狀態到觀察狀態的概率。為了便於理解,還是看圖:

C(3,下雨)考慮了t=1和t=2的所有組合情況,同時也是C(4,下雨|陰天|晴天)的子問題。C(3,陰天)和C(3,晴天)也是如此計算,而C(i+1,Sr)計算公式則可以表示成:

由圖知:C(4,陰天)=[C(3,下雨)*A(下雨,陰天)+C(3,陰天)*A(陰天,陰天)+C(3,晴天)*A(晴天,陰天)]*B(陰天,自習)。
通過圖片,大家應該能直觀的理解該算法了,該算法又稱為前向算法,那還有后向算法?是的,后向算法就是這個算法倒過來嘛,也是動態規划,這里就不贅述了,有興趣的看參考文獻。另外,這里沒有講解如何初始化概率,也可以去參考文獻里查證。
維特比算法
現在,HMM的第一個基本問題解決了,下面開始解決第二個問題,第二個問題又稱為解碼問題,同樣的,暴力算法是計算所有可能性的概率,然后找出擁有最大概率值的隱藏狀態序列。與問題一的暴力解決方案類似,復雜度為O(NT)。
那應該用什么方案呢?
毫無疑問,還是動態規划啊!
假設觀察序列為O1,O2,O3,….,Ot. 在時刻i(1<i<=t)時,定義D為觀察O1,O2,…,Oi且Si=S k時產生該觀察序列的最大概率:
其中,S1,S2,….S(i-1),在此時也已經可以得到,因為它們是子問題啊。
童鞋們有么有看到該公式和上面的前向算法的差異?一個是對子問題求和,一個是對子問題求最大值啊。
當然,對於本問題來說,因為需要求出的是使得觀察序列概率最大的隱藏狀態的序列,而不是最大概率,所以,在算法計算過程中,還需要記錄前一個隱藏狀態的值。比如C(4,陰天)的最大值是有子問題C(3,下雨)得來的,那么需要在C(4,陰天)這個節點記錄前置狀態為下雨。
由於本算法和前向算法只是計算公式的不同,所以參考圖是一樣的,本算法還可以參考上面算法的圖;同樣的,解釋中沒有提到初始化,可以去看參考文獻。
本算法又稱為維特比算法,維特比是人名,這個老先生在上世紀70年代發明的該算法,但在現代人看來沒什么神秘,可見問題在解決后可能會很簡單,所以不管是生活上還是學術上都不要畏懼,勇於戰而后知戰之易矣。
相信理解了前向算法和維特比算法后,大家對樣例問題2和樣例問題4都能解決了吧,對於樣例問題3,其實跟維特比算法差不多,只不過是在觀察狀態的空間中尋找最優解。
對於基本問題三,本人還沒有理解的太透徹,這里就不獻丑了。
應用
說了這么多,HMM到底有什么應用呢?
HMM一開始是在信息論中應用的,后來才被應用到自然語言處理還有其他圖像識別等各個方面。下面舉兩個例子說明他的應用,一個是輸入法的整句解碼,一個是語音識別。有圖為證:
輸入法把拼音看做是觀察狀態,需要得到的漢字為隱藏狀態,這樣,輸入法的整句解碼就變成了維特比解碼,其轉移概率即是二元語言模型,其輸出概率即是多音字對應不同拼音的概率。
將上圖中的拼音換成語音,就成了語音識別問題,轉移概率仍然是二元語言模型,其輸出概率則是語音模型,即語音和漢字的對應模型。
擴展
盡管HMM模型解決問題的效果已經很好了,但在學術上,精益求精,總的想着方法使它變得更好。於是出現了針對HMM的各種擴展,這里介紹兩種吧。
一種是對三大假設的時齊性進行擴展,即假設狀態轉移概率與時間有關。這在輸入法中也有實際意義的,比如作為主語的ta(他,它,她)與名詞ta(塔)和動詞ta(踏,蹋)等出現的位置一般是不一樣的,主語一般出現在句首或各種從句的開始端;比如,我們會說“他是誰”,而極少說“塔是誰”(不排除有個別奇葩的人的名字只有一個塔字),這樣,我們在考慮‘ta’shi’shui’這個拼音串時,第一個字ta考慮他,它,她的概率會大一些,塔字的概率就會小一些。
在這個方面,參考文獻中的論文《一種非時齊性的隱馬爾科夫模型在音字轉換中的應用》中提到了一種實現方法,統計語言模型時,使用詞語在句子中的位置作為位置統計出詞語的平均位置。在音字轉換的語言模型的使用時,使用拼音所對應的詞語位置與平均位置的一個函數作為權重重新估計語言模型的概率。公式如下:
其中PML(w1|w2)是最大似然估計的轉移概率,f(.)則為權重函數。
另外一種擴展HMM的方法則是對無后效性假設進行擴展,原來只假設某狀態只與前一狀態有關,以至於只能使用語言模型中的二元模型,現在則假設某狀態與前兩個甚至更多個狀態有關,這樣就能使用高元語言模型了。現在我們考慮只與前兩個有關,那么這是雖然使用了三元模型,但是維特比算法的計算就會出現問題,因為現在t時刻的狀態的概率不僅要考慮t-1時刻的狀態,還要考慮t-2時刻的狀態。
用來解決維特比算法在三元模型下的問題(也成為二階HMM問題)的方法是:合並前后兩個狀態將二階HMM問題轉換成一階HMM問題。
合並二階HMM
對於合並二階HMM來說,可以看下圖:
為了簡便起見,我把隱藏狀態改為兩個,下雨和晴天。由圖可以看到,當t>=2時,節點中保存着一些小節點,這些小節點的數目即為上一個狀態的狀態數目,小節點的值意義為到達該時刻狀態為Sr且前一時刻狀態為Sk時能夠產生狀態序列的最大概率。比如背景為綠色的小節點的值的意義為時刻3為下雨,時刻2為下雨時去自習->宅着->游玩的最大概率。(注意,節點表示時刻i時某個狀態,小節點表示節點中保存的前一狀態的節點,比如綠色的那個節點)。
對於時刻i(i>2),每個小節點的概率為
那么對於時刻i+1,小節點的概率為:

然后,從時刻t中尋找最大的小節點回溯即可。
樣例問題一答案
上面樣例問題中第一問的答案是:
概率P=P(下雨)*P(晴天|下雨)*…*P(陰天|晴天)*P(自習|下雨)*P(宅着|晴天)*…*P(自習|陰天)
其中,第一項P(下雨)為初始概率分布(還記得馬爾科夫的t=1時刻的概率分布么??)。
參考文獻:
一種非時齊的隱馬爾科夫模型及其在音字轉換中的應用
統計語言模型的研究與應用
統計和規則相結合的語言模型的中文輸入法中的應用
基於Markov鏈的整句輸入算法研究與實現
參考文獻及本文pdf下載地址:猛擊這里
