HMM(隱馬爾科夫模型)與維特比算法

馬爾科夫假設:假設模型的當前狀態僅僅依賴於前面的幾個狀態,這被稱爲馬爾科夫假設算法

真實狀況當前的狀態可能會和前面的狀態沒有關係,或者有更多的可能性。bash

好比:預測天氣,馬爾科夫假設假定今天的天氣只能經過過去幾天已知的天氣狀況進行預測——而對於其餘因素,譬如風力、氣壓等則沒有考慮。學習

n階馬爾科夫模型

一個馬爾科夫過程是狀態間的轉移僅依賴於前n個狀態的過程。這個過程被稱之爲n階馬爾科夫模型,其中n是影響下一個狀態選擇的(前)n個狀態測試

最簡單的馬爾科夫過程是一階模型,它的狀態選擇僅與前一個狀態有關。spa

狀態轉移機率

從一個狀態轉移到另外一個狀態的機率.net

狀態轉移矩陣

有M個狀態的一階馬爾科夫模型,共有M^2個狀態轉移,由於任何一個狀態都有多是全部狀態的下一個轉移狀態.全部的M^2個機率能夠用一個狀態轉移矩陣表示設計

這些機率並不隨時間變化而不一樣——這是一個很是重要(但經常不符合實際)的假設。3d

也就是說,若是昨天是晴天,那麼今天是晴天的機率爲0.5,是多雲的機率爲0.375。注意,每一行的機率之和爲1。

一階馬爾科夫過程示例

要初始化這樣一個系統,咱們須要肯定起始日天氣的(或可能的)狀況,定義其爲一個初始機率向量,稱爲pi向量。指針

第一天爲晴天的機率爲1code

咱們定義一個一階馬爾科夫過程以下:   

  • 狀態:三個狀態——晴天,多雲,雨天。   
  • pi向量:定義系統初始化時每個狀態的機率。   
  • 狀態轉移矩陣:給定前一每天氣狀況下的當前天氣機率。

任何一個能夠用這種方式描述的系統都是一個馬爾科夫過程

馬爾科夫過程的侷限性

沒法直接獲取要測試的狀態的變遷,可是存在一個能夠觀察的東西,它可以反映要測試的東西的狀態變遷,這裏要測試的狀態變遷爲隱藏狀態,可以觀察的爲觀察的狀態

一個隱士也許不可以直接獲取到天氣的觀察狀況,可是他有一些水藻。民間傳說告訴咱們水藻的狀態與天氣狀態有必定的機率關係——天氣和水藻的狀態是緊密相關的。但願爲隱士設計一種算法,在不可以直接觀察天氣的狀況下,經過水藻和馬爾科夫假設來預測天氣。

觀察到的狀態序列與隱藏過程有必定的機率關係。咱們使用隱馬爾科夫模型對這樣的過程建模,這個模型包含了一個底層隱藏的隨時間改變的馬爾科夫過程,以及一個與隱藏狀態某種程度相關的可觀察到的狀態集合。

隱藏狀態和觀察狀態的關係

隱藏狀態(實際的天氣)由一個簡單的一階馬爾科夫過程描述

隱藏狀態和觀察狀態之間的鏈接表示:在給定的馬爾科夫過程當中,一個特定的隱藏狀態生成特定的觀察狀態的機率,有

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;
複製代碼

混淆矩陣

包含了給定一個隱藏狀態後獲得的觀察狀態的機率

假設是晴天,那麼海藻是 幹 稍幹 潮溼 溼潤 的機率分別爲 0.6 0.2 0.15 0.05 他們的和爲1

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

一個隱馬爾科夫模型是在一個標準的馬爾科夫過程當中引入一組觀察狀態,以及其與隱藏狀態間的一些機率關係。

這個模型包含兩組狀態集合和三組機率集合:  

  • 隱藏狀態:一個系統的(真實)狀態,能夠由一個馬爾科夫過程進行描述(例如,天氣)。  
  • 觀察狀態:在這個過程當中‘可視’的狀態(例如,海藻的溼度)。  
  • pi向量:包含了(隱)模型在時間t=1時一個特殊的隱藏狀態的機率(初始機率) 
  • 狀態轉移矩陣:包含了一個隱藏狀態到另外一個隱藏狀態的機率  
  • 混淆矩陣:包含了給定隱馬爾科夫模型的某一個特殊的隱藏狀態,觀察到的某個觀察狀態的機率。

觀察狀態的數目能夠和隱藏狀態的數碼不一樣。

