聲學模型是指給定聲學符號(音素)的狀況下對音頻特徵創建的模型。git
用 \(X\) 表示音頻特徵向量 (觀察向量),用 \(S\) 表示音素 (隱藏/內部狀態),聲學模型表示爲 \(P(X|S)\)。github
但咱們的機器是個牙牙學語的孩子,並不知道哪一個音素具體的發出的聲音是怎麼樣的。咱們只能經過大量的數據去教他,好比說在拼音「é」的時候對應「鵝」的發音,而這個過程就是 GMM 所作的,根據數據創建起「é」這個拼音對應的音頻特徵分佈,即 \(P(x|s=é)\)。孩子學會每一個拼音的發音後,就能夠根據拼音拼讀一個單詞 / 一個句子,但你發現他在讀某段句子的時候,聽起來好像怪怪的,你檢查發現是他把某個拼音讀錯了,致使這句話聽起來和常理不符。而這個怪怪的程度就是你聽到這個音頻特徵序列的時感受這個音頻序列以及其背後的拼音出現的可能性的倒數,這部分則是經過 HMM 來建模的。web
總結一下,GMM 用於對音素所對應的音頻特徵分佈進行建模,HMM 則用於音素轉移和音素對應輸出音頻特徵之間關係的建模。算法
即爲隱馬爾可夫模型(Hidden Markov model,HMM)函數
HMM 脫胎於馬爾可夫鏈,馬爾可夫鏈表示的是一個系統中,從一個狀態轉移到另外一個狀態的全部可能性。但由於在實際應用過程當中,並非全部狀態都是可觀察的,不過咱們能夠經過可觀察到的狀態與隱藏狀態之間的可能性。所以就有了隱馬爾可夫模型。學習
HMM 要遵循的假設:優化
一階馬爾可夫假設:下一個狀態只依賴於當前的狀態。所以多階馬爾可夫鏈可簡化爲ui
輸出無關假設:每一個輸出只取決於當前 (內部/隱藏) 狀態,和前一個或多個輸出無關。spa
聲學模型爲何要用HMM?code
由於聲學模型創建的是在給定音素序列下輸出特定音頻特徵序列的似然 \(P(X|S)\),但在實際狀況中,咱們只知道音頻特徵序列,並不知道其對應的音素序列,因此咱們須要經過 HMM 創建音頻特徵與背後的每一個音素的對應關係,以及這個音素序列是怎麼由各個音素組成的。
上兩個假設能夠引伸出 HMM 中主要的兩種機率構成:
HMM 的三個經典問題
⚠️:後文提到的狀態即指的是內部 / 隱藏狀態。
評估問題就是說,我已知模型參數 \(\theta\) (輸出機率以及轉移機率),最後獲得的觀察序列爲某個特定序列 \(X\) 的機率是多少。
在剛纔的例子中,就是孩子已經知道每一個拼音後面可能接什麼拼音,每一個拼音怎麼讀,當他讀出了某段聲音,這段聲音的機率是多少。
由於在觀察序列固定的狀況下,有多種可能的狀態序列 \(S\),而評估問題就是要計算出在全部可能的狀態下獲得觀察序列的機率,表示爲
在當前的公式裏,咱們暫時先忽略固定的參數 \(\theta\)。根據一階馬爾可夫假設,時刻 \(t\) 的狀態都只取決於時刻 t-1 的狀態,所以單個狀態序列出現的機率表示爲
其中, \(\pi_k\) 表示時刻1下狀態爲 \(k\) 的機率。
根據輸出無關假設,在時刻 \(t\) 觀察序列的值只取決於時刻 \(t\) 的狀態,所以觀察序列關於狀態序列的似然表示爲
所以整個觀察序列出現的機率爲
因爲 \(i,j,k\) 都表示可能的狀態,假設有 \(n\) 種狀態,那麼計算該機率的事件複雜度就爲 \(O(n^T)\),可謂是指數級別了。
所以,前人開動了腦筋,提出了在該問題上將時間複雜度將爲多項式時間的方法。
該方法採用了分治 / 動態規劃的思想,在時刻 \(t\) 下的結果能夠利用時刻 \(t-1\) 的結果來計算。
在時刻 \(t\),觀察序列的機率表示爲前 \(t\) 個時刻的觀察序列與時刻 \(t\) 全部可能的狀態同時出現的機率和
其中, \(N\) 表示全部可能的狀態的集合。
而連加符號的後面部分被定義爲前向機率 \(\alpha_t(j)\),而它能夠被上一個時刻的前向機率迭表明示。
經過該方法,當前時刻下某個狀態的機率只須要遍歷上一時刻全部狀態的機率 (\(n\)),而後當前時刻的全部狀態的機率和也只須要遍歷當前的全部狀態就能夠計算獲得 (\(n\)),考慮到觀察序列持續了 \(T\) 個時刻,所以時間複雜度降爲 \(O(n^2T)\)。
整個過程總結以下
解碼問題就是說在獲得 HMM 模型以後,咱們如何經過觀察序列找到最有可能的狀態序列。在語音識別中,在給定的音頻片斷下,找到對應的各個音素。
仍是剛纔的例子,咱們須要猜想孩子讀出的這段聲音最有可能對應什麼樣的拼音序列,這就是解碼問題。
數學表示
給定在時間 \(t\) 下的內部狀態爲 \(j\),局部最優機率 \(v_t(j)\) 表示的是在時刻 \(t\) 觀察序列與最優內部狀態序列的聯合機率。
一樣也能夠根據時間遞歸表示爲
算法具體流程以下
在表示上很相似於上面的前向算法,只是加和變成了取最大值。具體推導流程也就再也不贅述了。二者的區別能夠看下圖(來源) ,紅線表示解碼路徑,黑線表示評估路徑。
不過這張圖是簡化的狀態,即狀態序列 \(S\) 是肯定的狀況下的狀態轉移與觀察序列之間的關係。
🤔思考:爲什麼每次取局部最優最後就能獲得全局最優?
這和一階馬爾可夫假設有關,由於每個時刻的狀態只取決於上一個時刻的狀態,所以只要上一個時刻每個狀態的前向機率是最大的,再乘上這一時刻對某個狀態的轉移機率和輸出機率,而這兩個機率在參數表裏是固定的,所以再選出乘出來的機率最大便可保證該時刻在這個時刻爲這個狀態的機率最大,直到最後一個時刻。(相似於動態規劃的狀態轉移方程思想)
訓練 (learning) 問題主要是如何學習 HMM 模型參數(輸出機率和表現機率)的問題。在語音識別中,即在一開始只有音頻和標註的狀況下,如何學習到模型。
仍是剛剛那個例子,假如說你沒有教孩子,但給了他本語文教材和對應的錄音磁帶,他須要經過教材中的拼音和磁帶中的錄音來訓練語感 (好比說哪一個拼音讀什麼音,每一個拼音以後可能會跟什麼拼音)。他自學成才了之後咱們才能作剛剛那兩個問題。
因此說訓練問題是評估和解碼問題的基礎,可是是三個問題中最複雜的,由於它是無閉式解的。
HMM 參數估計方法:
HMM訓練問題的標準算法,又稱前向後向算法,是 EM 算法的特例。
後向算法的表示和前向算法相似,然後向機率 \(\beta_t(i)\) 表示的是在給定 \(t\) 時刻狀態爲 \(i\),看到時刻 t+1 到時刻 \(T\) 觀察序列的機率,表示爲
最後,整個觀察序列出現的機率用後向算法表示爲
爲了能學習 HMM 模型參數,咱們能夠經過一個最大似然估計的變體評估咱們的轉移機率 \(\hat{a}_{ij}\) ,能夠表示爲
但如何計算這些次數是個問題,假設咱們能夠估計在時刻 \(t\) 和給定觀察序列下從狀態 \(i\) 轉移到狀態 \(j\) 的機率,那咱們就能夠把每一個時刻的機率加起來做爲從狀態 \(i\) 轉移到狀態 \(j\) 的總次數。
咱們定義了一個「狀態轉移佔有(occupation)率」 \(\xi_{t}(i,j)\) ,做爲給定全部觀察序列的狀況下在時刻 \(t\) 狀態爲 \(i\) 後下一時刻轉移到狀態 \(j\) 的機率,表示爲
下圖(修改自來源)直觀地展現了 \(\xi_{t}(i,j)\) 分子部分的計算過程,所以其分子能夠表示爲 \(\alpha_{t}(i) a_{i j} \beta_{t+1}(j) b_{j}\left(x_{t+1}\right)\)
而其分母部分則能夠表示爲某個時刻全部狀態的前向機率和後向機率的乘積和
所以 \(\xi_{t}(i,j)\) 最後可表達爲
咱們能夠把各個時刻的 \(\xi_{t}(i,j)\) 加起來做爲「從狀態 \(i\) 轉移到狀態 \(j\) 的指望次數」,再將狀態 \(j\) 全部可能的狀態下的指望次數加和就能夠獲得「從狀態 \(i\) 轉移到全部狀態的指望次數」,從而計算獲得 \(\hat{a}_{ij}\)。
咱們一樣須要一個用於計算輸出機率 \(\hat{b}_j(v_k)\) 的最大似然估計公式,\(v_k\) 表示的是輸出序列中的第 \(k\) 個音素對應的音頻特徵。
爲了計算這個公式,咱們須要知道在給定觀察序列的狀況下在時刻 \(t\) 的狀態爲 \(i\) 的機率,咱們將其稱爲「狀態佔有率」 \(\gamma_{t}(i)\),
而分子部分的機率其實剛剛咱們在計算 \(\xi_{t}(i,j)\) 分母時已經用到了,即時刻 \(t\) 下爲狀態 \(i\) 的前向機率乘上後向機率。
獲得了 \(\gamma_{t}(i)\) 之後,就能夠用他來計算 \(\hat{b}_j(v_k)\) 了,咱們加上了全部 \(x_t\) 爲 \(v_k\) 的 時刻的 \(\gamma_{t}(i)\) 做爲分子,而分母就是全部時刻的 \(\gamma_{t}(i)\) 之和。
同時,\(\hat{a}_{ij}\) 的分母也能夠用 \(\gamma_{t}(i)\) 來表示
獲得新的 HMM 參數 \(\theta_1\) 後,又能夠計算獲得新的 \(\theta_2\),一樣又能夠估計獲得新的最佳 \(\theta_1\),一直迭代這個過程直到收斂。
在 E 步創建 \(P(\gamma,\xi | x, a, b)\),而後 M 步 找到將上式最大化的參數 \(a, b\),具體流程以下
儘管從原理上來說前向後退算法能夠徹底無監督地學習參數,但實際上初始化很是重要。 所以,一般會給算法額外的信息。 例如,對於基於 HMM 的語音識別,一般手動設定 HMM 結構,而且從一組觀察序列 \(X\) 中僅訓練輸出機率和(非零的)轉移機率。
高斯混合模型 (Gaussian mixture model,GMM) 就是用混合的高斯隨機變量的分佈來擬合訓練數據(音頻特徵)造成的模型。該方法提供了一種基於規則的方法來衡量一個音素和被觀察音頻幀的「距離」。
給定一個音素,咱們可使用 GMM 學習觀察值的特徵向量,這個機率分佈容許咱們在給定一個音素(狀態)下計算音頻段的似然 \(P(x | s)\).
假設觀察向量中某個特徵 \(x\) 的分佈爲正態分佈,那麼該特徵 \(x\) 的似然函數能夠表示爲均值爲 \(\mu\) 方差爲 \(\sigma^2\) 的高斯分佈
在被標記了狀態的訓練數據下,咱們能夠計算的到關於狀態 \(i\) 的均值和方差
高斯分佈易於從訓練數據中學習而且讓咱們有了一個良好的似然函數 \(f(x|\mu,\sigma)\)。在語音識別中咱們能夠爲每一個音素(狀態)學到一個高斯分佈,這將做爲似然機率,也能夠做爲 HMM 中的輸出機率。
根據 HMM 在時刻 \(t\) 下所處狀態 \(i\) 的機率,將每一個觀察向量 \(x_t\) 按比例分配給每一個可能的狀態 \(i\)。而在時刻 \(t\) 處於狀態 \(i\) 的機率在 HMM 中爲表示爲狀態佔有率 \(\gamma_t(i)\),所以能夠在將高斯分佈的參數指望表示爲
在多變量高斯分佈中,咱們將均值 \(\mu\) 替換爲多個特徵均值的向量 \(\boldsymbol{\mu} = \left(\mu_1,\ldots,\mu_n\right)^T\),將方差 \(\sigma\) 替換爲協方差矩陣 \(\Sigma\in\mathbb{R}^{n\times n}\),其中第 \(i\) 行 \(j\) 列個元素表示爲 \(\sigma_{ij}^2 = E\left[(x_i-\mu_i)(x_j-\mu_j)\right]\),最終的高斯分佈表示爲
經過快速傅立葉變化 FFT 獲得的特徵之間是相關的,但經過梅爾倒譜相關係數 MFCC 獲得的特徵之間是不相關的。在特徵不相關的狀況下,協方差矩陣是對角陣,計算和存儲代價小了不少。這樣咱們就能夠單獨考慮每一個聲學特徵的方差。
但單個高斯分佈可能並不能很好地來對特徵的分佈進行建模 (現實世界老是沒有那麼理想化),所以採用多個加權的高斯分佈來對對特徵分佈建模。
好比說上圖(來源)中的3份量 GMM,有6個高斯參數加上3個權重。
所以,對於一個 HMM 的狀態 \(j\),觀察特徵向量 \(x\) 的似然函數能夠表示爲
其中 M 爲 GMM 的份量數,而 \(c_{j m}\) 表示的是在狀態 \(j\) 下第 \(m\) 個份量的權重。
在實際的 GMM 訓練中,一般採用 EM 算法來進行迭代優化,以求取 GMM 中的加權係數及各個高斯函數的均值與方差等參數。
缺點:
最後再重聲一下,GMM 用於對音素所對應的音頻特徵分佈進行建模,而 HMM 則用於音素轉移和音素對應輸出音頻特徵之間關係的建模。
寫不動了,HMM 和 GMM 梳理推導了很久,若是各位讀者有不懂的歡迎留言討論~👏
參考連接: