1. 程式人生 > >維特比演算法——尋找最可能的隱藏狀態序列

維特比演算法——尋找最可能的隱藏狀態序列

原文標題為:維特比演算法:本質上是一個動態規劃演算法

尋找最可能的隱藏狀態序列(Finding most probable sequence of hidden states)


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

1.窮舉搜尋
  我們使用下面這張網格圖片來形象化的說明隱藏狀態和觀察狀態之間的關係:

  我們可以通過列出所有可能的隱藏狀態序列並且計算對於每個組合相應的觀察序列的概率來找到最可能的隱藏狀態序列。最可能的隱藏狀態序列是使下面這個概率最大的組合:
      Pr(觀察序列|隱藏狀態的組合)
  例如,對於網格中所顯示的觀察序列,最可能的隱藏狀態序列是下面這些概率中最大概率所對應的那個隱藏狀態序列:
  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.使用遞迴降低複雜度
  給定一個觀察序列和一個隱馬爾科夫模型(HMM),我們將考慮遞迴地尋找最有可能的隱藏狀態序列。我們首先定義區域性概率,它是到達網格中的某個特殊的中間狀態時的概率。然後,我們將介紹如何在t=1和t=n(>1)時計算這些區域性概率。
  這些區域性概率與前向演算法中所計算的區域性概率是不同的,因為它們表示的是時刻t時到達某個狀態最可能的路徑的概率,而不是所有路徑概率的總和。
 2a.區域性概率's和區域性最佳途徑
  考慮下面這個網格,它顯示的是天氣狀態及對於觀察序列乾燥,溼潤及溼透的一階狀態轉移情況:
   
  對於網格中的每一箇中間及終止狀態,都有一個到達該狀態的最可能路徑。舉例來說,在t=3時刻的3個狀態中的每一個都有一個到達此狀態的最可能路徑,或許是這樣的:
  


  我們稱這些路徑區域性最佳路徑(partial best paths)。其中每個區域性最佳路徑都有一個相關聯的概率,即區域性概率或。與前向演算法中的區域性概率不同,是到達該狀態(最可能)的一條路徑的概率。
  因而(i,t)是t時刻到達狀態i的所有序列概率中最大的概率,而區域性最佳路徑是得到此最大概率的隱藏狀態序列。對於每一個可能的i和t值來說,這一類概率(及區域性路徑)均存在。
  特別地,在t=T時每一個狀態都有一個區域性概率和一個區域性最佳路徑。這樣我們就可以通過選擇此時刻包含最大區域性概率的狀態及其相應的區域性最佳路徑來確定全域性最佳路徑(最佳隱藏狀態序列)。

2b.計算t=1時刻的區域性概率

's
  我們計算的區域性概率是作為最可能到達我們當前位置的路徑的概率(已知的特殊知識如觀察概率及前一個狀態的概率)。當t=1的時候,到達某狀態的最可能路徑明顯是不存在的;但是,我們使用t=1時的所處狀態的初始概率及相應的觀察狀態k1的觀察概率計算區域性概率;即
          
  ——與前向演算法類似,這個結果是通過初始概率和相應的觀察概率相乘得出的。

2c.計算t>1時刻的區域性概率's
  現在我們來展示如何利用t-1時刻的區域性概率計算t時刻的區域性概率
  考慮如下的網格:
    
  我們考慮計算t時刻到達狀態X的最可能的路徑;這條到達狀態X的路徑將通過t-1時刻的狀態A,B或C中的某一個。
  因此,最可能的到達狀態X的路徑將是下面這些路徑的某一個
       (狀態序列),...,A,X
       (狀態序列),...,B,X
或      (狀態序列),...,C,X
  我們想找到路徑末端是AX,BX或CX並且擁有最大概率的路徑。
  回顧一下馬爾科夫假設:給定一個狀態序列,一個狀態發生的概率只依賴於前n個狀態。特別地,在一階馬爾可夫假設下,狀態X在一個狀態序列後發生的概率只取決於之前的一個狀態,即
   Pr (到達狀態A最可能的路徑) .Pr (X | A) . Pr (觀察狀態 | X)
  與此相同,路徑末端是AX的最可能的路徑將是到達A的最可能路徑再緊跟X。相似地,這條路徑的概率將是:
   Pr (到達狀態A最可能的路徑) .Pr (X | A) . Pr (觀察狀態 | X)
  因此,到達狀態X的最可能路徑概率是:
  
  其中第一項是t-1時刻的區域性概率,第二項是狀態轉移概率以及第三項是觀察概率。
  泛化上述公式,就是在t時刻,觀察狀態是kt,到達隱藏狀態i的最佳區域性路徑的概率是:
     
  這裡,我們假設前一個狀態的知識(區域性概率)是已知的,同時利用了狀態轉移概率和相應的觀察概率之積。然後,我們就可以在其中選擇最大的概率了(區域性概率)。

