1. 程式人生 > 其它 >GMM-HMM聲學模型例項詳解(標貝科技)

GMM-HMM聲學模型例項詳解(標貝科技)

GMM-HMM聲學模型例項詳解

GMM-HMM為經典的聲學模型,基於深度神經網路的語音識別技術,其實就是神經網路代替了GMM來對HMM的觀察概率進行建模,建模解碼等識別流程的格個模組仍然沿用經典的語音識別技術
接下來我將從GMM、最大似然估計到EM演算法例項,再到最後使用一段語音介紹GMM-HMM聲學模型引數更新過程

一、GMM (混合高斯分佈)

1、正態分佈(高斯分佈)
如果你繪製出來的概率分佈是一條鍾型曲線,且平均值、眾數和中位數都是相等的,那麼隨機變數X就服從正態分佈,記為X~N(μ,σ2),正態分佈概率密度函式:
其中,μ是隨機變數的均值,控制曲線的位置,σ^2控制曲線的陡峭程度

2、GMM (混合高斯分佈):
假設一批資料由三個不同的高斯分佈生成,將這批資料混在一起,該分佈就稱為高斯混合分佈,從數學上講,認為這批資料的概率分佈密度函式可以通過加權函式表示:

二、最大似然估計:

最大似然估計:使用概率模型,找到模型中的引數能夠以較高概率產生觀察資料;簡單來說就是給定一組觀察資料評估模型引數的方法。
比如:要統計全國成年人的身高分佈情況,測量全部人口的身高耗費人力物力,假設身高服從正態分佈,抽取1000人(抽取樣本太少估計出的引數會不太準確),根據這1000人的身高分佈估計全國人口的身高分佈情況,已知身高服從正態分佈,n個人的最大似然函式表示為:

(1)直接求L的最大值可能不太好求,等式兩邊同時取對數,根據對數的性質可以將乘除法法轉變為加減法

(2)整理化簡公式

(3)對包含未知數的函式求最大值,可以分別對未知數(μ、σ^2)求導後令其等於0

(4)最終求得μ也就是樣本的均值、σ^2也就是樣本的方差:

(5)根據1000人的身高資訊分別求出μ、σ^2,
我們這裡用10個人身高 做個示範,10個人身高分[150,155,180,165,170,156,170,183,160,185]
借用python程式碼計算:X~均值(μ=167.4)、方差(σ^2=137.24)、標準差(σ=11.71):

import numpy as np
student_height=np.array([150,155,180,165,170,156,170,183,160,185])
student_mean=np.mean(student_height)
print(student_mean)
print(np.var(student_height))
print(np.std(student_height))
>>167.4
>>137.24
>>11.71

(6)第五步中求出均值與方差,根據正態分佈概率特點就可以計算出10W人(假設全國有10W人)的身高分佈情況:
155.69——167.4(μ-σ~μ):=10000034.1%=34000人
167.4——179.11(μ~μ+σ):=100000
34.1%=34000人
經計算可知,10W個人中身高在155.69~167.4有34000人;在167.4——179.11有34000人
三、EM演算法估計

  • 假設男女身高分別服從不同的正態分佈,現在我想估計的更準確一些,用這10個人的身高[150,155,160,165,170,172,180,183,175,185]分別估計10W個人中男生、女生各自的身高分佈情況
  • 這10個人中我們不知道哪些是男生的身高,哪些是女生的身高,這時候可以藉助EM演算法進行估計

EM演算法分為四個步驟:

(1) 給出觀測值
(2) 利用對隱藏變數的現有估計值,計算其最大似然估計值
(3) 最大化(M)在E步上求得的最大似然值來更新引數的值
(4) 重複(2)-(3)直到收斂,停止迭代
在上面的例子中,隱含變數就是10個人男女身高情況,如果知道了10個人中具體的男女身高情況,就能計算出各自的身高分佈情況,下面具體看下EM演算法是如何進行估計的:

  • 第一步,將10個人身高平均分配,假設前5個一個身高分佈,後5個是一個身高分佈
  • 第二步,根據最大似然估計方法分別估計這兩個身高正態分佈的均值方差,藉助python計算

x1~(164.0,114)

import numpy as np
student_height=np.array([150,155,180,165,170])
student_mean=np.mean(student_height)
print(student_mean)
print(np.var(student_height))
print(np.std(student_height))
>>164.0
>>114.0
>>10.68

x2~(170.8,137.36)

import numpy as np
student_height=np.array([156,170,183,160,185])
student_mean=np.mean(student_height)
print(student_mean)
print(np.var(student_height))
print(np.std(student_height))
>>170.8
>>137.36
>>11.72
  • 第三步,根據這兩個分佈的引數,估計10個人身高分別屬於哪個分佈概率最大
    繪製x1~(164.0,114)的概率密度函式
import math
import numpy as np
import matplotlib.pyplot as plt
u = 164.0   # 均值μ
sig = math.sqrt(10.68)  # 標準差δ
x = np.linspace(u - 3*sig, u + 3*sig, 50)   # 定義域
y = np.exp(-(x - u) ** 2 / (2 * sig ** 2)) / (math.sqrt(2*math.pi)*sig) # 定義曲線函式
plt.plot(x, y, "g", linewidth=2)    # 載入曲線
plt.grid(True)  # 網格線
plt.show()  # 顯示

繪製x2~(170.8,137.36)的概率密度函式

