當前位置:
首頁 > 最新 > 詳解 DNN 在聲學應用中的模型訓練

詳解 DNN 在聲學應用中的模型訓練

雷鋒網(公眾號:雷鋒網)按:本文作者張慶恆,原載於作者個人博客,雷鋒網經授權發布。

本文通過簡單kaldi源碼,分析DNN訓練聲學模型時神經網路的輸入與輸出。在進行DNN訓練之前需要用到之前GMM-HMM訓練的模型,以訓練好的mono模型為例,對模型進行維特比alignement(對齊),該部分主要完成了每個語音文件的幀到 transition-id 的映射

不妨查看對齊後的結果:

speaker001_00003 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 16 15 15 15 18 890 889 889 889 889 889 889 892 894 893 893 893 86 88 87 90 89 89 89 89 89 89 89 89 89 89 89 89 89 89 194 193 196 195 195 198 197 386 385 385 385 385 385 385 385 385 388 387 387 390 902 901 901 904 903 906 905 905 905 905 905 905 905 905 905 905 905 914 913 913 916 918 917 917 917 917 917 917 752 751 751 751 751 751 754 753 753 753 753 753 753 753 753 756 755 755 926 925 928 927 927 927 927 927 927 927 930 929 929 929 929 929 929 929 929 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 16 18

對於一個訓練語音文件speaker001_00003,後面的每一個數字標示一個transition-id,同時每個數字對應一個特徵向量,對應的向量可以 copy-matrix 查看,可參考特徵提取相關內容,鏈接如下:

同樣查看 transition-id:

$ show-transitions phones.txt final.mdl

Transition-state 1: phone = sil hmm-state = 0 pdf = 0

Transition-id = 1 p = 0.966816 [self-loop]

Transition-id = 2 p = 0.01 [0 -> 1]

Transition-id = 3 p = 0.01 [0 -> 2]

Transition-id = 4 p = 0.013189 [0 -> 3]

Transition-state 2: phone = sil hmm-state = 1 pdf = 1

Transition-id = 5 p = 0.970016 [self-loop]

Transition-id = 6 p = 0.01 [1 -> 2]

Transition-id = 7 p = 0.01 [1 -> 3]

Transition-id = 8 p = 0.01 [1 -> 4]

Transition-state 3: phone = sil hmm-state = 2 pdf = 2

Transition-id = 9 p = 0.01 [2 -> 1]

Transition-id = 10 p = 0.968144 [self-loop]

Transition-id = 11 p = 0.01 [2 -> 3]

Transition-id = 12 p = 0.0118632 [2 -> 4]

Transition-state 4: phone = sil hmm-state = 3 pdf = 3

Transition-id = 13 p = 0.01 [3 -> 1]

Transition-id = 14 p = 0.01 [3 -> 2]

Transition-id = 15 p = 0.932347 [self-loop]

Transition-id = 16 p = 0.0476583 [3 -> 4]

Transition-state 5: phone = sil hmm-state = 4 pdf = 4

Transition-id = 17 p = 0.923332 [self-loop]

Transition-id = 18 p = 0.0766682 [4 -> 5]

Transition-state 6: phone = a1 hmm-state = 0 pdf = 5

Transition-id = 19 p = 0.889764 [self-loop]

Transition-id = 20 p = 0.110236 [0 -> 1]

...

唯一的Transition-state對應唯一的pdf,其下又包括多個 Transition-id,

接下來看神經網路的輸入與輸出到底是什麼。這裡以steps/nnet為例。追溯腳本到steps/nnet/train.sh,找到相關的命令:

labels_tr="ark:ali-to-pdf $alidir/final.mdl "ark:gunzip -c $alidir/ali.*.gz |" ark:- | ali-to-post ark:- ark:- |"

feats_tr="ark:copy-feats scp:$dir/train.scp ark:- |"

# input-dim,

get_dim_from=$feature_transform

num_fea=$(feat-to-dim "$feats_tr nnet-forward "$get_dim_from" ark:- ark:- |" -)

# output-dim,

num_tgt=$(hmm-info --print-args=false $alidir/final.mdl | grep pdfs | awk { print $NF } )

dnn)

utils/nnet/make_nnet_proto.py $proto_opts

$

$num_fea $num_tgt $hid_layers $hid_dim >$nnet_proto

;;

從上面關鍵的幾個神經網路的訓練的準備階段可以看出,神經網路的輸入很清楚是變換後的特徵向量(feats_tr),輸出是labels_tr,下面單獨運行上面的命令,來查看神經網路的輸出(target)是什麼。labels_tr的生成分兩步:

