轉自:http://blog.csdn.net/xmdxcsj/article/details/54695506
overview
type | author | CPU/GPU | feature |
---|---|---|---|
nnet1 | Karel | GPU單卡訓練 | 使用pre-training,使用early stopping |
nnet2 | Dan | 支持多GPU訓練,以及多CPU多線程 | 使用固定epoch個數,最后幾個epoch參數平均 |
nnet3 | Dan | 是nnet2的擴展 | 支持更多的網絡類型(比如RNN/LSTM) |
Karel’s DNN和Dan’s DNN格式不兼容,可以使用egs/rm/s5/local/run_dnn_convert_nnet2.sh進行格式轉化。
nnet1
訓練流程
- steps/nnet/make_fmllr_feats.sh
獲取特征 - steps/nnet/pretrain_dbn.sh
rbm預訓練 - steps/nnet/train.sh
使用mini-batch SGD進行訓練 - steps/nnet/train_mpe.sh
sMBR序列區分性訓練,學習率固定設為1e-5,訓練3-5epoch;在第一個epoch以后重新產生lattice可以更快的收斂;計算准確率的時候排除silience幀。
nnet2
訓練流程
- initialization
使用nnet-am-init讀取配置文件 - training
使用nnet-train-parallel訓練,使用參數平均的並行訓練方式,結合preconditioned SGD訓練。 - final model combination
將最后幾個(比如20)iteration的模型按照一定比例combine得到最后的model。具體做法:每個模型的每個component的weight作為學習的對象,然后使用訓練數據的子集,結合傳統的目標函數,優化方法使用L-BFGS。 - mixing-up
假設最后輸出的目標個數為1483,而網絡的softmax層節點的個數卻為4000(大於輸出個數),需要將softmax的輸出進行group(一般大小設為1-6)作為最后的輸出目標。 - shrinking和fixing
p-norm網絡不使用,一般用在tanh網絡或者包含sigmoid激活函數的網絡。詳細介紹參考這篇文章
shrinking是指對網絡不通layer的參數進行scale,scale的參數由訓練數據的非線性優化獲得。因為一般scale的參數小於1,所以稱之為shrinking。
fixing目的是為了解決訓練過程中神經元over-saturated問題:即神經元的導數值小於特定門限(比如0.1),此時需要減小weight和bias。
訓練參數
-
job number
一般GPU設為4,CPU設為8或者16,因為GPU的訓練速度比CPU快20%到50%。
minibatch的大小跟-num-jobs-nnet有關,如果使用多線程(比如n個線程)更新參數的方式,那么minibatch size相當於變成了原來的n倍。
學習率的設置跟-num-jobs-nnet有關,如果我們jobs變為原來的n倍,那么學習率也要變為原來的n倍。因為並行使用的是n個模型參數平均的方式。但是學習率不能設置過大,否者會引起訓練的不穩定。 -
隱層數量
一般tanh網絡是2到5層,p-norm網絡是2到4層,增加層數的時候一般保持節點數不變 - 節點數
一般是512/1024/2048,一般1024的網絡就比較大了,最多是2048。和訓練數據量的增加成二次關系,比如數據量變為原來的10倍,節點數變為原來的2倍。 - 學習率
小數據量(幾個小時)的初始值和結束值分為設為0.04和0.004;數據量變大以后,學習率要調低。
可以通過繪制目標函數和時間的關系圖來判斷學習率是否合適。如果學習率太大,一開始目標函數值提升很快,但是最終值缺不理想,或者發生震盪,目標函數值突然變得很差;如果學習率太小,需要花費很長的時間才能獲得最優值。
一般來說網絡的最后兩層參數學習的速度更快,可以通過–final-learning-rate-factor參數(比如0.5)使得最后兩層學習率衰減。 - minibatch size
數值越大訓練速度越快,但是數值過大會引起訓練的不穩定性。一般設為2的倍數,多線程CPU設為128,GPU設為512. - max-change
訓練的時候如果學習率設置太大,將會導致參數變化量過大,引起訓練不穩定。該參數的設置為參數的變化量設定一個上限。當minibatch大小為512,max-change設為40,minibatch大小為128,max-change設為10,max-change和minibatch的大小成正比。 - epoch個數
兩個參數–num-epochs(一般15)和–num-epochs-extra(一般5)設置,從0到–num-epochs之間學習率會衰減,最后的–num-epochs-extra學習率保持不變。小數據量一般設置更多的epoch(20+5),大數據量設置更少的epoch。 - feature splice width
對於MFCC+splice+LDA+MLLT+fMLLR這種經過特殊處理的特征,一般設為4,因為LDA+MLLT已經是基於spliced(3或者4)的特征了;對於原始的MFCC/fbank特征,一般設為5。
如果數值設置的更大,對於幀准確率是有益的,但是對於語音識別卻是有損的。或許是因為違反了HMM幀獨立性的假設。
preconditioned SGD
相比於傳統的SGD使用標量作為學習率(即所有的參數使用的學習率都是一樣的),preconditioned SGD使用矩陣形式的學習率,學習率矩陣每一個minibatch更新一次。這樣做的出發點在於減小方差比較大的維度對應參數的學習率,以控制訓練的不穩定性以及避免在某個方向上面參數變動太快。
異常處理
當訓練發散時,降低學習率,或者減小minibatch的大小。