轉自:http://blog.csdn.net/xmdxcsj/article/details/54695506html
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的大小。大數據
reference
http://kaldi-asr.org/doc/dnn.html優化