HMM學習最佳範例

轉載自:http://www.52nlp.cn/hmm-learn-best-practices-one-introduction

隱馬爾科夫模型(HMM)依然是讀者訪問“我愛自然語言處理”的一個熱門相關關鍵詞,我曾在《HMM學習最佳範例與崔曉源的博客》中介紹過國外的一個不錯的HMM學習教程,並且國內崔曉源師兄有一個相應的翻譯版本,不過這個版本比較簡化和粗略,有些地方只是概況性的翻譯了一下,省去了一些內容,所以從今天開始計劃在52nlp上系統的重新翻譯這個學習教程,希望對大家有點用。

一、介紹(Introduction)
  我們通常都習慣尋找一個事物在一段時間裏的變化模式(規律)。這些模式發生在很多領域,比如計算機中的指令序列,句子中的詞語順序和口語單詞中的音素序列等等,事實上任何領域中的一系列事件都有可能產生有用的模式。
  考慮一個簡單的例子,有人試圖通過一片海藻推斷天氣——民間傳說告訴我們‘溼透的’海藻意味着潮溼陰雨,而‘乾燥的’海藻則意味着陽光燦爛。如果它處於一箇中間狀態(‘有溼氣’),我們就無法確定天氣如何。然而,天氣的狀態並沒有受限於海藻的狀態,所以我們可以在觀察的基礎上預測天氣是雨天或晴天的可能性。另一個有用的線索是前一天的天氣狀態(或者,至少是它的可能狀態)——通過綜合昨天的天氣及相應觀察到的海藻狀態,我們有可能更好的預測今天的天氣。
  這是本教程中我們將考慮的一個典型的系統類型。
  首先,我們將介紹產生概率模式的系統,如晴天及雨天間的天氣波動。
  然後,我們將會看到這樣一個系統,我們希望預測的狀態並不是觀察到的——其底層系統是隱藏的。在上面的例子中,觀察到的序列將是海藻而隱藏的系統將是實際的天氣。
  最後,我們會利用已經建立的模型解決一些實際的問題。對於上述例子,我們想知道:
  1. 給出一個星期每天的海藻觀察狀態,之後的天氣將會是什麼?
  2. 給定一個海藻的觀察狀態序列,預測一下此時是冬季還是夏季?直觀地,如果一段時間內海藻都是乾燥的,那麼這段時間很可能是夏季,反之,如果一段時間內海藻都是潮溼的,那麼這段時間可能是冬季。

二、生成模式(Generating Patterns)

1、確定性模式(Deterministic Patterns)
  考慮一套交通信號燈,燈的顏色變化序列依次是紅色-紅色/黃色-綠色-黃色-紅色。這個序列可以作爲一個狀態機器,交通信號燈的不同狀態都緊跟着上一個狀態。
    hmm1
  注意每一個狀態都是唯一的依賴於前一個狀態,所以,如果交通燈爲綠色,那麼下一個顏色狀態將始終是黃色——也就是說,該系統是確定性的。確定性系統相對比較容易理解和分析,因爲狀態間的轉移是完全已知的。

2、非確定性模式(Non-deterministic patterns)
  爲了使天氣那個例子更符合實際,加入第三個狀態——多雲。與交通信號燈例子不同,我們並不期望這三個天氣狀態之間的變化是確定性的,但是我們依然希望對這個系統建模以便生成一個天氣變化模式(規律)。
  一種做法是假設模型的當前狀態僅僅依賴於前面的幾個狀態,這被稱爲馬爾科夫假設,它極大地簡化了問題。顯然,這可能是一種粗糙的假設,並且因此可能將一些非常重要的信息丟失。
  當考慮天氣問題時,馬爾科夫假設假定今天的天氣只能通過過去幾天已知的天氣情況進行預測——而對於其他因素,譬如風力、氣壓等則沒有考慮。在這個例子以及其他相似的例子中,這樣的假設顯然是不現實的。然而,由於這樣經過簡化的系統可以用來分析,我們常常接受這樣的知識假設,雖然它產生的某些信息不完全準確。
          hmm2a hmm2 hmm2c
  一個馬爾科夫過程是狀態間的轉移僅依賴於前n個狀態的過程。這個過程被稱之爲n階馬爾科夫模型,其中n是影響下一個狀態選擇的(前)n個狀態。最簡單的馬爾科夫過程是一階模型,它的狀態選擇僅與前一個狀態有關。這裏要注意它與確定性系統並不相同,因爲下一個狀態的選擇由相應的概率決定,並不是確定性的。
  下圖是天氣例子中狀態間所有可能的一階狀態轉移情況:
    hmm3
  對於有M個狀態的一階馬爾科夫模型,共有M^2個狀態轉移,因爲任何一個狀態都有可能是所有狀態的下一個轉移狀態。每一個狀態轉移都有一個概率值,稱爲狀態轉移概率——這是從一個狀態轉移到另一個狀態的概率。所有的M^2個概率可以用一個狀態轉移矩陣表示。注意這些概率並不隨時間變化而不同——這是一個非常重要(但常常不符合實際)的假設。
  下面的狀態轉移矩陣顯示的是天氣例子中可能的狀態轉移概率:
    hmm4
  -也就是說,如果昨天是晴天,那麼今天是晴天的概率爲0.5,是多雲的概率爲0.375。注意,每一行的概率之和爲1。
  要初始化這樣一個系統,我們需要確定起始日天氣的(或可能的)情況,定義其爲一個初始概率向量,稱爲pi向量。
          hmm5
  -也就是說,第一天爲晴天的概率爲1。
  現在我們定義一個一階馬爾科夫過程如下:
   狀態:三個狀態——晴天,多雲,雨天。
   pi向量:定義系統初始化時每一個狀態的概率。
   狀態轉移矩陣:給定前一天天氣情況下的當前天氣概率。
  任何一個可以用這種方式描述的系統都是一個馬爾科夫過程。