ali-to-pdf: 將上面對齊文件中的transition-id轉化為對應的pdf-id;

ali-to-post: 根據得到的pdf-id,生成[pdf, post]對,即pdf與其對應的後驗概率。

speaker001_00003 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 4 440 440 440 440 440 440 440 441 442 442 442 442 38 39 39 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 92 92 93 93 93 94 94 188 188 188 188 188 188 188 188 188 189 189 189 190 446 446 446 447 447 448 448 448 448 448 448 448 448 448 448 448 448 452 452 452 453 454 454 454 454 454 454 454 371 371 371 371 371 371 372 372 372 372 372 372 372 372 372 373 373 373 458 458 459 459 459 459 459 459 459 459 460 460 460 460 460 460 460 460 460 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4

觀察前兩幀,結合文章一開始,transition-id 分別為4和1,而對應的pdf均為0。對該結果再進行ali-to-post:

speaker001_00003 [ 0 1 ] [ 0 1 ] [ 0 1 ] [ 0 1 ] [ 0 1 ] [ 0 1 ] [ 0 1 ] [ 0 1 ] [ 0 1 ] [ 0 1 ] [ 0 1 ] [ 0 1 ] [ 0 1 ] [ 0 1 ] [ 0 1 ] ...... [ 3 1 ] [ 3 1 ] [ 3 1 ] [ 3 1 ] [ 4 1 ] [ 440 1 ] [ 440 1 ] [ 440 1 ] [ 440 1 ] [ 440 1 ] [ 440 1 ] [ 440 1 ] [ 441 1 ] [ 442 1 ] [ 442 1 ] [ 442 1 ] [ 442 1 ] [ 38 1 ] [ 39 1 ] [ 39 1 ] [ 40 1 ] [ 40 1 ] [ 40 1 ] [ 40 1 ] [ 40 1 ] [ 40 1 ] [ 40 1 ] [ 40 1 ] [ 40 1 ] [ 40 1 ] [ 40 1 ] [ 40 1 ] [ 40 1 ] [ 40 1 ] [ 40 1 ] [ 92 1 ] [ 92 1 ]...... [ 0 1 ] [ 0 1 ] [ 0 1 ] [ 0 1 ] [ 3 1 ] [ 4 1 ]

得到pdf-id以及相應的後驗概率,這裡均為1。

由此得到了訓練數據以及對應的target label。進一步來看神經網路的輸入與輸出的維度,網路結構被utils/nnet/make_nnet_proto.py寫到nnet_proto文件中,該Python腳本的兩個重要參數 num_fea和num_tgt分別為神經網路的輸入與輸出的維度。其中num_fea是由feat-to-dim獲得:

$ feat-to-dim scp:../tri4b_dnn/train.scp ark,t:- | grep speaker001_00003

speaker001_00003 40

這裡為fbank特徵,維度為40,而在真正作為神經網路輸入時,進一步對特徵向量進行的變換,從源碼steps/nnet/train.sh也可以看到splice參數(默認值為5),指定了對特徵向量的變換:取對應幀前後5幀,拼成一個11幀組成的大向量(維度為440)。該部分特徵變換的拓撲也被保存到final.feature_transform:

$ more final.feature_transform

440 40

[ -5 -4 -3 -2 -1 0 1 2 3 4 5 ]

後面在進行神經網路的訓練時會使用該拓撲對特徵向量進行變換,最終的神經網路輸入維度為440。

而num_tgt的維度則是通過hmm-info獲得:

$ hmm-info final.mdl

number of phones 218

number of pdfs 1026

number of transition-ids 2834

number of transition-states 1413

$ hmm-info final.mdl | grep pdfs | awk { print $NF }

1026

因此,看到神經網路的輸出維度為1026,這時查看nnet_proto:

440 1024 -2.000000 4.000000 0.037344 0.000000

1024 1024

1024 1024 -2.000000 4.000000 0.109375 0.000000

1024 1026 0.000000 0.000000 0.109322 1.000000 0.100000

1026 1026

這裡可以看到神經網路的輸入維度有40變為440,輸出為pdf的個數(對應HMM狀態的個數)。

Perform one iteration (epoch) of Neural Network training with mini-batch Stochastic Gradient Descent. The training targets are usually pdf-posteriors, prepared by ali-to-post.

繼續分析代碼,可以看到幾個關鍵步驟:

解析訓練參數,配置網路

讀取特徵向量和target label,輸入為Matrix

類型,輸出為Posterior類型,即對。

// get feature / target pair,

Matrix mat = feature_reader.Value();

