1. 程式人生 > >統計自然語言處理(馬爾可夫模型)

統計自然語言處理(馬爾可夫模型)

目的

1.瞭解什麼馬爾科夫模型的三個問題
·狀態概率的計算(前向演算法)
·馬爾科夫譯碼過程(維特比演算法)
·馬爾科夫引數求解(EM演算法 前後向演算法)

隱馬爾科夫模型(HMM)

這裡筆者假設大家大致瞭解馬爾科夫模型,即馬爾科夫鏈的節點狀態只於前N個狀態相關,現實生活中常常存在一些隱藏的內容,比如3種骰子的例子,圖如下:
https://www.cnblogs.com/skyme/p/4651331.html如果沒有看過這個圖的請戳這裡,引用了別人的文章。這是一個網上比較常見的例子。
這裡寫圖片描述
很多時候我們知道一些東西,不知道一些東西,所以針對這些已知和未知,大致提出3個隱馬爾科夫模型中常見的3個問題。不過在提出3個問題之前,我先來明確一下文中出現的符號體系。
這裡寫圖片描述


稍微解釋一下,SKπ不用說,A表示隱藏狀態之間的轉移概率,B表示隱藏狀態和觀察狀態之間的一個關係,這個輸出有時候只與隱藏狀態本身有關(圖中描述為只與t時刻有關),比如骰子的例子。但是還有一些這個概率和隱藏狀態的轉換也有關係,這裡沒有想到很好的例子,不過可以簡單說成比方說隱藏節點是燈的開關狀態,觀察點開關的聲音,那麼這個聲音只在狀態轉換的時候出來,大概是這樣的一個意思。好了,現在我們知道了5元組,然後我們看看我們一般都是知道什麼求什麼?我們經常把這3個問題叫做評估,解碼,學習。
1.已知u(π,A,B),求輸出符號的概率。
解釋:這是一個比較基本的思路,我們得到了表象結果,那麼我們需要知道這個結果最大可能的概率是多少,我們可以以此來評定這個HMM模型的好壞,所以通常這個過程叫做評估。在語音識別中這種型別的問題發生在當一大堆數目的馬爾科夫模型被使用,並且每一個模型都對一個特殊的單詞進行建模時。一個觀察序列從一個發音單詞中形成,並且通過尋找對於此觀察序列最有可能的隱馬爾科夫模型(HMM)識別這個單詞。(解釋部分來自52nlp系列)

2.已知u(π,A,B),求出最有可能的隱藏序列,這個過程通常叫做解碼。
解釋:這是最感興趣的一個,就是搜尋生成輸出序列的隱藏狀態序列。在許多情況下我們對於模型中的隱藏狀態更感興趣,因為它們代表了一些更有價值的東西,而這些東西通常不能直接觀察到。(解釋來自52nlp系列)

3.已知了觀察序列,求出最有可能導致這個結果的u(π,A,B)引數。
解釋:這是在未知引數的情況下的求解過程,現實生活中往往很多引數我們是無法事先知道的,所以這裡反求引數是很有意義的,我們把這個過程叫做學習。

評估解決方案-前向演算法

現在如果知道隱藏序列,那麼我們可以直接把概率算出來,但是我們不知道,我們可以做的就是把所有的可能出現的組合的概率加起來。思路如下。
這裡寫圖片描述


對於海苔和天氣的例子,結果如下(預設大家看過這個例子http://www.52nlp.cn/hmm-learn-best-practices-five-forward-algorithm-1沒有的請戳這裡,52nlp寫的很詳細)
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)
但是對於比較長的馬爾科夫鏈來說,這裡計算消耗過大(2T+1)*N^(T+1),下面我們採用遞迴前向演算法來解決這個問題!避免複雜度的祕訣是利用動態程式設計和記憶,因為我們要求最後所有可能概率的和,看下圖可知,我們每次都要把所有的概率都走一遍,這樣不太科學,我們可以一層一層的來,些最終層的概率求和等價於對於網格中所有可能的路徑概率求和,也就求出了給定隱馬爾科夫模型(HMM)後的觀察序列概率。利用這方法,只需要2N^2*T次乘法計算。
這裡寫圖片描述
實現公式如下:
這裡寫圖片描述

解碼解決方案-維特比演算法

同上,這裡也有很暴力的解法,算出所有可能的概率,找出最大的那個,這當然不太科學了。所以我們介紹維特比演算法,維特比演算法我最初是在《通訊原理》的卷積碼解碼中認識到的, viterbi解碼演算法等效於加權圖中最有路徑問題的一個動態規劃解決方案。隨後被證明這是一種ML(Maximum Likelihood)最大似然演算法。
與前向演算法相似,這裡使用遞迴降低複雜度
  給定一個觀察序列和一個隱馬爾科夫模型(HMM),我們將考慮遞迴地尋找最有可能的隱藏狀態序列。我們首先定義區域性概率delta,它是到達網格中的某個特殊的中間狀態時的概率。這些區域性概率與前向演算法中所計算的區域性概率是不同的,因為它們表示的是時刻t時到達某個狀態最可能的路徑的概率,而不是所有路徑概率的總和。就像下圖,每個表示的是一條最可能的路徑。
  這裡寫圖片描述
  這裡因為52nlp中描述的非常仔細,這裡筆者僅僅提出對我來說比較重要的部分,作為自己的記錄(別噴),通過argmax的操作,回溯整個網路,然後我們就可以找到一條最大概率的路徑。此處最大max(xxxx) 與 argmax(),一個是記錄最大概率一個是記錄上一步的路徑。此處與前向演算法的差異在於一個是求最大,一個是求和。
這裡寫圖片描述
提出了思想,暫時理解即可,實現上還是有很多坑的。

學習解決方案-前後向演算法

這裡我並沒有太理解後向的實際意義,書中也並沒有太多介紹(也許是我沒看出來),但是他給了公式,形式上看上去和前向差不多啦。還有一點要提的就是前後向演算法是EM演算法的一種特例,http://www.52nlp.cn/hmm-learn-best-practices-seven-forward-backward-algorithm-3這裡有做介紹,感興趣的可以看一下。
這裡寫圖片描述
這裡確實理解能力有限,關於前向-後向演算法和EM演算法的具體關係的解釋,大家可以參考HMM經典論文《A tutorial on Hidden Markov Models and selected applications in speech recognition》,這裡就不詳述了。反正我沒看懂,但是大致實現應該是有一定的瞭解了!
這裡寫圖片描述