3、總結
  我們嘗試識別時間變化中的模式,並且爲了達到這個目我們試圖對這個過程建模以便產生這樣的模式。我們使用了離散時間點、離散狀態以及做了馬爾科夫假設。在採用了這些假設之後,系統產生了這個被描述爲馬爾科夫過程的模式,它包含了一個pi向量(初始概率)和一個狀態轉移矩陣。關於假設,重要的一點是狀態轉移矩陣並不隨時間的改變而改變——這個矩陣在整個系統的生命週期中是固定不變的。

三、隱藏模式(Hidden Patterns)

1、馬爾科夫過程的侷限性
  在某些情況下,我們希望找到的模式用馬爾科夫過程描述還顯得不充分。回顧一下天氣那個例子,一個隱士也許不能夠直接獲取到天氣的觀察情況,但是他有一些水藻。民間傳說告訴我們水藻的狀態與天氣狀態有一定的概率關係——天氣和水藻的狀態是緊密相關的。在這個例子中我們有兩組狀態,觀察的狀態(水藻的狀態)和隱藏的狀態(天氣的狀態)。我們希望爲隱士設計一種算法,在不能夠直接觀察天氣的情況下,通過水藻和馬爾科夫假設來預測天氣。
  一個更實際的問題是語音識別,我們聽到的聲音是來自於聲帶、喉嚨大小、舌頭位置以及其他一些東西的組合結果。所有這些因素相互作用產生一個單詞的聲音,一套語音識別系統檢測的聲音就是來自於個人發音時身體內部物理變化所引起的不斷改變的聲音。
  一些語音識別裝置工作的原理是將內部的語音產出看作是隱藏的狀態,而將聲音結果作爲一系列觀察的狀態,這些由語音過程生成並且最好的近似了實際(隱藏)的狀態。在這兩個例子中,需要着重指出的是,隱藏狀態的數目與觀察狀態的數目可以是不同的。一個包含三個狀態的天氣系統(晴天、多雲、雨天)中,可以觀察到4個等級的海藻溼潤情況(幹、稍幹、潮溼、溼潤);純粹的語音可以由80個音素描述,而身體的發音系統會產生出不同數目的聲音,或者比80多,或者比80少。
  在這種情況下,觀察到的狀態序列與隱藏過程有一定的概率關係。我們使用隱馬爾科夫模型對這樣的過程建模,這個模型包含了一個底層隱藏的隨時間改變的馬爾科夫過程,以及一個與隱藏狀態某種程度相關的可觀察到的狀態集合。

2、隱馬爾科夫模型(Hidden Markov Models)
  下圖顯示的是天氣例子中的隱藏狀態和觀察狀態。假設隱藏狀態(實際的天氣)由一個簡單的一階馬爾科夫過程描述,那麼它們之間都相互連接。
  hidden-weather-example
  隱藏狀態和觀察狀態之間的連接表示:在給定的馬爾科夫過程中,一個特定的隱藏狀態生成特定的觀察狀態的概率。這很清晰的表示了‘進入’一個觀察狀態的所有概率之和爲1,在上面這個例子中就是Pr(Obs|Sun),Pr(Obs|Cloud) 及 Pr(Obs|Rain)之和。這裏再引用一下讀者jiuren的註解:

這裏作者是把obs作爲參數來用,是說Sum_{Obs=Dry,Dryish,Damp,Soggy}(Obs|Sun) = 1;
Sum_{Obs=Dry,Dryish,Damp,Soggy}(Obs|Cloud) = 1;
Sum_{Obs=Dry,Dryish,Damp,Soggy}(Obs|Rain) = 1;

  除了定義了馬爾科夫過程的概率關係,我們還有另一個矩陣,定義爲混淆矩陣(confusion matrix),它包含了給定一個隱藏狀態後得到的觀察狀態的概率。對於天氣例子,混淆矩陣是:
  weather-b-matrix
  注意矩陣的每一行之和是1。

3、總結(Summary)
  我們已經看到在一些過程中一個觀察序列與一個底層馬爾科夫過程是概率相關的。在這些例子中,觀察狀態的數目可以和隱藏狀態的數碼不同。
  我們使用一個隱馬爾科夫模型(HMM)對這些例子建模。這個模型包含兩組狀態集合和三組概率集合:
  * 隱藏狀態:一個系統的(真實)狀態,可以由一個馬爾科夫過程進行描述(例如,天氣)。
  * 觀察狀態:在這個過程中‘可視’的狀態(例如,海藻的溼度)。
  * pi向量:包含了(隱)模型在時間t=1時一個特殊的隱藏狀態的概率(初始概率)。
  * 狀態轉移矩陣:包含了一個隱藏狀態到另一個隱藏狀態的概率
  * 混淆矩陣:包含了給定隱馬爾科夫模型的某一個特殊的隱藏狀態,觀察到的某個觀察狀態的概率。
  因此一個隱馬爾科夫模型是在一個標準的馬爾科夫過程中引入一組觀察狀態,以及其與隱藏狀態間的一些概率關係。

四、隱馬爾科夫模型(Hidden Markov Models)

1、定義(Definition of a hidden Markov model)
  一個隱馬爾科夫模型是一個三元組(pi, A, B)。
  Triple_PI:初始化概率向量;
  Triple_A:狀態轉移矩陣;Triple_A_2
  Triple_B:混淆矩陣;Triple_B_2
  在狀態轉移矩陣及混淆矩陣中的每一個概率都是時間無關的——也就是說,當系統演化時這些矩陣並不隨時間改變。實際上,這是馬爾科夫模型關於真實世界最不現實的一個假設。

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)解決。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章