語音識別中GMM-HMM的相關知識

  本文講闡述在語音識別中GMM-HMM的知識。其中包括了對GMM(Gauss Mixture Model)和HMM(Hidden Markov Model)的定義、原理及其算法的介紹。

GMM(高斯混合模型)

  設有隨機變量X,則混合高斯模型可以用下式表示:

p(x)=k=1KπnN(x|μk,k)

  其中N(x|μk),k 稱爲高斯混合模型中的第K個分量。且滿足:
k=1Kπk=10πk1

  可以看到πk 相當於每個分量N(x|μk,k) 的權重。

GMM參數估計過程

 GMM的貝葉斯理解

  在GMM的定義中,πk 是混合係數,表示第K個分佈被選中的概率。下面引入一個K維隨機變量Z,其中zk 定義如下:

zk={1selectk0others,1kK

  記第k個分佈被選中的概率爲p(zk=1)=pk ,那麼第k個分佈未被選中的概率爲p(zk=0)=1pk 。因此,有:Kzk=1 。假設zk 之間是獨立同分布的,則z的聯合概率分佈形式爲:
p(z)=p(z1)p(z2)...p(zk)=k=1Kpkzk

  類似的,給定z的一個特定的值,x關於z的條件概率分佈是一個高斯分佈p(x|zk=1)=N(x|mk,k) ,也可以寫成
p(x|z)=k=1KN(x|m,k)zk
  聯合概率分佈爲p(z)p(x|z) ,從而x的邊緣概率分佈可以通過將聯合概率分佈對所有的z求和的方式得到,即
p(x)=Zp(z)p(x|z)=k=1K(k=1K(pkzk)N(x|mk,k)zk)=k=1KpkN(x|mk,k)

  根據貝葉斯定理,後驗概率可以表示爲:
γ(zk)=p(zk=1|x)=p(zk=1)p(x|zk=1)/j=1Kp(zj=1)p(x|zj=1)=πkN(x|μk,k)/j=1KπjN(x|μj,j)

EM 算法估計GMM參數

  EM算法分兩步,第一步先求出要估計參數的粗略值,第二部使用第一步的值最大似然估計。因此要先求出GMM的似然函數。
假設x={x1,x2,...,xN} ,GMM模型中有三個參數需要估計,分別爲π,μ, 。並且有:

p(x|π,μ,)=k=1KπkN(x|μk,k)

  爲了估計這三個參數,需要分別求解出這三個參數的最大似然函數。先求解μk 的最大似然函數。對上式取對數後在對μk 求導並令導數爲0即得到最大似然函數。
0=n=1NπkN(xn|μk,k)k(xnμk)/jπkN(xn|μj,j)

  注意到上式中分數的一項的形式正好是後驗概率的形式。兩邊同乘k1 ,重新整理可以得到:
μk=(1/Nk)n=1Nγ(znk)xn
  其中:Nk=n=1Nγ(znk) 上面兩式中,N表示點的數量。γ(znk) 表示點屬於聚類k的後驗概率。則Nk 可以表示屬於第k個聚類的點的數量。那麼μk 表示所有點的加權平均,每個點的權值是n=1Nγ(znk) ,跟第k個聚類有關。
  同理可求k 的最大似然函數,可以得到:
k=(1/Nk)n=1Nγ(znk)(xnμk)(xnμk)T

  最後剩下πk 的最大似然函數。注意到πk 有限制條件k=1Kπk=1 ,因此我們需要加入拉格朗日因子
lnp(x|π,μ,)+λ(k=1Kπk1)

  求上式關於πk 的最大似然函數,得到:
0=n=1N(N(xn|μk,k)/jπjN(xn|μj,j))+λ

  上式兩邊同乘πk ,可以得到λ=N ,進而可以得到πk 更簡潔的表達式:
πk=Nk/N

  EM算法估計GMM參數化μk=(1/Nk)n=1Nγ(znk)xn ,k=(1/Nk)n=1Nγ(znk)(xnμk)(xnμk)T ,πk=Nk/N 需要用到以上式子。我們先指定πμ (以下將以上三式稱爲1,2,3)的初始值,帶入後驗概率公式計算出γ(znk) ,然後再將帶入(1,2,3)式,得到πk,μk,k ;接着用求得的πk,μk,k 再帶入後驗概率公式得到新的γ(znk) ,再將更新後的帶入(1,2,3),如此往復,直到算法收斂。

EM 算法

  1.定義分量數目K,對每個分量k設置πk,μk,k 的初始值,然後計算

p(x|π,μ,)=k=1KπkN(x|μk,k)
的對數似然函數。
  2.E step
 根據當前的πk,μk,k 計算後驗概率γ(znk)
γ(znk)=πkN(xn|μn,n)/j=1πjN(xn|μj,j)

  3.M step
  根據E step中計算γ(znk) 再計算新的πk,μk,k
μknew=(1/Nk)n=1Nγ(znk)xn

knew=(1/Nk)n=1Nγ(znk)(xnμknew)(xnμknew)T

πknew=Nk/N

其中:
Nk=n=1Nγ(znk)

  4.計算後驗概率的對數似然函數
lnp(x|π,μ,)=n=1Nln{k=1KπkN(xk|μk,k)}

  5.檢查參數是否收斂或對數似然函數是否收斂,若不收斂,則返回第2步。

HMM(隱馬爾科夫模型)

  隱馬爾科夫模型是關於時序的概率模型,描述由一個隱蔽的馬爾科夫鏈隨機生成不可觀測的狀態隨機序列,再由各個狀態生成一個觀測而產生觀測隨機序列的過程。隱藏的馬爾科夫鏈隨機生成的狀態的序列,稱爲狀態序列(state sequence);每個狀態生成一個觀測,而由此產生的觀測的隨機序列,稱爲觀測序列(observation sequence)。序列的每一個位置又可以看作是一個時刻。隱馬爾科夫模型是統計模型,它用來描述一個含有隱含未知參數的馬爾科夫過程。其難點是從可觀察的參數中確定該過程的隱含參數。然後利用這些參數來做進一步的分析,例如模型識別。
  隱馬爾科夫模型由初始概率分佈、狀態轉移概率分佈以及觀測概率分佈確定。其形式定義如下:
  設Q是所有可能的狀態集合,V是所有可能的觀測的集合。

Q={q1,q2,...,qN}V={v1,v2,...,vM}
其中,N是可能的狀態數,M是可能的觀測數。
  I是長度爲T的狀態序列,O是對應的觀測序列。
I={i1,i2,...,iT}O={o1,o2,...,oT}

  A是狀態轉移概率矩陣:
A=[aij]N×N
其中,
aij=P(it+1=q|it=qi)i=1,2,...,Nj=1,2,...,N
  是在時刻t處於狀態qi 的條件下在時刻t+1轉移狀態qj 的概率。
B是觀測概率矩陣:
B=[bj(k)]N×N
其中,
bj(k)P(ot=vk|it=qj)k=1,2,...,Mj=1,2,...,N

  是在時刻t處於狀態qj 的條件下生成觀測vk 的概率。
  π 是初始狀態概率向量:
π=(πi)
其中,
πi=P(i1=qi)i=1,2,...N
  是時刻t=1處於狀態qi 的概率。
  隱馬爾科夫模型由初始概率向量π ,狀態轉移矩陣A和觀測概率矩陣B決定。π 和A決定狀態序列,B決定觀測序列。因此,隱馬爾科夫模型λ 可以用三元符號表示,即
λ=(A,B,π)
A,B,λ 稱爲隱馬爾科夫模型的三要素。
  從定義可知,隱馬爾科夫模型做了兩個基本假設:
(1)齊次馬爾科夫性假設,即假設隱藏的馬爾科夫鏈在任意時刻t的狀態只依賴於其前一個狀態,與其他時刻的狀態及觀測無關,也與時刻t無關。
P(it|it1,ot1,...,i1,o1)=P(i1|it1)

(2)觀測獨立性假設,即假設任意時刻的觀測只依賴於該時刻的馬爾科夫鏈的狀態,與其他觀測及狀態無關。
P(ot|iT,oT,iT1,oT1,...,it+1,ot+1,it,it1,ot1,...,i1,o1)=P(i1|it1)

  下面給出一個隱馬爾科夫的例子。
  假設存在三個不同的骰子。第一個骰子是六面體(這裏成爲D6),每個面(1,2,3,4,4,5,6)出現的概率均爲1/6。第二個骰子是個四面體(D4),每個面(1,2,3,4)出現的概率爲1/4。第三個骰子是八面體(D8),每個面(1,2,3,4,5,6,7,8)出現的概率是1/8。
這裏寫圖片描述
  假設我們開始投擲骰子,我們先從三個骰子中挑一個挑到任何一個的概率均爲1/3,然後投擲骰子,得到一個數字,1,2,3,4,5,6,7,8中的一個。我們不停的重複上述過程,我們便可以得到一串數字,每個數字都是1,2,3,4,5,6,7,8中的一個。比如我們投擲5次骰子得到五個數字1,6,3,5,2,這串數字叫做可見狀態鏈。但是在隱馬爾科夫模型中,我們不僅僅有這麼一串可見狀態鏈,還有一串隱含狀態鏈。比如這個例子中的隱含狀態鏈就有可能是D6,D8,D8,D6,D4 。
  一般來說,HMM說到的馬爾科夫鏈其實是指隱馬爾科夫鏈,因爲隱含狀態之間存在轉換概率,在我們這個例子中D6的的下一個狀態是D4,D6,D8的概率都是1/3。D4,D8的下一個狀態是D4,D6,D8的概率也是1/3。我們假定是爲了更好的說清楚,但是我們其實可以隨意設定轉換概率的。
同樣的,儘管可見狀態之間沒有轉換概率,但是隱含狀態和可見狀態之間有輸出概率。如圖所示
這裏寫圖片描述
這裏寫圖片描述
  如果提前知道所有隱含狀態之間的轉換概率和輸出概率,做模擬是相當容易的。但對於缺失的信息做起來就相當麻煩了,需要一些算法進行處理,這些算法我們在後面講解。

觀測序列的生成過程

  輸入:隱馬爾科夫模型λ=(A,B,π) ,觀測序列長度T
  輸出:觀測序列O=(o1,o2,...,oT)
  (1) 按照初始狀態分佈π 產生狀態i1
  (2) 令t=1
  (3) 按照狀態it 的觀測概率分佈bit(k) 生成ot
  (4)按照狀態it 的狀態轉移概率分佈{ait,it+1} 產生狀態it+1it+1=1,2,...N
  (5)令t=t+1;如果t

隱馬爾科夫模型的3個基本問題

  (1)概率計算問題。給定模型λ=(A,B,π) 和觀測序列O=(o1,o2,...,oT) ,計算在模型λ 下序列O出現的概率P(O|λ)
  (2)學習問題。已知觀測序列O=(o1,o2,...,oT) ,估計模型λ=(A,B,π) 參數,使得在該模型下觀測序列概率P(O|λ) 最大。即使用極大似然估計的方法估計參數。
  (3)預測問題,也稱爲解碼問題。已知模型λ=(A,B,π) 和觀測序列O=(o1,o2,...,oT) ,求對給定觀測序列條件概率P(O|I) 最大的狀態序列I=(i1,i2,...,iT)
  接下來我們將逐一介紹這三個基本問題的解法。

概率計算方法

  在介紹前向算法和後向算法前,先介紹概念上可行但計算上不可行的直接計算法。

 直接計算法

  給定模型λ=(A,B,π) 和觀測序列O=(o1,o2,...,oT) ,計算觀測序列出現的概率P(O|λ) 。最直接的方法就是按照公式直接計算。通過列舉所有可能的的長度爲T 的序列I=(i1,i2,...,iT) ,求各個狀態序列I 與觀測序列O=(o1,o2,...,oT) 的聯合概率P(O,I|λ) ,然後對所有可能的狀態序列求和,得到P(O|λ)
  狀態序列I=(i1,i2,...,iT) 的概率是

P(I|λ)=πi1ai1i2ai3i4...aiT1iT
  對於固定的狀態序列I=(i1,i2,...,iT) ,觀測序列O=(o1,o2,...,oT) 的概率是P(O|I,λ)
P(O|I,λ)=bi1(o1)bi2(o2)...biT(oT)
  OI 同時出現的聯合概率爲
P(O,I|λ)=P(O|I,λ)P(I|λ)
  然後,對所有可能的狀態序列I 求和,得到觀測序列O 的概率,即
P(O,I|λ)=IP(O|I,λ)P(I|λ)
  但是,利用上式的計算量很大,這種算法不可行。下面介紹計算觀測序列概率P(O|λ) 的有效算法:前向-後向算法。

 前向算法

  前向算法定義了一個前向概率隱馬爾科夫模型的概念。給定λ ,定義到時刻t 部分觀測序列爲o1,o2,...,ot 且狀態爲qi 的概率爲前向概率,記作:

αt(i)=P(o1,o2,...,ot,it=qi|λ)
  有了前向概率,我們就可以遞推的求出前向概率αt(i) 及觀測序列概率P(O|λ) 。具體地推過程爲:
αt+1(i)=[j=1Nαt(j)aji]bi(ot+1)
  其中aji 爲轉移概率,具體爲:
aji=P(it+1=qi|it=qj)
  而根據前向概率的定義:
at(i)=P(o1,o2,...,ot,it=qt|λ)
  根據上面提到的齊次馬爾科夫假設,有:
aji=P(it+1=qi|it=qj)=P(it+1qi|o1,o2,...,ot,it=qj)
  因此可以將αt(j)aji 合併爲:
P(o1,o2,...,ot,it=qj,it+1=qi|λ)
  在經過求和符號處理之後,有:
j=1Nαt(j)αji=P(o1,o2,...,it+1=qi|λ)
  然後遞推式中bi(ot+1) 的是觀測概率,具體爲:
bi(ot+1)=P(ot+1|it+1=qi)=P(ot+1|o1,o2,...,ot,it+1=qi)
  後面的連等成立是因爲應用了前面提到的觀測獨立性假設。這樣就有
αt+1(i)=P(o1,o2,...,ot,ot+1,...,it+1=qi|λ)
  最後爲了得到 ,我們只要把馬爾科夫狀態序列的最後一個狀態的所有前向概率進行求和就可以了,具體爲:
P(O|λ)=i=1NαT(i)=P(o1,o2,...,ot,ot+1,...,oT|λ)

 後向算法

  後向算法與前向算法類似,他定義了一個概念叫後向概率:給定隱馬爾科夫模型λ ,定義在時刻t 狀態爲qi 的條件下,從t+1T 的部分觀測序列爲ot+1,ot+2,...oT 的概率爲後向概率,記作

βt(i)=P(ot+1,ot+2,...oT|it=qi,λ)
  同樣也可以用遞推的方法求得後向概率及觀測概率。由於和前向算法類似這裏推導過程忽略,介紹下後向算法的步驟:
  輸入:隱馬爾科夫模型λ ,觀測序列O
  輸出:觀測序列概率P(O|λ)

   1.

βT(i)=1,i=1,2,...,N

  2. 對t=T1,T2,...,1
βT(i)=j=1Naijbj(ot+1)βt+1(j)

   3.
P(O|λ)=i=1Nπibi(o1)β1(i)

  步驟1初始化後向概率,對最終時刻的所有狀態qi 規定βT(i)=1 。步驟2是後向概率的遞推公式。步驟3求P(O|λ) 的思路與步驟2一致,只是初始概率代替轉移概率。
  利用前向概率和後向概率的定義可以將觀測序列概率P(O|λ) 統一寫成
P(O|λ)=i=1Nj=1Nαt(i)aijbj(ot+1)βt+1(j)
  此時當t=1t=T1 時分別爲式子
P(O|λ)=i=1NαT=P(o1,o2,...,ot,ot+1,...,oT|λ)
P(O|λ)=i=1Nπibi(o1)β1(i)

學習算法

  隱馬爾科夫模型的學習,根據訓練數據是包括觀測序列和對應的狀態序列還是隻有觀測序列,可以分別由監督學習與非監督學習實現。接下來會先介紹監督學習算法,而後介紹非監督學習算法——BaumWelch 算法

 監督學習算法

  假設已給訓練數據包含S 個長度相同的觀測序列和對應的狀態序列{(O1,I1),(O2,I2),...,(OS,IS)} ,那麼可以利用極大似然法來估計隱馬爾科夫模型的參數。具體方法如下:
   1. 轉移概率aij 的估計
設樣本中時刻t 處於狀態i時刻t+1 轉移狀態j 的頻數爲Aij ,那麼狀態轉移aij 的估計是

a^ij=Aijj=1NAij,i=1,2,...,N;j=1,2,...,N

   2. 觀測概率bj(k) 的估計
設樣本狀態爲j 並觀測爲k 的頻數是Bjk ,那麼狀態爲j 觀測爲k 的概率bj(k) 的估計爲
b^j(k)=Bjkk=1MBjk,j=1,2,...,N;k=1,2,...,M

  3.初始狀態概率πi 的估計π^iS 個樣本中初始狀態爲qi 的頻率由於監督學習需要使用訓練數據,而人工標註訓練數據往往代價更高,有時就會利用非監督學習的方法。

BaumWelch 算法

  學習問題即參數估計的問題的解決需要BaumWelch 算法,下面介紹BaumWelch 算法。
  已知觀測序列O ,估計模型參數λ ,使得在該模型下觀測序列概率P(O|λ) 最大,由於狀態序列未知,因此這可以看作是一個含有隱變量的參數估計問題,這一問題的解決依靠EM 算法,而BaumWelch 算法就是EM 算法在隱馬爾科夫模型學習中的具體體現。
根據EM算法,我們需要先求出其Q函數,如下:

Q(λ,λ¯)=IlogP(O,I|λ)P(I|O,λ¯)
  我們寫出Q函數之後後面就要對它進行極大化,也就是說EM算法的M步驟。既然是最大化,那麼只要保證不影響最終的結果,對Q函數進行最大化來說沒有影響的常數因子乘除是可以的。我們注意到Q函數的後半部分爲
P(I|O,λ¯)=P(O,I|λ¯)P(O|λ¯)
P(O|λ) 便是概率計算問題中我們解決的問題,對於固定的模型參數來說它是一個常量,因此我們爲了後邊計算方便可以在上面原先的Q 函數的基礎上乘以它,使得Q 函數稱爲:
Q(λ,λ¯)=IlogP(O,I|λ)P(O,I|λ¯)
  爲什麼要這麼做呢?這是爲了後面將概率計算問題中有意義的一些概率計算公式直接套進去。又因爲完全數據可以寫成這樣:
logP(O,I|λ)=πi1bi1(o1)ai1ai2b(o2)...aiT1iTbiT(oT)
  於是Q函數可以寫成
Q(λ,λ¯)=i=1NlogπiP(O,i1=i|λ¯)+i=1Nj=1Nt=1T1logaijP(O,it=i,it+1=j|λ¯)+j=1Nt=1Tlogbj(ot)P(O,it=j|λ¯)

  可以看到,我們將三項中分別的對I 的求和進行了劃分。由於隱變量I=(i1,i2,...,iT) 。原來的求和需要遍歷所有的I的取值,然後進行求和,然而這基本上是不可能完成的任務。改寫後,我們將遍歷的空間進行了劃分,同時很好的將P(O,I|λ¯) 部分改寫後也融入到求和之中。比如第一項,對I 的遍歷等價於先固定狀態i1 ,使其分別取值所有可能的狀態,而i2,i3,...,iT 仍然像原來一樣隨便取值。這樣,就把I 空間劃分爲N 個更小的空間。然後再把這N 個空間的結果相加,等價於原來對空間I 進行遍歷。而且改寫之後,P(O,I|λ¯) 部分改變的就可以表示了。如果對Q 函數的三項分別求極大值,在計算後會發現,最後的結果可以用一些有意義的概率來表示。這也就是之前對Q 函數進行修改的原因。
 (BaumWelch 算法)

  輸入:觀測數據O=(o1,o2,...,oT)
  輸出:隱馬爾科夫模型。
  (1) 初始化
  對n=0,aij(0),bj(0),πi(0) ,得到模型λ(0)=(A(0),B(0),C(0))
  (2) 遞推。對n=1,2,...

aijn+1=t=1T1ξt(i,j)t=1T1γt(i)

bj(k)(n+1)=t=1,ot=vkT1γ(j)t=1Tγt(i)

πin+1=γ1(i)

  (3) 終止。得到模型參數
λ(n+1)=(A(n+1),B(n+1),C(n+1))

Viterbi 算法

  下面介紹隱馬爾科夫模型預測的算法:Viterbi 算法。
   Viterbi 算法實際上是用動態規劃解隱馬爾科夫模型預測問題,即用動態規劃求概率最大路徑(最優路徑)。這時一條路徑對應着一個狀態序列。根據動態規劃原理,最優路徑具有這樣的特性:如果最優路徑在時刻t 通過結點it ,那麼這一路徑從結點it 到終點iT 的部分路徑,對於itiT 的所有可能的部分路徑來說,必須是最優的。因爲假如不是這樣的,那麼從itiT 就有另外一條更好的路徑存在,如果把它和從i1 到達it 的部分路徑連接在一起,就會形成一條比原來更優的路徑,這是矛盾的。依據這一原理,我們只需從時刻t=1 開始,遞推地計算在時刻t 狀態i的各條部分路徑的最大概率,甚至得到時刻t=T 狀態爲i 的各條路徑的最大概率。時刻t=T 的最大概率即爲最優路徑的概率,最優路徑的終結點也同時得到。之後,爲了找出最優路徑的各個結點,從終結點iT 開始,由後向前逐步求得結點iT1,...,i1 ,得到最優路徑I=(i1,i2,...,iT) 。這就是Viterbi 算法。
  首先導入兩個變量δψ 。定義在時刻t 狀態爲i的所有單個路徑(i1,i2,...,it) 中概率最大值爲

δt(i)=maxP(it=i,it1,...,i1,ot,...,o1|λ)i=1,2,...,N

δt+1(i)=maxP(it+1=i,it,...,i1,ot+1,...,o1|λ)=max[δt(j)aij]bi(ot+1)i=1,2,...,N;t=1,2,...,T1

  定義在時刻t 狀態i 的所有單個路徑(i1,i2,...,it1,i) 中概率最大的路徑的第t1 個結點爲
ψt(i)=argmax[δt1(j)aji]i=1,2,...,N

下面介紹維特比算法。
 (Viterbi 算法)

  輸入:模型λ=(A,B,π) 和觀測數據O=\left ( o_{1} ,o_{2},…,o_{T}\right );
  輸出:最優路徑I=(i1,i2,...,iT)
  (1) 初始化

δ1(i)=πibi(oi)i=1,2,...,N

ψ1(i)=0i=1,2,...,N

  (2) 遞推。對t=2,3,...,T
δt(i)=max[δt1(j)aji]bi(ot)i=1,2,...,N

ψt(i)=argmax[δt1(j)aji]i=1,2,...N

  (3) 終止。
P=maxδT(i)

iT=argmax[δT(i)]

  (4) 最優路徑回溯。對t=T1,T2,...,1
it=ψt+1(it+1)

  求得最優路徑I=(i1,i2,...,iT)
  隱馬爾科夫模型是關於時許的概率模型,描述由一個隱藏的馬爾科夫鏈隨機生成不可觀測的狀態的序列,再由各個狀態隨機生成一個觀測而產生觀測的序列的過程。

 參考文獻

李航. 統計學習方法[M]. 清華大學出版社:李航, 2012. 171-189
http://blog.csdn.net/kl1411/article/details/78155120
http://blog.csdn.net/u011331731/article/details/72833134

發佈了53 篇原創文章 · 獲贊 124 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章