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(μ~μ+σ):=10000034.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模型
- 給出觀測值
訓練開始時使用平均分配的方式初始化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為狀態③

- 利用對隱藏變數的現有估計值,計算其最大似然估計值,這里的隱藏變數就是狀態
?為了計算簡單取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模型訓練完成,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/414008.html
標籤:其他
上一篇:簡單的猜數字游戲
下一篇:YOLOv5中的Focus層
