kaldi中的chain model詳解
chain model的結構
chain model實際上是借鑒了CTC的思想,引入了blank用來吸收不確定的邊界。但CTC只有一個blank,而chain model中每一個建模單元都有自己的blank。如下圖所示:
對應kaldi中的結構定義為:
在kaldi中,把Sp和Sb看做同一個狀態(都對應state 0),只是pdfclass不同。ForwardPdfClass表示Sp,SelfLoopPdfClass表示Sb。
kaldi中的chain model訓練
chain model實際上也是一種序列鑒別性訓練的方法,所以它也要構造分母fst和分子fst。
ps:這里不用分母詞圖(lattice)和分子詞圖(lattice)的表述,一、因為chain model(lattice free)不需要構建分母詞圖,而是用類似于HCLG這樣的fst結構代替分母詞圖。二、同時chain model為了將每個句子分成一小塊chunk,也會把分子lattice轉換成分子fst(因為fst可以保留時間對齊信息,方便根據時間切分成塊)
下面我們講解chain model訓練的關鍵步驟(為了系統性地說明,我們以aishell中的BAC009S0712W0300這個音頻為例)
一、為每個句子構建訓練圖,然后解碼得到每個句子的可能對齊結果(lattice)
這一步類似于構建解碼用的HCLG,但解碼用的HCLG是所有句子通用的。而我們這里構建的HCLG是根據每個句子的transcripts(轉錄文本)構建的,所以圖會比較小,每個句子有自己的一個HCLG圖。具體構建訓練圖的方法可參考:
Decoding-graph creation recipe (training time) kaldi-asr.org/doc/graph_recipe_train.html
有了訓練圖之后,我們就可以在上面解碼,得到每個句子所有可能的對齊方式。kaldi中將所有可能的對齊用lattice這樣的數據結構來保存,這樣可以節省存儲空間。得到的lattice(CompactLattice)的格式如下:
說明:
第一列和第二列是lattice結點的編號
第三列是word
接下來的兩個數字(比如4.45809,3339.97)分別是語言模型概率和聲學模型概率
接下來以”_“分隔的每個數字都是每一幀對應的transition-id。
為什么不是得到唯一的(最有可能的)對齊呢?kaldi文檔中有解釋:
這一步構建的訓練圖在后面分母fst的構建和分子fst的構建中都會用到。
二、分母fst的構建
1、構建phone級別的語言模型
構建語言模型必須要有語料,那么phone級別的語料從何而來呢?首先根據第一步的lattice(多種可能的對齊方式),我們進一步解碼得到最有可能的對齊方式。kaldi中每個句子的最有可能的對齊方式寫在ali文件中,格式如下:
說明:加粗的表示音頻名字,音頻名字后跟的數字表示每一幀對應的transition-id。
根據transition-id,我們可以得到每一幀對應的phone,如下:
2、構建分母fst
chain model的分母fst類似于解碼時建立的HCLG圖。但是chain model的語言模型是phone級別,所以構圖時我們不需要發音詞典了,其實構造的是HCP(P表示phone LM,HCP就是fst結構,所以叫分母fst)。為了限制HCP圖的大小,我們使用4元phone LM。值得注意的是:不同的句子是共用同一個HCP圖,這一點與傳統的序列鑒別性訓練不同,傳統的序列鑒別性每個句子都有自己的分母lattice。
三、分子fst的構建
1、將第一步得到的以word為單位的lattice轉換成以phone為單位的lattice。
chain model是在phone-level上進行訓練的,所以需要得到以phone為單位的對齊,如下圖所示:
2、構建分子fst:將phone-level的lattice轉換成fst,同時將transiton-id轉換成pdf-id
lattice與fst的不同是,根據fst中編碼了time-alignment信息,可以方便我們根據時間點切分整段音頻。為什么要將transiton-id轉換成pdf-id?因為聲學模型是對pdf-id建模。
說明:
第一列和第二列是fst結點的編號
第三列和第四列是pdf-id(輸出和輸出相同,實際上它是FSA)
同時,在這一步,我們還會以3倍的步幅跳幀進行采樣(至于為什么可以跳幀,在最下面的“常見疑問”模塊會有我自己的理解)。從這個圖我們可以看到跳幀采樣的現象,理論上音素sil對應41幀(通過上上張phone leveld的圖中sil對應的transition-id數可以得到),但現在13幀(通過上張圖,1和218(1和218都對應到音素sil)連續出現的次數可以得到)?;蛟S看上張圖,你還有疑問,為什么pdf-id 218之間還有pdf-id 253呢?這是因為原來的對齊結果不一定是準確的(基于CD-HMM-GMM),kaldi中提供了--left-tolerance和--right-tolerance兩個選項,以phone為單位,允許phone在原來的對齊結果基礎上,向前延伸--left-tolerance幀和向后延伸-right-tolerance幀(通常是5幀)。
到這一步,理論上每個句子的分子fst就構建完成了。
4、將每個句子的分子fst分成多個小chunk,用于訓練
之所以將整個音頻分成chunk,是為了加快訓練速度和解碼速度。因為fst中有時間對齊信息,所以我們很容易將整段fst分成一小塊,如下圖所示:
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中移除的原話:
常見的疑問
1、為什么說chain model是lattice free?
答:之前的鑒別性訓練是需要對每個音頻解碼得到分母詞圖(每個音頻都有自己對應的詞圖)。而chain model的分母fst實際上是HCP(P表示發音詞典的概率),也就是說所有音頻共享同一個HCP圖,不需要分別解碼得到對應的lattice,所以叫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),節省了存儲空間。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。