kaldi 神經網絡


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章