[轉]kaldi 神經網絡


轉自: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的大小。

reference

http://kaldi-asr.org/doc/dnn.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM