隱馬爾可夫模型HMM與維特比Veterbi算法(一)
主要內容:
1、一個簡單的例子
2、生成模式(Generating Patterns)
3、隱藏模式(Hidden Patterns)
4、隱馬爾可夫模型(Hidden Markov Model)
一、一個簡單的例子
考慮一個簡單的例子,有人試圖通過一片海藻推斷天氣——民間傳說告訴我們‘濕透的’海藻意味着潮濕陰雨,而‘干燥的’海藻則意味着陽光燦爛。如果它處於一個中間狀態(‘有濕氣’),我們就無法確定天氣如何。然而,天氣的狀態並沒有受限於海藻的狀態,所以我們可以在觀察的基礎上預測天氣是雨天或晴天的可能性。另一個有用的線索是前一天的天氣狀態(或者,至少是它的可能狀態)——通過綜合昨天的天氣及相應觀察到的海藻狀態,我們有可能更好的預測今天的天氣。
對於上述例子,我們想知道:
1. 給出一個星期每天的海藻觀察狀態,之后的天氣將會是什么?
2. 給定一個海藻的觀察狀態序列,預測一下此時是冬季還是夏季?直觀地,如果一段時間內海藻都是干燥的,那么這段時間很可能是夏季,反之,如果一段時間內海藻都是潮濕的,那么這段時間可能是冬季。
下面通過建立一個典型的系統模型,來一步一步揭曉答案。
二、生成模式(Generating Patterns)
1、確定性模式(Deterministic Patterns)
考慮一套交通信號燈,燈的顏色變化序列依次是紅色-紅色/黃色-綠色-黃色-紅色。這個序列可以作為一個狀態機器,交通信號燈的不同狀態都緊跟着上一個狀態。
注意每一個狀態都是唯一的依賴於前一個狀態,所以,如果交通燈為綠色,那么下一個顏色狀態將始終是黃色——也就是說,該系統是確定性的。確定性系統相對比較容易理解和分析,因為狀態間的轉移是完全已知的。
2、非確定性模式(Non-deterministic patterns)
為了使天氣那個例子更符合實際,加入第三個狀態——多雲。與交通信號燈例子不同,我們並不期望這三個天氣狀態之間的變化是確定性的,但是我們依然希望對這個系統建模以便生成一個天氣變化模式(規律)。
一種做法是假設模型的當前狀態僅僅依賴於前面的幾個狀態,這被稱為馬爾科夫假設,它極大地簡化了問題。顯然,這可能是一種粗糙的假設,並且因此可能將一些非常重要的信息丟失。
當考慮天氣問題時,馬爾科夫假設假定今天的天氣只能通過過去幾天已知的天氣情況進行預測——而對於其他因素,譬如風力、氣壓等則沒有考慮。在這個例子以及其他相似的例子中,這樣的假設顯然是不現實的。然而,由於這樣經過簡化的系統可以用來分析,我們常常接受這樣的知識假設,雖然它產生的某些信息不完全准確。
一個馬爾科夫過程是狀態間的轉移僅依賴於前n個狀態的過程。這個過程被稱之為n階馬爾可夫模型,其中n是影響下一個狀態選擇的(前)n個狀態。最簡單的馬爾可夫過程是一階模型,它的狀態選擇僅與前一個狀態有關。這里要注意它與確定性系統並不相同,因為下一個狀態的選擇由相應的概率決定,並不是確定性的。
下圖是天氣例子中狀態間所有可能的一階狀態轉移情況:
對於有M個狀態的一階馬爾可夫模型,共有M^2個狀態轉移,因為任何一個狀態都有可能是所有狀態的下一個轉移狀態。每一個狀態轉移都有一個概率值,稱為狀態轉移概率——這是從一個狀態轉移到另一個狀態的概率。所有的M^2個概率可以用一個狀態轉移矩陣表示。注意這些概率並不隨時間變化而不同——這是一個非常重要(但常常不符合實際)的假設。
下面的狀態轉移矩陣顯示的是天氣例子中可能的狀態轉移概率:
也就是說,如果昨天是晴天,那么今天是晴天的概率為0.5,是多雲的概率為0.375。注意,每一行的概率之和為1。
要初始化這樣一個系統,我們需要確定起始日天氣的(或可能的)情況,定義其為一個初始概率向量,稱為pi向量。
也就是說,第一天為晴天的概率為1。
現在我們定義一個一階馬爾可夫過程如下:
狀態:三個狀態——晴天,多雲,雨天。
pi向量:定義系統初始化時每一個狀態的概率。
狀態轉移矩陣:給定前一天天氣情況下的當前天氣概率。
任何一個可以用這種方式描述的系統都是一個馬爾可夫過程。
3、總結
我們嘗試識別時間變化中的模式,並且為了達到這個目的我們試圖對這個過程建模以便產生這樣的模式。我們使用了離散時間點、離散狀態以及做了馬爾可夫假設。在采用了這些假設之后,系統產生了這個被描述為馬爾可夫過程的模式,它包含了一個pi向量(初始概率)和一個狀態轉移矩陣。關於假設,重要的一點是狀態轉移矩陣並不隨時間的改變而改變——這個矩陣在整個系統的生命周期中是固定不變的。
三、隱藏模式(Hidden Patterns)
1、馬爾可夫過程的局限性
在某些情況下,我們希望找到的模式用馬爾可夫過程描述還顯得不充分。回顧一下天氣那個例子,一個隱士也許不能夠直接獲取到天氣的觀察情況,但是他有一些水藻。民間傳說告訴我們水藻的狀態與天氣狀態有一定的概率關系——天氣和水藻的狀態是緊密相關的。在這個例子中我們有兩組狀態,觀察的狀態(水藻的狀態)和隱藏的狀態(天氣的狀態)。我們希望為隱士設計一種算法,在不能夠直接觀察天氣的情況下,通過水藻和馬爾可夫假設來預測天氣。
一個更實際的問題是語音識別,我們聽到的聲音是來自於聲帶、喉嚨大小、舌頭位置以及其他一些東西的組合結果。所有這些因素相互作用產生一個單詞的聲音,一套語音識別系統檢測的聲音就是來自於個人發音時身體內部物理變化所引起的不斷改變的聲音。
一些語音識別裝置工作的原理是將內部的語音產出看作是隱藏的狀態,而將聲音結果作為一系列觀察的狀態,這些由語音過程生成並且最好的近似了實際(隱藏)的狀態。在這兩個例子中,需要着重指出的是,隱藏狀態的數目與觀察狀態的數目可以是不同的。一個包含三個狀態的天氣系統(晴天、多雲、雨天)中,可以觀察到4個等級的海藻濕潤情況(干、稍干、潮濕、濕潤);純粹的語音可以由80個音素描述,而身體的發音系統會產生出不同數目的聲音,或者比80多,或者比80少。
在這種情況下,觀察到的狀態序列與隱藏過程有一定的概率關系。我們使用隱馬爾可夫模型對這樣的過程建模,這個模型包含了一個底層隱藏的隨時間改變的馬爾可夫過程,以及一個與隱藏狀態某種程度相關的可觀察到的狀態集合。
2、隱馬爾可夫模型(Hidden Markov Models)
下圖顯示的是天氣例子中的隱藏狀態和觀察狀態。假設隱藏狀態(實際的天氣)由一個簡單的一階馬爾可夫過程描述,那么它們之間都相互連接。
隱藏狀態和觀察狀態之間的連接表示:在給定的馬爾可夫過程中,一個特定的隱藏狀態生成特定的觀察狀態的概率。這很清晰的表示了‘進入’一個觀察狀態的所有概率之和為1,在上面這個例子中就是Pr(Obs|Sun), Pr(Obs|Cloud) 及 Pr(Obs|Rain)之和。
除了定義了馬爾可夫過程的概率關系,我們還有另一個矩陣,定義為混淆矩陣(confusion matrix),它包含了給定一個隱藏狀態后得到的觀察狀態的概率。對於天氣例子,混淆矩陣是:
注意矩陣的每一行之和是1。
3、總結(Summary)
我們已經看到在一些過程中一個觀察序列與一個底層馬爾可夫過程是概率相關的。在這些例子中,觀察狀態的數目可以和隱藏狀態的數碼不同。
我們使用一個隱馬爾可夫模型(HMM)對這些例子建模。這個模型包含兩組狀態集合和三組概率集合:
* 隱藏狀態:一個系統的(真實)狀態,可以由一個馬爾可夫過程進行描述(例如,天氣)。
* 觀察狀態:在這個過程中‘可視’的狀態(例如,海藻的濕度)。
* pi向量:包含了(隱)模型在時間t=1時一個特殊的隱藏狀態的概率(初始概率)。
* 狀態轉移矩陣:包含了一個隱藏狀態到另一個隱藏狀態的概率
* 混淆矩陣:包含了給定隱馬爾可夫模型的某一個特殊的隱藏狀態,觀察到的某個觀察狀態的概率。
因此一個隱馬爾可夫模型是在一個標准的馬爾可夫過程中引入一組觀察狀態,以及其與隱藏狀態間的一些概率關系。
四、隱馬爾可夫模型
1、定義(Definition of a hidden Markov model)
一個隱馬爾可夫模型是一個三元組(pi, A, B)。
初始化概率向量:
![]()
狀態轉移矩陣:;
![]()
混淆矩陣:;
在狀態轉移矩陣及混淆矩陣中的每一個概率都是時間無關的——也就是說,當系統演化時這些矩陣並不隨時間改變。實際上,這是馬爾可夫模型關於真實世界最不現實的一個假設。
2、應用(Uses associated with HMMs)
一旦一個系統可以作為HMM被描述,就可以用來解決三個基本問題。其中前兩個是模式識別的問題:給定HMM求一個觀察序列的概率(評估);搜索最有可能生成一個觀察序列的隱藏狀態序列(解碼)。第三個問題是給定觀察序列生成一個HMM(學習)。
a) 評估(Evaluation)
考慮這樣的問題,我們有一些描述不同系統的隱馬爾可夫模型(也就是一些( pi,A,B)三元組的集合)及一個觀察序列。我們想知道哪一個HMM最有可能產生了這個給定的觀察序列。例如,對於海藻來說,我們也許會有一個“夏季”模型和一個“冬季”模型,因為不同季節之間的情況是不同的——我們也許想根據海藻濕度的觀察序列來確定當前的季節。
我們使用前向算法(forward algorithm)來計算給定隱馬爾可夫模型(HMM)后的一個觀察序列的概率,並因此選擇最合適的隱馬爾可夫模型(HMM)。
在語音識別中這種類型的問題發生在當一大堆數目的馬爾可夫模型被使用,並且每一個模型都對一個特殊的單詞進行建模時。一個觀察序列從一個發音單詞中形成,並且通過尋找對於此觀察序列最有可能的隱馬爾可夫模型(HMM)識別這個單詞。
b) 解碼( Decoding)
給定觀察序列搜索最可能的隱藏狀態序列。
另一個相關問題,也是最感興趣的一個,就是搜索生成輸出序列的隱藏狀態序列。在許多情況下我們對於模型中的隱藏狀態更感興趣,因為它們代表了一些更有價值的東西,而這些東西通常不能直接觀察到。
考慮海藻和天氣這個例子,一個盲人隱士只能感覺到海藻的狀態,但是他更想知道天氣的情況,天氣狀態在這里就是隱藏狀態。
我們使用Viterbi 算法(Viterbi algorithm)確定(搜索)已知觀察序列及HMM下最可能的隱藏狀態序列。
Viterbi算法(Viterbi algorithm)的另一廣泛應用是自然語言處理中的詞性標注。在詞性標注中,句子中的單詞是觀察狀態,詞性(語法類別)是隱藏狀態(注意對於許多單詞,如wind,fish擁有不止一個詞性)。對於每句話中的單詞,通過搜索其最可能的隱藏狀態,我們就可以在給定的上下文中找到每個單詞最可能的詞性標注。
c)學習(Learning)
根據觀察序列生成隱馬爾可夫模型。
第三個問題,也是與HMM相關的問題中最難的,根據一個觀察序列(來自於已知的集合),以及與其有關的一個隱藏狀態集,估計一個最合適的隱馬爾可夫模型(HMM),也就是確定對已知序列描述的最合適的(pi,A,B)三元組。
當矩陣A和B不能夠直接被(估計)測量時,前向-后向算法(forward-backward algorithm)被用來進行學習(參數估計),這也是實際應用中常見的情況。
3、總結(Summary)
由一個向量和兩個矩陣(pi,A,B)描述的隱馬爾可夫模型對於實際系統有着巨大的價值,雖然經常只是一種近似,但它們卻是經得起分析的。隱馬爾可夫模型通常解決的問題包括:
1. 對於一個觀察序列匹配最可能的系統——評估,使用前向算法(forward algorithm)解決;
2. 對於已生成的一個觀察序列,確定最可能的隱藏狀態序列——解碼,使用Viterbi 算法(Viterbi algorithm)解決;
3. 對於已生成的觀察序列,決定最可能的模型參數——學習,使用前向-后向算法(forward-backward algorithm)解決。
五、參考文獻
http://www.52nlp.cn/hmm-learn-best-practices-one-introduction
http://www.52nlp.cn/hmm-learn-best-practices-two-generating-patterns
http://www.52nlp.cn/hmm-learn-best-practices-three-hidden-patterns
http://www.52nlp.cn/hmm-learn-best-practices-four-hidden-markov-models