隐马尔可夫(HMM)
一、概述
計算機科學(xué)中所談的“模式”通常指按照一定順序發(fā)生的事件序列,比如機器翻譯和自然語言處理中的文字(詞)序列,程序設(shè)計中的指令序列,模式則體現(xiàn)了序列中事件的相關(guān)性。
舉一個簡單的例子,傳說可以通過觀察海草來預(yù)測天氣,比如濕潤(soggy)的海草意味著雨天(rainy),干燥(dry)的海草則意味著晴天(sunny)。可以再加入一個中間的狀態(tài)“潮濕(dump)”,同時引入陰天(cloudy)。當(dāng)然,這種關(guān)系并不是永遠成立,因此他們之間存在著一個概率分布。
而預(yù)測天氣的另外一個線索是:先前的天氣,這很容易理解。那么,現(xiàn)在開始,我們將用這些已知條件來預(yù)測天氣。
首先,我們會引入一個通過上述的關(guān)系預(yù)測出天氣轉(zhuǎn)換模型。然后,我們將引入“隱”系統(tǒng)的概念,隱系統(tǒng)相對于觀察到的結(jié)果,在這個例子中,海草的干濕是觀察結(jié)果,而實際的天氣就是一個隱系統(tǒng),因為我們看不到它。最后,我們會利用建立起來的整個系統(tǒng)模型去解決一些問題,比如通過海草來預(yù)測一周的天氣,甚至來判斷當(dāng)時的季節(jié)(直覺上,夏天海草會干,而冬天會濕)。
二、轉(zhuǎn)換模型(Generateing Pattern,轉(zhuǎn)移網(wǎng)絡(luò))
1)決定性的(Deterministic)
決定性的轉(zhuǎn)換模型,例如交通燈,紅-紅/黃-綠-黃(amber),狀態(tài)之間的轉(zhuǎn)換在滿足條件的狀態(tài)下只有一種可能性,顯然這不能應(yīng)用在天氣的預(yù)測上。
2)非決定性的(Non-Deterministic)
在馬爾可夫假設(shè)(Markov Assumption)中,當(dāng)前狀態(tài)只與前面的若干個狀態(tài)有關(guān),這使得模型可以大大簡化。雖然這會導(dǎo)致預(yù)測的錯誤(顯然,在天氣的預(yù)測中,只考慮到前幾天是晴天還是雨天并不明智,還應(yīng)當(dāng)考慮氣流,氣壓,風(fēng)速等等),但這種錯誤通常是可以接受的。
若馬爾可夫模型中,當(dāng)前狀態(tài)只與前n個狀態(tài)有關(guān),則稱之為n序模型(order n)。在本例中,假設(shè)當(dāng)前天氣只與頭天天氣有關(guān)(n=1),那么三種天氣狀態(tài)(M=3)間存在3^2=9種轉(zhuǎn)換。(表項的列和為1,是為了對應(yīng)后面的條件概率計算)
?
| Weather-> | Sun | Cloud | Rain |
| Sun | 0.5 | 0.25 | 0.25 |
| Cloud | 0.375 | 0.125 | 0.375 |
| Rain | 0.125 | 0.625 | 0.375 |
?
于是,我們有了一個簡單的一階馬爾可夫過程(first order Markov Process),它包括:
1)初始化向量(Π向量),代表系統(tǒng)的初始狀態(tài)
| Sun | Cloud | Rain |
| 1.0 | 0.0 | 0.0 |
2)狀態(tài)集:Sunny,Cloudy,Rainy
3)狀態(tài)轉(zhuǎn)移矩陣(表1)
三、隱模型(Hidden Patten)
通常,馬爾可夫過程是不夠的,因為它并沒有利用其他條件(如海草的干濕)。如果同時考慮海草的干濕,我們可以得到兩個狀態(tài)集,即觀察結(jié)果集(海草)和“隱”狀態(tài)集(天氣)。之后我們將利用這兩個狀態(tài)集,通過算法預(yù)測未來的天氣。
一個更實際的例子是語音識別,實際的語音序列是一系列隱狀態(tài)的組合,而系統(tǒng)識別出的語音序列則是觀察結(jié)果狀態(tài)。同時,觀察結(jié)果狀態(tài)的個數(shù)和隱狀態(tài)的個數(shù)不一定總相同,正如我們可以再給海草一個dryish狀態(tài),而實際的80個語素對應(yīng)的發(fā)音也很可能不止80個。
這種對應(yīng)關(guān)系也是有一定概率的,為此,我們使用隱馬爾可夫模型來描述。
從上圖中可以看出,觀察狀態(tài)的變化之下隱藏著實際狀態(tài)的更改,而其中的概率關(guān)系可以用Pr(Obv|Weather)表示,其觀察狀態(tài)矩陣(confusion matrix)為:(我認為這個矩陣的值有問題,應(yīng)當(dāng)是列和為1,這樣更符合后面以觀察結(jié)果為依據(jù)計算天氣)
| ? | Dry | Dryish | Damp | Soggy |
| Sun | 0.60 | 0.20 | 0.15 | 0.05 |
| Cloud | 0.25 | 0.25 | 0.25 | 0.25 |
| Rain | 0.05 | 0.10 | 0.35 | 0.50 |
可見,一個隱馬爾可夫模型由5部分組成:
?1)隱藏狀態(tài);2)觀察狀態(tài);3)Π向量;4)狀態(tài)轉(zhuǎn)移矩陣;5)狀態(tài)矩陣。
四、隱馬爾可夫模型(Hidden Markov Models)
隱馬爾可夫模型可以由一個三元組(Π,A,B)描述:
1)Π = (πi)是初始化向量;
2)A = (aij)是狀態(tài)轉(zhuǎn)移矩陣,元素為Pr(xj(t))|xi(t-1)),相當(dāng)于頭天天氣xi,今天天氣是xj的概率;(這是一個條件概率,列和為1,因此以列(今天)為前置條件)
3)B = (bij)是觀察狀態(tài)矩陣,元素為Pr(yj|xi),相當(dāng)于海草狀態(tài)為yj時,天氣是xi時概率。
它主要有三個方面的用途:
1)評價(Evaluation),從多個隱馬爾可夫模型中選出一個最符合當(dāng)前觀察結(jié)果的。比如海草與天氣的模型,在冬天和夏天應(yīng)當(dāng)是不同的。那么給出一個海草干濕狀態(tài)變化的序列,就可以評估出哪個模型更合適,同時也就可以推斷出這個序列出現(xiàn)在冬天還是夏天。
我們使用前向算法(Forward Algo)去計算一個序列在不同模型中的概率,從而取得最大可能的模型。語音識別中,同樣使用這種方法去計算一個發(fā)音在不同模型(每個模型針對不同的詞)中的概率,從而取得最大可能的詞。
2)解碼(Decoding),給定一個隱馬爾可夫模型和觀察結(jié)果序列,計算出可能性最大的隱狀態(tài)序列,也可以認為是預(yù)測。
我們使用維特比算法(Viterbi Algo)進行解碼計算,一個很大的用途就是自然語言處理中的詞性標(biāo)注。這里,句子中的詞是觀察結(jié)果,而詞性則是隱狀態(tài)(因為一個詞可能對應(yīng)多個詞性)。通過對整個句子(觀察結(jié)果序列)語法(隱狀態(tài)序列)的識別,就可以確定詞性。
3)學(xué)習(xí)(Learning),根據(jù)一系列的觀察結(jié)果構(gòu)建隱馬爾可夫模型。
這也是最難的一種應(yīng)用,我們使用前向-后向算法(Forward-Backward Algo)來進行計算。?
?
五、前向算法(Forward Algo)
評價(Evaluation)的基本方法就是計算隱馬爾可夫模型產(chǎn)生一個序列的概率(能力)。概率越大,這個序列就越可能是該隱馬爾可夫模型生成的。
比如我們給定一個海草變化的序列:dry,dump,soggy。在隱模型(狀態(tài)轉(zhuǎn)換模型)中,可能存在27(3^3)個對應(yīng)的天氣變化序列,分別是sun,sun,sun;sun,cloud,sun;...;rain,rain,rain。
也就是說, Pr(dry,damp,soggy | HMM) = Pr(dry,damp,soggy | sunny,sunny,sunny) + Pr(dry,damp,soggy | sunny,sunny ,cloudy) + Pr(dry,damp,soggy | sunny,sunny ,rainy) + . . . . Pr(dry,damp,soggy | rainy,rainy ,rainy)。
但是這個計算太復(fù)雜了,當(dāng)序列長度增加時,運算復(fù)雜度呈指數(shù)增長。于是,我們要想辦法降低復(fù)雜度,可以考慮動態(tài)規(guī)劃的方法:
對于序列中的第 i 項,對應(yīng) 3 種狀態(tài)(sun,cloud,rain)。
分別求出到達每種狀態(tài)的概率,于是
pr(dry, damp, soggy | HMM) = Pr(x, y, sun) + Pr(x, y, cloud) + Pr(x, y, rain),Pr(x, y, sun)
???????????????????????????????????????? = Pr(x, sun, sun) + Pr(x, cloud, sun) + Pr(x, rain, sun)
?????????????????????????????????????????= Pr(x, sun) * Pr(sun, sun) + Pr(x, cloud) * Pr(cloud, sun) + Pr(x, rain) * Pr(rain, sun)。???? 注意,Pr(x, sun)在計算Pr(x, y, sun),Pr(x, y, cloud)和Pr(x, y, rain)中都會用到,這樣就通過填表的方式降低了運算復(fù)雜度,計算量約為 k*n^2 ,k 為序列長度,n 為狀態(tài)個數(shù)。
對于每個時間 t 下的每個狀態(tài) j ,公式為:x( t )( j )= Pr( observation | hidden state is j ) x Pr(all paths to state j at time t)。需要說明的時,t = 1 時,Pr 為初始化向量對應(yīng)的值。也可以描述為:x(t+1)(j) = b(j)(k(t+1)) * (Σx(t)(i)*a(i)(j)),k 為觀察狀態(tài)序列,t 為序列中的位置,i 從 1 到 n。
而總的概率為:Pr = Σx(T)(j),j 從 1 到 n 。
原文給出了Π = <0.63, 0.17, 0.20>時的模擬計算(一個Java Applet),A和B矩陣則都已經(jīng)在前文中給出。ttp://www.comp.leeds.ac.uk/roger/HiddenMarkovModels/html_dev/forward_algorithm/s3_pg1.html
?
?六、維特比算法(Viterbi Algo)
解碼(Decoding)是指:給定一個隱馬爾可夫模型(HMM)和觀察序列,求得可能性最大(見下文說明)的狀態(tài)序列。其經(jīng)典算法是維特比算法。
同樣,對于這樣一個海草變化的序列:dry,dump,soggy。在隱模型(狀態(tài)轉(zhuǎn)換模型)中,可能存在27(3^3)個對應(yīng)的天氣變化序列,分別是sun,sun,sun;sun,cloud,sun;...;rain,rain,rain。
也就是求出Max( Pr(dry,damp,soggy | sunny,sunny,sunny), Pr(dry,damp,soggy | sunny,sunny,cloudy), Pr(dry,damp,soggy | sunny,sunny,rainy), . . . . , Pr(dry,damp,soggy | rainy,rainy,rainy)),這同樣是一個很復(fù)雜的計算過程。
維特比算法的思想在于動態(tài)規(guī)劃和剪枝:對于每個時間 t 下的狀態(tài) i ,只保留概率最大的一枝:Pr(i at time t) = Max(Pr(j at time(t-1)) * Pr(i|j) * Pr(obv. at time t|i),同時,記錄這個最大值對應(yīng)的 x(i) = j (填表),再通過 n 個這樣的最大值計算 t+1 時的最大值。當(dāng) t = 1 時,Pr(i) = Max(Pr(obv. | i) * Π(i))。其復(fù)雜度和前向算法相同,都是 k*n^2。
說明,維特比算法是填一個 n*k 大小的表,每個表項由兩部分組成,第一部分為 t 時刻到達 i 狀態(tài)的概率 Pr ,另一部分為產(chǎn)生該概率的前序狀態(tài) j 。
這樣,從Max(Pr(i at time T))求得產(chǎn)生該觀察序列的最大可能的狀態(tài)序列的最后一個狀態(tài) i(T) ,再從這個狀態(tài) i(T) 開始,在表中向前回溯,i(t-1) = x(i(t)),即可求得完整的序列。
維特比算法的優(yōu)勢在于不僅僅考察前后兩個觀察狀態(tài)的關(guān)系,而是全面考察整個觀察序列,得出一個“最大似然”的結(jié)果。這在語音識別,通信領(lǐng)域有著巨大的意義——即使序列中有一兩個誤碼,還是能夠根據(jù)整個序列給出正確的解碼。
原文給出的模擬計算有問題,因此不再給出鏈接。
前向算法和維特比算法都是基于隱馬爾可夫模型的應(yīng)用,前提是隱馬爾可夫模型已知。但是,在很多情況下,模型是未知的,這就是學(xué)習(xí)(Learning)問題。前項后向算法通過分析由觀察狀態(tài)集中的狀態(tài)組成的一系列的觀察序列和隱狀態(tài)集,給出隱馬爾可夫模型。
比如語音識別中,通常需要針對某個人的聲音進行訓(xùn)練,才能更好地識別出這個人說的話。
但是,到目前為止,學(xué)習(xí)問題還沒有解析解法。傳統(tǒng)的方法是先給出一組初始化參數(shù)(也許完全是錯誤的),然后使用觀察序列進行訓(xùn)練——修正其中的錯誤,或使錯誤最小化。
在前向-后向算法中,同樣要先給出一組初始化參數(shù),其基本原理是同時計算達到某個狀態(tài)的概率(前向)和由這個狀態(tài)到終止?fàn)顟B(tài)的概率(后向),并以此為依據(jù)對參數(shù)進行調(diào)整。
八、總結(jié)(Summary)
通常,模式不會孤立的存在,它往往以時間或空間為順序,和它前面或后面的模式相關(guān)。因此,可以利用模式間的關(guān)系進行模式識別。
我們假設(shè)模式間的關(guān)系不隨時間/空間的變化而變化,并假設(shè)第 n 個模式只與它前面的 k 個模式有關(guān)(最簡單的是 k=1 ),這就構(gòu)成了 k 階馬爾可夫過程。
又,模式并不一定存在于表面,它很有可能存在于某種現(xiàn)象之下,但現(xiàn)象和模式間存在某種聯(lián)系,這就構(gòu)成了隱馬爾可夫模型。
隱馬爾可夫模型主要解決三方面的問題:
1)給定觀察序列和模型,求該模型生成該觀察序列的概率:評估(Evaluation);
2)給定觀察序列和模型,求該模型下最可能生成該觀察序列的狀態(tài)序列:解碼(Decoding);
3)給定觀察狀態(tài)集和隱狀態(tài)集,以及若干觀察序列,求模型:學(xué)習(xí)(Learning)。
總結(jié)
以上是生活随笔為你收集整理的隐马尔可夫(HMM)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mahout 算法集
- 下一篇: 隐马尔可夫HMM中viterbi算法