2d.反向指標,'s
  考慮下面這個網格
   
  在每一箇中間及終止狀態我們都知道了區域性概率,(i,t)。然而我們的目標是在給定一個觀察序列的情況下尋找網格中最可能的隱藏狀態序列——因此,我們需要一些方法來記住網格中的區域性最佳路徑。
  回顧一下我們是如何計算區域性概率的,計算t時刻的's我們僅僅需要知道t-1時刻的's。在這個區域性概率計算之後,就有可能記錄前一時刻哪個狀態生成了(i,t)——也就是說,在t-1時刻系統必須處於某個狀態,該狀態導致了系統在t時刻到達狀態i是最優的。這種記錄(記憶)是通過對每一個狀態賦予一個反向指標完成的,這個指標指向最優的引發當前狀態的前一時刻的某個狀態。
  形式上,我們可以寫成如下的公式
    
  其中argmax運算子是用來計算使括號中表達式的值最大的索引j的。
  請注意這個表示式是通過前一個時間步驟的區域性概率's和轉移概率計算的,並不包括觀察概率(與計算區域性概率's本身不同)。這是因為我們希望這些's能回答這個問題“如果我在這裡,最可能通過哪條路徑到達下一個狀態?”——這個問題與隱藏狀態有關,因此與觀察概率有關的混淆(矩陣)因子是可以被忽略的。

2e.維特比演算法的優點
  使用Viterbi演算法對觀察序列進行解碼有兩個重要的優點:
  1. 通過使用遞迴減少計算複雜度——這一點和前向演算法使用遞迴減少計算複雜度是完全類似的。
  2.維特比演算法有一個非常有用的性質,就是對於觀察序列的整個上下文進行了最好的解釋(考慮)。事實上,尋找最可能的隱藏狀態序列不止這一種方法,其他替代方法也可以,譬如,可以這樣確定如下的隱藏狀態序列:
    
其中
    
  這裡,採用了“自左向右”的決策方式進行一種近似的判斷,其對於每個隱藏狀態的判斷是建立在前一個步驟的判斷的基礎之上(而第一步從隱藏狀態的初始向量開始)。
  這種做法,如果在整個觀察序列的中部發生“噪音干擾”時,其最終的結果將與正確的答案嚴重偏離。
  相反, 維特比演算法在確定最可能的終止狀態前將考慮整個觀察序列,然後通過指標“回溯”以確定某個隱藏狀態是否是最可能的隱藏狀態序列中的一員。這是非常有用的,因為這樣就可以孤立序列中的“噪音”,而這些“噪音”在實時資料中是很常見的。

3.小結
  維特比演算法提供了一種有效的計算方法來分析隱馬爾科夫模型的觀察序列,並捕獲最可能的隱藏狀態序列。它利用遞迴減少計算量,並使用整個序列的上下文來做判斷,從而對包含“噪音”的序列也能進行良好的分析。
  在使用時,維特比演算法對於網格中的每一個單元(cell)都計算一個區域性概率,同時包括一個反向指標用來指示最可能的到達該單元的路徑。當完成整個計算過程後,首先在終止時刻找到最可能的狀態,然後通過反向指標回溯到t=1時刻,這樣回溯路徑上的狀態序列就是最可能的隱藏狀態序列了。

1、維特比演算法的形式化定義
  維特比演算法可以形式化的概括為:
  對於每一個i,i = 1,... ,n,令:
     
  ——這一步是通過隱藏狀態的初始概率和相應的觀察概率之積計算了t=1時刻的區域性概率。
  對於t=2,...,T和i=1,...,n,令:
     
  ——這樣就確定了到達下一個狀態的最可能路徑,並對如何到達下一個狀態做了記錄。具體來說首先通過考察所有的轉移概率與上一步獲得的最大的區域性概率之積,然後記錄下其中最大的一個,同時也包含了上一步觸發此概率的狀態。
  令:
     
  ——這樣就確定了系統完成時(t=T)最可能的隱藏狀態。
  對於t=T-1,...,1
  令:
     
  ——這樣就可以按最可能的狀態路徑在整個網格回溯。回溯完成時,對於觀察序列來說,序列i1 ... iT就是生成此觀察序列的最可能的隱藏狀態序列。

  2.計算單獨的's和's
  維特比演算法中的區域性概率's的計算與前向演算法中的區域性概率's的很相似。下面這幅圖表顯示了's和's的計算細節,可以對比一下前向演算法3中的計算區域性概率's的那幅圖表:
  
(注:本圖及前向演算法3中的相似圖存在問題,具體請見前向演算法3文後評論,非常感謝讀者YaseenTA的指正)
  唯一不同的是前向演算法中計算區域性概率's時的求和符號()在維特比演算法中計算區域性概率's時被替換為max——這一個重要的不同也說明了在維特比演算法中我們選擇的是到達當前狀態的最可能路徑,而不是總的概率。我們在維特比演算法中維護了一個“反向指標”記錄了到達當前狀態的最佳路徑,即在計算's時通過argmax運算子獲得。

總結(Summary)

  對於一個特定的隱馬爾科夫模型,維特比演算法被用來尋找生成一個觀察序列的最可能的隱藏狀態序列。我們利用概率的時間不變性,通過避免計算網格中每一條路徑的概率來降低問題的複雜度。維特比演算法對於每一個狀態(t>1)都儲存了一個反向指標(),並在每一個狀態中儲存了一個區域性概率()。
  區域性概率是由反向指標指示的路徑到達某個狀態的概率。
  當t=T時,維特比演算法所到達的這些終止狀態的區域性概率's是按照最優(最可能)的路徑到達該狀態的概率。因此,選擇其中最大的一個,並回溯找出所隱藏的狀態路徑,就是這個問題的最好答案。
  關於維特比演算法,需要著重強調的一點是它不是簡單的對於某個給定的時間點選擇最可能的隱藏狀態,而是基於全域性序列做決策——因此,如果在觀察序列中有一個“非尋常”的事件發生,對於維特比演算法的結果也影響不大。
  這在語音處理中是特別有價值的,譬如當某個單詞發音的一箇中間音素出現失真或丟失的情況時,該單詞也可以被識別出來。