Posterior targets = targets_reader.Value(utt);

隨機打亂訓練數據,作為神經網路輸入與期望輸出:

const CuMatrixBase& nnet_in = feature_randomizer.Value();

const Posterior& nnet_tgt = targets_randomizer.Value();

const Vector& frm_weights = weights_randomizer.Value();

前向傳播,計算估計值nnet_out

// forward pass,

nnet.Propagate(nnet_in, &nnet_out);

計算cost,這裡支持交叉熵和平方差和multitask。結果為obj_diff

// evaluate objective function we ve chosen,

if (objective_function == "xent") {

// gradients re-scaled by weights in Eval,

xent.Eval(frm_weights, nnet_out, nnet_tgt, &obj_diff);

} else if (objective_function == "mse") {

mse.Eval(frm_weights, nnet_out, nnet_tgt, &obj_diff);

}

根據誤差反向傳播,更新參數

if (!crossvalidate) {

// back-propagate, and do the update,

nnet.Backpropagate(obj_diff, NULL);

完成一次參數更新,繼續迭代。

total_frames += nnet_in.NumRows(),

最終由調用該部分代碼的/steps/nnet/train_scheduler.sh指定最大迭代次數max_iters或accept訓練的模型,

accepting: the loss was better, or we had fixed learn-rate, or we had fixed epoch-number

小結

在進行DNN訓練前:

訓練GMM-HMM模型,聚類,並得到音素(或狀態)的後驗。

對語音數據進行對齊,這裡得到語音文件按時間順序transition-id到幀特徵向量的對應。

生成

對作為訓練目標target

語音文件特徵向量進行變換,這裡取前後5幀,拼成一個11幀維度更高的特徵向量,作為神經網路輸入。

神經網路輸入變換後的特徵向量,通過前向傳播,經Softmax層,得到該幀特徵對應每個pdf的概率預測值。

對每個pdf根據

查到目標後驗概率,與預測值求誤差

反向傳播更新參數。

不斷迭代,直到達到最大訓練次數,或模型經過cross validation得到較低的誤差(loss)停止訓練。

解碼時,用訓練好的DNN-HMM模型,輸入幀的特徵向量,得到該幀為每個狀態(對應pdf)的概率。

其中 x_t 對應t時刻的觀測值(輸入),q_t=s_i 即表示t時刻的狀態為 s_i。p(x_t) 為該觀測值出現概率,對結果影響不大。p(s_i) 為 s_i 出現的先驗概率,可以從語料庫中統計得到。最終得到了與GMM相同的目的:HMM狀態到觀測幀特徵向量的輸出概率。就有了下面的示意圖:

雷鋒網

開發者專場 | 英偉達深度學習學院現場授課

英偉達 DLI 高級工程師現場指導,理論結合實踐,一舉入門深度學習!

課程鏈接:http://www.mooc.ai/course/90

雷鋒網版權文章,未經授權禁止轉載。詳情見轉載須知。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 推酷 的精彩文章:

富士 TIARA II,高顏值小巧的膠片隨身機
UITableViewCell 高度自適應牽扯出的若干問題
喜歡的人開始秒回微信,卻發現所有話題都很快被聊死
C#的「友元」類實現 Builder 模式
即學即用,網頁首屏頁面7種吸睛的設計方法

TAG:推酷 |

您可能感興趣

解讀谷歌最強NLP模型BERT:模型、數據和訓練
NVIDIA 遷移學習工具包:用於特定領域深度學習模型快速訓練的高級SDK
NLP預訓練模型大集合
NLP預訓練模型大集合!
如何用最強模型BERT做NLP遷移學習?
AWS發布Neo-AI開源項目,可訓練跨平台的機器學習模型
DIKW模型與數據工程
西北大學:RNN語言模型的重要訓練數據抽樣
Google 最強開源模型 BERT 在 NLP 中的應用 | 技術頭條
Creo 的模型應用
NLP之詞袋模型和TF-IDF模型
機器學習SVM模型分類技術應用
谷歌最強 NLP 模型 BERT 解讀
從VGG到ResNet,你想要的MXNet預訓練模型輕鬆學
如何用 Python 和機器學習訓練中文文本情感分類模型?
圖解當前最強語言模型BERT:NLP是如何攻克遷移學習的?
解密谷歌Gmail新功能:結合BoW模型和RNN-LM,幫助用戶快速寫郵件
介紹一種訓練模式——IFT模型
KISS原則在訂單裝運模型中的應用
深度學習新應用:在PyTorch中用單個2D圖像創建3D模型