RNN的開端!最詳細推導HMM模型+例子:Viterbi動態規劃

感謝csdn給的小火箭 🚀
本文是HMM系列的第一篇文章 😉

如果您好奇如何在文章中加入emoji, 可以看我的這篇文章 Markdown和Python中自由添加emoji

那我們開始吧

HMM模型介紹

本文將幫您深入淺出的徹底理解HMM模型架構和維特比算法,全文閱讀大約需要10分鐘,如果您希望親自手推公式,則總耗時約20分鐘。

本文爲貪心學院課程的學習筆記,講師爲李文哲博士。
閱讀本文需要概率論中的概率相關與不相關的基礎知識。✈️

模型解釋

在這裏插入圖片描述
像圖片,人臉特徵之類的非時序數據是長度確定的,但時序數據的長度是不確定的,所以需要一個能動態接受數據的模型,因此提出了HMM和CRF,都是傳統意義上的機器學習模型,後來深度學習領域在此基礎上提出了RNN。

HMM結構如上圖,ziz_{i}是隱式狀態,每個隱式狀態ziz_{i}下都會產生一個觀測值xix_{i},這就構成了HMM的模型框架。

這個模型是一個有向圖(Directed)、生成模型(Gener model),當然也可以轉換成判別模型。

舉例

假設有兩種不同的不均衡硬幣AB,A出現證明的概率u1,B是u2。
現在做實驗,有一個小明,他會按一定概率扔這兩個硬幣,假設我和小明之間有一道黑布,我無法觀測到他扔了哪塊硬幣(即ziz_{i}),但是可以看到硬幣正反(即觀測值xix_{i})。
在這裏插入圖片描述
現在提出兩個問題:

  • 1、預測扔的哪個硬幣(即decoding/inference problem——知道觀測值,反推背後序列
  • 2、小明的扔硬幣概率轉移矩陣(parameter estimation——給定觀測值,估計模型參數)
  • 3、計算觀測到 P(正反正反) 這個序列的概率(——計算邊緣概率
    這就是HMM最核心的三個問題類型。

舉例2

每個綠色的圈可以是單詞,灰色的圈是詞性,同樣可以列出三個問題:

  • Q1: 反推詞性(decoding/inference)算法:維特比算法
  • Q2:參數估計,給定一個詞性,如“動詞”,下面自己生成一個單詞,即單詞出現的概率,以及詞性轉換的概率.這個概率可能是由語法決定的,即估計詞性轉移矩陣和句子開始的時候是什麼詞性,用EM算法
  • Q3:P(w1,w2,w3),即邊緣概率
    在接下來的學習中,我們會多次遇到這幾個算法,沒學過不用害怕,我們會詳細推導他們。

模型建立

我們用θ={A,B,π}\theta=\{A,B,\pi \}來表示HMM模型中的一切參數,下面將對參數進行解釋,請看圖:
在這裏插入圖片描述
灰色圓圈,即狀態,使用zi表示,綠色圓圈,即觀測值,使用xi表示。

  • A表示狀態轉移矩陣,aij表示從i到j的概率。
  • B表示生成概率矩陣,代表從zi生成xi的概率,稱爲emission,bij代表在i狀態下生成j字母的概率(也是HMM被叫做生成模型的原因,因爲給定了參數,可以生成觀測值)。
  • π代表 “起始z1是什麼 ‘’的概率,是一個向量。

當然,模型的觀測值常常不是離散的,比如語音識別時,用戶說的是一個連續波形,這個時候要藉助GMM(高斯混合模型)把它變成離散的。

兩種case

HMM模型要估計出θ的每個參數都是什麼,針對這個問題,有兩種不同的情況:

  • complete case情況下,即已知x和他的標籤z情況下求解問題,這個時候我們很容易能拿到參數,也就很好解決問題。
  • incomplete case 下,不知道標籤,要藉助EM算法。

在下面的推導中我們也會根據不同的case選取不同方法。

維特比算法介紹與推導

維特比算法是一種很聰明的,針對complete case的算法。
在接下來的問題裏,我們將一步步推導維特比算法。

問題1:已知θ,X,判斷z。
即:已知觀測值和一切參數,要推理隱藏值,即小明的硬幣是什麼,或者單詞的詞性是什麼?

先考慮最笨的方法:把一切可能的z排列組合都列出來,再直接把一切參數代入,求一個可能性最大的z排列組合。
在這裏插入圖片描述
在這個算法裏,算p(x|z)很方便,因爲已知B矩陣,即生成矩陣,倒推z是容易的。
但因爲排列組合可能性太多,是指數級複雜度,所以不是個好算法。

更好的算法:維特比算法。
本質上是動態規劃,動態規劃的本質是,本來是指數級別複雜度,但是我通過不斷儲存,減少重複運算,從而減少複雜度

HMM的模型假設(限制條件)

先引入一個條件:
HMM的限制條件:zi只會和前後的zi-1或zi+1有關(倒序計算時和zi+1有關),從而減少可能性和計算量。

如果是網圖,和其他剩餘節點都有聯繫,那麼即使使用維特比算法,複雜度也下不來。

圖說維特比算法

維特比算法:尋找最好的z

路徑圖例:z1代表第二個狀態,z2代表第一個狀態…希望針對(列)1到m個觀測值,選取最好的z。
路徑連接節點,即可以表示觀測值1到m對應的z

在這裏插入圖片描述
現在我要尋找最好的路徑,就是連乘得到概率最大的路徑。

計算方法:不斷計算和更新路徑的概率得分。概率大的路徑就是最好的路徑。

對於如圖所示的路徑,p(z1=2)可以通過π\pi向量獲得,此時觀察值x1的概率也確定了,接下來p(z2=1|z1=1)也可以查θ得到。
因此,針對這樣一個路徑,總可以計算出概率得分。
在這裏插入圖片描述
維特比算法:把原來的大問題拆分成子問題(也是動態規劃的核心)

定義δk(i):給定了最後時刻的狀態(第zk對應i狀態),接下來最好路徑的值。
δk(i)名爲the score of the best path ending at state I at time k

δk+1(j)可以寫成遞歸形式,因爲前一個時刻可能來自很多東西。假設上一次來自δk(1)則概率是(log(p(zk+1=j|zk=1))+log(p(xk+1|zk+1)),(用log變加法),則針對不同的δk(i),可以寫出矩陣:

在這裏插入圖片描述
δk+1就是這所有可能取值裏,max的一個。

在這裏插入圖片描述
這就變成了經典的動態規劃。
計算過程
先列一個長m的表格用來記錄δ,先填充第一列,然後填滿第二列,不斷接下去,把表格填滿。
類似拿空間換時間,多了m*n矩陣。

在這裏插入圖片描述
在計算zn的時候,要用到zn-1,再用到zn-2,遞歸調用表中數據即可。

至此維特比算法建立完成 🚀

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