Kaldi thchs30手札(八)DAE與TDNN
歡迎大家關注我的博客 http://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]
文字表述為:
- 計算CMVN及統計量。
- 使用add-noise-mod.py程序將提供的四種雜訊加到原始數據上,
- 提取fbank特徵。
- 計算CMVN及統計量,
- 訓練模型。
- 解碼測試。
TDNN
TDNN是Time-Delay Neural Network 的縮寫,即延時神經網路。它相當於CNN的前身,它的共享權值被限制在單一的維度上,並且沒有池化層,適用於語音和時間序列的信號處理。
通常的神經網路識別音素的結構如下圖所示,這裡假設gold音素為B,D,G。其中0-12代表每一幀的特徵向量。