chain model(LFMMI)詳解

chain model的結構

chain model實際上是借鑑了CTC的思想,引入了blank用來吸收不確定的邊界。但CTC只有一個blank,而chain model中每一個建模單元都有自己的blank。如下圖所示:
在這裏插入圖片描述
對應kaldi中的結構定義爲:

<Topology>
<TopologyEntry>
<ForPhones>
1 2 3 4 5 6 7 8 …
</ForPhones>
<State> 0 <ForwardPdfClass> 0 <SelfLoopPdfClass> 1 <Transition> 0 0.5 <Transition> 1 0.5 </State>
<State> 1 </State>
</TopologyEntry>
</Topology>

在kaldi中,把Sp和Sb看做同一個狀態(都對應state 0),只是pdfclass不同。ForwardPdfClass表示Sp,SelfLoopPdfClass表示Sb。

kaldi中的chain model訓練

chain model實際上也是一種序列鑑別性訓練的方法,所以它也要構造分母fst和分子fst。(這裏不用分母詞圖和分子詞圖的表述,因爲chain model(lattice free)不需要構建分母詞圖,而是用類似於HCLG這樣的fst結構代替分母詞圖)

  • 分母fst的構建

  • 分子fst的構建

    1、根據HMM-GMM模型解碼得到每個句子word層面的所有可能對齊

    爲什麼不是得到唯一的(最有可能的)對齊呢?kaldi文檔中有解釋:

    Instead of enforcing a particular pronunciation of the training data, we use as our reference a lattice of alternative pronunciations of the training data, generated by a lattice-generating decoding procedure using an utterance-specific graph as the decoding graph. This generates all alignments of pronunciations that were within a beam of the best-scoring pronunciation.(也就是說考慮了多音字的情況)

    kaldi中將所有可能的對齊用lattice這樣的數據結構來保存,這樣可以節省存儲空間。得到的lattice(CompactLattice)的格式如下:
    在這裏插入圖片描述
    說明:
    第一列和第二列是lattice結點的編號
    第三列是word
    接下來的兩個數字(比如4.45809,3339.97)分別是語言模型概率和聲學模型概率
    接下來以”_“分隔的每個數字都是每一幀對應的transition-id。

    通過這個圖,我們還可以看到不止有一種對齊,比如“協會”後面可以跟“驚喜”、“崛起”、“舉行”、“進行”和“舉起”等詞

    2、將第一步得到的word-level的lattice轉換成phone-level。

    chain model是在phone-level上進行訓練的,所以需要得到phone級別的對齊,如下圖所示:
    在這裏插入圖片描述
    3、將lattice轉換成fst,同時將transiton-id轉換成pdf-id
    lattice與fst的不同是,根據fst可以得到每一幀對應的pdf-id(time-alignment信息,這個信息在下一步中將用到)。爲什麼要將transiton-id轉換成pdf-id?因爲聲學模型是對pdf-id建模。
    在這裏插入圖片描述
    說明:
    第一列和第二列是fst結點的編號
    第三列和第四列是pdf-id(輸出和輸出相同,實際上它是FSA)

    到這一步,理論上每個句子的分子fst就構建完成了。

    4、將每個句子的分子fst分成多個小chunk,用於訓練

chain model和傳統的序列鑑別性訓練(MMI/MPE/sMBR)的區別

基於CD-DNN-HMM的序列鑑別性訓練,需要以下幾步:

  1. 訓練一個基於CE(交叉熵)準則的CD-DNN-HMM模型作爲種子模型,因爲CD-DNN-HMM通常會優於CD-GMM-HMM。然後利用該種子模型,得到基於狀態層面的強制對齊作爲分子詞圖。
  2. 基於一元語言模型構建一個HCLG,然後在HCLG上解碼得到每個句子的分母詞圖。之所以採用一元的語言模型,應該是爲了使詞圖不會太大。

chain model雖然也是一種序列鑑別性訓練,但它的訓練流程比較簡單:

  1. chain model不需要事先訓練一個CE準則的DNN模型;而是直接使用CD-HMM-GMM模型得到每個句子的對齊結果,然後生成分子fst。
  2. chain model不需要爲每個句子構建分母fst,而是直接使用HCP圖(P表示phone LM)。

同時,chain model是直接在phone級別上建模的。傳統的序列鑑別性訓練是在word-level上建模的。

chain model的優點:
1、解碼速度更快。因爲chain model採用拼幀降採樣(每三幀取一幀)的方式,也就是說幀移變成了30ms,而不是10ms,所以幀率是傳統神經網絡聲學模型的三分之一;
2、訓練速度更快。不需要預先訓練DNN模型,同時省去了分母lattice的生成。

chain model和CTC對比

這是Dan Povey在回答爲什麼將CTC腳本從kaldi中移除的原話:

Firstly, CTC was never in the master branch of Kaldi.
It’s dropped permanently, because the ‘chain’ models were always
better than CTC
. And I removed the branch because I don’t want to
answer questions about it (and because it’s a waste of their time
too). BTW, a presentation by Google here at Interspeech is saying something
similar, that a conventional model, discriminatively trained, with 1/3
the normal frame rate, beats CTC.

常見的疑問

1、爲什麼說chain model是lattice free?
答:因爲chain model不需要對每個句子構建分母詞圖,而是讓所有句子共享同一個HCP圖(P表示phone LM)。也就是說分母詞圖的構建不需要生成lattice,所以說chain model是lattice free的。

2、爲什麼chain model可以採用跳幀降採樣的方式訓練和解碼,而傳統的HMM-GMM不行?
答:主要跟建模粒度有關。chain model中的每個phone只有一個state(不考慮blank),所以我們可以認爲它的建模單元是phone。而傳統的HMM-GMM的每個phone有3或5個state,所以傳統的HMM-GMM實際上是對state建模。因爲state的建模粒度比較小,採用跳幀的方式時,可能跳過了中間重要的幾個state,從而影響識別結果。而phone的建模粒度較大,採用跳幀的方式通常不會跳過phone。

3、實際處理時(如kaldi),爲什麼要將句子分成多個小塊(chunk)?
答:對於非循環模型和非chain模型的情況,分成chunk主要是考慮到我們訓練時是利用上下文信息的,比如考慮了前10幀和後10幀,那麼每個訓練的example需要存儲21幀特徵,8個example需要存儲168幀。如果我們將連續8幀做成一個chunk,那麼我們只需要存儲28幀(10+8+10),節省了存儲空間。
對於循環模型或chain模型,主要是分成chunk能提高訓練速度和解碼速度,具體可以參考我之前的文章:https://blog.csdn.net/asrgreek/article/details/87884835

4、chain model的分子詞圖是根據CD-HMM-GMM模型的對齊結果構建的,但這個對齊結果可能不準確,怎麼解決這個問題?
答:kaldi中提供了–left-tolerance和–right-tolerance兩個選項,以phone爲單位,允許phone在原來的對齊結果基礎上,向前延伸–left-tolerance幀和向後延伸-right-tolerance幀(通常是5幀)。

5、chain model的建模單元?
答:chain model使用biphone作爲基本的建模單元,而不是我們經常用的triphone。Dan Povey在2016年的interspeech演講中提到,實驗發現biphone的效果稍微好於triphone。同時解碼速度更快了,因爲phone的數量減少了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章