HMM定義

一個隱馬爾科夫模型是一個三元組(pi, A, B)

  • \Pi=(\pi_{i}):初始化機率矩陣
  • A=(a_{ij}):狀態轉移矩陣,Pr(x_{i_t}|x_{j_{t-1}})
  • B=(b_{ij}):混淆矩陣,Pr(y_i|x_j)

在狀態轉移矩陣及混淆矩陣中的每個機率都是時間無關的——也就是說,當系統演化時這些矩陣並不隨時間改變

這是馬爾科夫模型關於真實世界最不現實的一個假設。

應用

  1. 模式識別:

    • 給定HMM求一個觀察序列的機率(評估)

    • 搜索最有可能生成一個觀察序列的隱藏狀態序列(解碼)

  2. 給定觀察序列生成一個HMM(學習)

評估

有一些描述不一樣系統的隱馬爾科夫模型(也就是一些( pi,A,B)三元組的集合)及一個觀察序列。咱們想知道哪個HMM最有可能產生了這個給定的觀察序列。

對於海藻來講,咱們也許會有一個「夏季」模型和一個「冬季」模型,由於不一樣季節之間的狀況是不一樣的——咱們也許想根據海藻溼度的觀察序列來肯定當前的季節。

使用前向算法(forward algorithm)來計算給定隱馬爾科夫模型(HMM)後的一個觀察序列的機率,並所以選擇最合適的隱馬爾科夫模型(HMM)。

解碼

在許多狀況下咱們對於模型中的隱藏狀態更感興趣,由於它們表明了一些更有價值的東西,而這些東西一般不能直接觀察到。

一個盲人隱士只能感受到海藻的狀態,可是他更想知道天氣的狀況,天氣狀態在這裏就是隱藏狀態。

使用Viterbi 算法(Viterbi algorithm)肯定(搜索)已知觀察序列及HMM下最可能的隱藏狀態序列。

學習

根據一個觀察序列(來自於已知的集合),以及與其有關的一個隱藏狀態集,估計一個最合適的隱馬爾科夫模型(HMM),也就是肯定對已知序列描述的最合適的(pi,A,B)三元組。

當矩陣A和B不可以直接被(估計)測量時,前向-後向算法(forward-backward algorithm)被用來進行學習(參數估計)

前向算法

  1. 窮舉搜索

    咱們有一個用來描述天氣及與它密切相關的海藻溼度狀態的隱馬爾科夫模型(HMM),另外咱們還有一個海藻的溼度狀態觀察序列。假設連續3天海藻溼度的觀察結果是(乾燥、溼潤、溼透)——而這三天每一天均可能是晴天、多雲或下雨。

    每一列都顯示了可能的的天氣狀態,而且每一列中的每一個狀態都與相鄰列中的每個狀態相連。而其狀態間的轉移都由狀態轉移矩陣提供一個機率。

    在每一列下面都是某個時間點上的觀察狀態,給定任一個隱藏狀態所獲得的觀察狀態的機率由混淆矩陣提供。

    如今要計算當前HMM可以獲得觀察序列是 dry,damp,soggy 的機率。

    找到每個可能的隱藏狀態,而且將這些隱藏狀態下的觀察序列機率相加,也就是窮舉全部的隱藏機率發生的狀況下,是現有觀察狀態的機率

    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)
    複製代碼

    用到的是當前的HMM

    缺點:計算觀察序列機率極爲昂貴,特別對於大的模型或較長的序列

    應用:利用機率的時間不變性來減小問題的複雜度。

  2. 遞歸下降問題複雜度【動態規劃思想】
    計算過程當中將計算到達網格中某個中間狀態的機率做爲全部到達這個狀態的可能路徑的機率求和問題。

    一樣對於窮舉的計算方法,能夠拆分紅多個從當前狀態轉移到下一個局部狀態,再把全部的局部狀態求和就獲得定隱馬爾科夫模型(HMM)後的觀察序列機率。機率爲

    αt ( j )= Pr( 觀察狀態 | 隱藏狀態j ) x Pr(t時刻全部指向j狀態的路徑)
    複製代碼

    j 表示局部狀態;αt ( j )表示處於這個狀態的機率;t表示時間;Pr( 觀察狀態 | 隱藏狀態j )即混淆矩陣;Pr(t時刻全部指向j狀態的路徑)即狀態轉移矩陣

    • 當t=1時,沒有任何指向當前狀態的路徑。故t=1時位於當前狀態的機率是初始機率,所以,t=1時的局部機率等於當前狀態的初始機率乘以相關的觀察機率 \alpha_1(j)=\pi(j)b_{jk_1}

    • 計算t>1的局部機率 α

      要計算t=2時,局部狀態爲b的機率,必需要計算全部 t=1時刻,從a,b,c到t=2時狀態爲b的機率,而要獲得t=1時刻的全部機率,已經在前一步從t=0運轉到t=1的時候計算過了。

      也就是說 t=2時,觀察序列前提下,局部隱藏狀態爲b的機率爲t=1狀態全部的機率和再乘以混淆矩陣轉移到當前觀察變量的機率。即

      \alpha_{t+1}(j)=b_{jk_{t+1}}\sum_{i=1}^{n}\alpha_t(i)a_{ij}

