[轉]kaldi 神經網絡

轉自: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優化

相關文章
相關標籤/搜索