歡迎大家關注我的博客 pelhans.com/ ,所有文章都會第一時間發布在那裡哦~


本部分是對Kaldi thchs30 中run.sh的代碼的line 109-115 行研究和知識總結,主要內容為帶雜訊的神經網路模型以及TDNN的訓練。

概覽

首先放代碼:

#train dae model
#python2.6 or above is required for noisy data generation.
#To speed up the process, pyximport for python is recommeded.
local/dae/run_dae.sh --stage 0 $thchs || exit 1;

#train tdnn model using nnet3
local/nnet3/run_tdnn.sh --stage 0 --nj $n exp/tri4b || exit 1;

兩行代碼,第一行通過對語音數據添加雜訊來得到有噪音的數據,而後調用nnet1/train_dnn.sh來對其進行訓練,訓練細節和dnn部分一樣。第二行代碼是調用nnet3/train_tdnn.sh對數據通過延時神經網路進行訓練。

由此可見這兩行的重點分別為噪音的添加和延時神經網路。以下對其進行詳細介紹。

DAE

自動編碼器(Auto Encoder, AE)是由自動關聯器演變而來。自動關聯器是一種MLP結構,其中輸出、輸入維度一樣,並定義輸出等於輸入。為了能夠在輸出層重新產生輸入,MLP得找出輸入在隱藏層的而最佳表示。一旦訓練完成從輸入到隱藏層的第一層充當編碼器,而隱藏層單元的值形成編碼表示。從隱藏單元到輸出單元的第二層充當解碼器,由原信號的編碼表示重構信號。

因為輸入是無標籤數據,AE利用自動關聯器的這一點,進而將重構原信號與原信號之間的差作為目標函數,以調整編碼器(encoder)和解碼器(decoder)的參數,使得這個重構誤差最小:調整完畢後,從隱藏單元到輸出單元的解碼器權值參數就不需要了(被去掉),直接將隱藏層單元的值,即編碼值作為第二個自動編碼器的輸入,訓練方式與之前一樣。最後還可以在自動編碼器的最頂編碼曾添加一個分類器,通過有標籤樣本進行監督訓練方法(SGD)對網路進行微調,就像DBN-DNN 那樣。

由多個編碼器堆疊而成的網路稱為深度自動編碼器(Deep Autoencoder, DAE),它屬於無監督模型。而自動編碼器還可以變形為去噪自動編碼器(Denoising Autoencoder)和稀疏編碼(Sparse Coding)。

Kaldi中的run_dae.sh

Kaldi 中的代碼流程較為簡單。與之前的最大區別就是使用了帶雜訊的數據進行訓練。其中帶雜訊數據由add-noise-mod.py腳本完成。其餘部分和DNN部分類似。

其執行流程為

compute_cmvn_stats.sh->{add-noise-mod.py->make_fbank.sh->compute_cmvn_stats.sh}[train,dev,test]->train.sh->nnet-concat->{{decode.sh}}[phone,word]}[train,dev,test]

文字表述為:

  1. 計算CMVN及統計量。
  2. 使用add-noise-mod.py程序將提供的四種雜訊加到原始數據上,
  3. 提取fbank特徵。
  4. 計算CMVN及統計量,
  5. 訓練模型。
  6. 解碼測試。

TDNN

TDNN是Time-Delay Neural Network 的縮寫,即延時神經網路。它相當於CNN的前身,它的共享權值被限制在單一的維度上,並且沒有池化層,適用於語音和時間序列的信號處理。

通常的神經網路識別音素的結構如下圖所示,這裡假設gold音素為B,D,G。其中0-12代表每一幀的特徵向量。

但這種結構只考慮了一幀的特徵,我們知道上下文信息對於序列模型是很有幫助的,因此我們需要考慮更多幀。因此當我們考慮延時為2時,則連續的3幀都會被考慮。其中隱藏層起到特徵抽取的作用,輸入層每一個矩形內共有13個小黑點,代表該幀的13維MFCC特徵。假設每個隱藏層有10個節點,那麼連接的權重數目為: 3 * 13 * 10 - 390 個。用圖表示為:

為了顯示更多幀,將其緊湊表示為:

其中一條彩色線就代表13x10=130個權重值。如果我們持續的對網路進行輸入,那麼就變成了下圖:

其中各色線的權重相同,相當於把權重延時。隱藏層和輸出層之間也可以採用該方法,這樣整體的權重值就大大減少。

該網路的訓練方法和傳統方法一樣,反向傳播就可以。

Kaldi 中的TDNN

thchs30的TDNN程序local/nnet3/run_tdnn.sh裡面是通過調用WSJ的tdnn程序完成的,其餘為參數設置。使用的網路為nnet3。關於這裡中文沒找到合適的資源,只有Kaldi網站上對其有一些介紹。建議觀看Context and chunk-size in the "nnet3" setup。

我看了半天感覺還是理解不好,等待以後補齊。

參考

Context and chunk-size in the "nnet3" setup

系統學習機器學習之神經網路(十一) --TDNN

深度學習在語音識別中的研究綜述


推薦閱讀:
相關文章