維特比算法(Viterbi Algorithm)

 對於一個特殊的隱馬爾科夫模型(HMM)及一個相應的觀察序列,咱們經常但願能找到生成此序列最可能的隱藏狀態序列

  1. 窮舉搜索

    對於網格中所顯示的觀察序列,最可能的隱藏狀態序列是下面這些機率中最大機率所對應的那個隱藏狀態序列:

    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)
    複製代碼

    可是太昂貴了

  2. 遞歸下降複雜度

    定義局部機率,它是到達網格中的某個特殊的中間狀態時的機率  

    對於網格中的每個中間及終止狀態,都有一個到達該狀態的最可能路徑。稱這些路徑局部最佳路徑(partial best paths)。其中每一個局部最佳路徑都有一個相關聯的機率,即局部機率或

    與前向算法中的局部機率不一樣,是到達該狀態(最可能)的一條路徑的機率。

    於是(i,t)是t時刻到達狀態i的全部序列機率中最大的機率, 特別地,在t=T時每個狀態都有一個局部機率和一個局部最佳路徑。這樣咱們就能夠經過選擇此時刻包含最大局部機率的狀態及其相應的局部最佳路徑來肯定全局最佳路徑(最佳隱藏狀態序列)。

    • 當t=1的時候,到達某狀態的最可能路徑明顯是不存在的;可是,咱們使用t=1時的所處狀態的初始機率及相應的觀察狀態k1的觀察機率計算局部機率\delta_1(i)=\pi(i)b_{ik_1}
    • 考慮計算t時刻到達狀態X的最可能的路徑;這條到達狀態X的路徑將經過t-1時刻的狀態A,B或C中的某一個。所以,最可能的到達狀態X的路徑將是下面這些路徑的某一個
    (狀態序列),...,A,X
    (狀態序列),...,B,X
    (狀態序列),...,C,X
    複製代碼

    路徑末端是AX的最可能的路徑將是到達A的最可能路徑再緊跟X。這條路徑的機率將是:    Pr (到達狀態A最可能的路徑) .Pr (X | A) . Pr (觀察狀態 | X)

    馬爾科夫假設:給定一個狀態序列,一個狀態發生的機率只依賴於前n個狀態。特別地,在一階馬爾可夫假設下,狀態X在一個狀態序列後發生的機率只取決於以前的一個狀態

    所以,到達狀態X的最可能路徑機率是

    \delta_t(i)=max_j(\delta_(t-1)a_{ji}b_{ik_t})

     這裏,咱們假設前一個狀態的知識(局部機率)是已知的,同時利用了狀態轉移機率和相應的觀察機率之積。而後,咱們就能夠在其中選擇最大的機率了(局部機率\delta)  

反向指針

目標是在給定一個觀察序列的狀況下尋找網格中最可能的隱藏狀態序列——所以,咱們須要一些方法來記住網格中的局部最佳路徑。

計算t時刻的's咱們僅僅須要知道t-1時刻的's。在這個局部機率計算以後,就有可能記錄前一時刻哪一個狀態生成了(i,t)——也就是說,在t-1時刻系統必須處於某個狀態,該狀態致使了系統在t時刻到達狀態i是最優的。這種記錄(記憶)是經過對每個狀態賦予一個反向指針完成的,這個指針指向最優的引起當前狀態的前一時刻的某個狀態。

其中argmax運算符是用來計算使括號中表達式的值最大的索引j的。

維特比算法的優勢

  1. 經過使用遞歸減小計算複雜度——這一點和前向算法使用遞歸減小計算複雜度是徹底相似的。
  2. 維特比算法有一個很是有用的性質,就是對於觀察序列的整個上下文進行了最好的解釋(考慮)。

nlp 教程

相關文章
相關標籤/搜索