import math
import numpy as np
import matplotlib.pyplot as plt
u = 170.8   # 均值μ
sig = math.sqrt(11.72)  # 標準差δ
x = np.linspace(u - 3*sig, u + 3*sig, 50)   # 定義域
y = np.exp(-(x - u) ** 2 / (2 * sig ** 2)) / (math.sqrt(2*math.pi)*sig) # 定義曲線函式
plt.plot(x, y, "g", linewidth=2)    # 載入曲線
plt.grid(True)  # 網格線
plt.show()  # 顯示

由正態分佈函式圖可知,隨機變數越靠近均值概率越大,如第一個身高值150,與第一個分佈均值的距離為14(164-150),與第二個分佈均值的距離為20.8(170.8-150),故150屬於第一個分佈函式的概率更大,按此方法依次將10個數字分別歸類
第一類分佈:[150,155,165,156,160]
第二類分佈:[180,170,170,183,185]

  • 第四步

重複第二三步驟,直到第一類、第二類分佈中資料不再變化,就完成了EM演算法的整個過程;(由於第二步中不知道具體哪些屬於男生身高哪些屬於女生身高,所以採取平均分配的方式對其進行初始化;第三步中估計出均值與方差後對10個人的身高重新進行歸類,此時有了一定的數學依據,所以比第一次分配更準確,以此類推獲得最終的結果)

四、GMM-HMM聲學模型引數更新

  • 在聲學模型中GMM主要的作用就是得到HMM中的發射概率(即GMM的均值和方差),HMM的作用就是根據各個概率得到最優的音素,單詞以及句子序列
  • 總結來說HMM-GMM模型引數就是轉移概率、混合高斯分佈的均值、方差
  • EM演算法嵌入到整個GMM-HMM中完成模型引數的更新

1、如何將一段語音轉換為想要表達的意思?
先介紹兩個概念:

  • 音素,漢語中一般使用聲母與韻母作為音素集;
  • 狀態,可以理解為比音素更小的語音單位,習慣上把音素分為三個狀態(初始、穩定、結束)

假設下面為一段5s的語音,語音內容為 : 下一個路口 (標註:x ia ii i g e l u k ou),雖然已經給出這段語音的發音,但是對於哪些幀對應哪些音素(三個狀態)的發音卻是未知的,聲學模型就是為了使聲音訊號對齊對應的音素(或音節),在這個過程中使用GMM對幀與狀態之間的關係進行建模,下面介紹具體的細節:

(1)第一:將這段語音以幀長10ms進行分幀,1s的語音被分為100幀,然後對每一幀提取mfcc特徵(一般為39維),這段語音就被表示成為(100,39)維的特徵矩陣(擷取前10幀)

(2) 第二:使用提取的mfcc特徵訓練GMM模型

  1. 給出觀測值
    訓練開始時使用平均分配的方式初始化GMM模型(這裡與上面EM中平均分配的意思一樣)
  • 以上面語音為例,語音被分為100幀,"x ia ii i g e l u k
    ou"為10個音素,平均分幀後每個音素為10幀,也就是"x"對應前10幀,"ia"對應10到20幀,依次分配:
  • 每個音素又有三個狀態,也就是1-4幀為狀態①,5-7幀為狀態②,8-10為狀態③
  1. 利用對隱藏變數的現有估計值,計算其最大似然估計值,這裡的隱藏變數就是狀態
    為了計算簡單取mfcc的前兩個維度保留兩位小數進行說明:
    狀態①(1~4幀):[(13.10,-43.36),(13.43,-40.74),(13.73,-41.76),(13.73,-42.08)]
    狀態②(5~7幀):[(13.70,-41.16),(14.49,-25.57),(15.58,-16.46)
    狀態③(8~10幀):(15.97,-12.37)],[(15.98,-6.50),(16.11,-0.63)
    狀態①: 均值(13.497,-41.985) 方差(0.06766875,0.875075)
    狀態②: 均值(14.59,-27.73) 方差(0.59406667,104.01446667)
    狀態③: 均值(16.02,-6.5) 方差(4.06666667e-03,2.29712667e+01)

根據前面所說EM演算法,計算歐式距離後可重新分配幀數所屬狀態,15幀與均值(13.497,-41.985)距離更近,屬於狀態1,67幀屬於狀態2,8~10幀屬於狀態3(但在聲學模型對齊過程中,還需要特徵序列和標註文字(音素、狀態)的對應關係,因此,需要對特徵序列和標註文字對齊,所以實際訓練過程中是將EM演算法嵌入到GMM-HMM中,使用維特比或其他演算法進行重新對齊)

  • 如此就將輸入特徵(mfcc)與所有狀態進行對應

然後通過統計的方式得到狀態轉移概率統計從狀態①->①的轉移次數,狀態①->②的轉移次數,除以總的轉移次數,就可以得到每種轉移的概率
3) 重新對齊(最大化(M)在E步上求得的最大似然值來更新引數的值)
根據2)得到的引數(轉移概率、均值、方差),重新對音訊進行 【觀察序列(特徵)-狀態序列】的對齊,2)初始化是通過均分進行了一次暴力對齊,3)的重新對齊是在2)得到的引數的基礎上,使用演算法對齊的。對齊方式有兩種:採用viterbi演算法的硬對齊,採用Baum-Welch學習演算法(前向後向演算法)的軟對齊(這兩個演算法的實現細節,不在這裡介紹了)
經過重新對齊後,每一幀對應的狀態就會發生變化,GMM-HMM模型中的引數經重新計算後也會發生變化(對應EM演算法中的M步)

4)重複2)-3)步多次,直至收斂,則該GMM-HMM模型訓練完成。