音声認識メモ(Kaldi)その20(トレーニング Dan's DNN(nnet2))
nnet2での学習の流れを追ってみる。
今回は、活性化関数に「tanh」を使った「nnet4c」を対象とした。
${KALDI_ROOT}/egs/rm/s5/local/nnet2/run_4c.sh
# for CPU only (with --use-gpu false). steps/nnet2/train_tanh_fast.sh \ --stage -10 \ --minibatch-size 128 \ --num-epochs 20 \ --add-layers-period 1 \ --num-hidden-layers 2 \ --mix-up 4000 \ --initial-learning-rate 0.02 \ --final-learning-rate 0.004 \ --hidden-layer-dim 375 \ data/train \ # <data> data/lang \ # <lang> exp/tri3b_ali \ # <ali-dir> exp/nnet4c_manual # <exp-dir>
内部処理の確認。
stage: -4
steps/nnet2/get_lda.sh \ --transform-dir exp/tri3b_ali \ --splice-width 4 \ data/train \ data/lang \ exp/tri3b_ali \ exp/nnet4c
stage: -3
トレーニングデータを"validation"用と"training"用に分ける。
steps/nnet2/get_egs.sh \ --transform-dir exp/tri3b_ali \ --splice-width 4 \ --stage 0 \ data/train \ data/lang \ exp/tri3b_ali \ exp/nnet4c
stage: -2
初期モデルを作成。
nnet-am-init \ exp/tri3b_ali/tree \ data/lang/topo \ 'nnet-init exp/nnet4c/nnet.config -|' \ exp/nnet4c/0.mdl
==>モデルのComponent数は「6」
Splice / FixedAffine / AffinePre / Tanh / AffinePre / Softmax
"AffinePre"は"AffineComponentPreconditionedOnline"の略
stage: -1
transition probabilities(遷移確率)の更新
nnet-train-transitions \ exp/nnet4c/0.mdl \ 'ark:gunzip -c exp/tri3b_ali/ali.*.gz|' \ exp/nnet4c/0.mdl
ここから、ループする。
ループ回数は「25」($num_epochs + $num_epochs_extra)。
- カウンタが「1」で隠れ層の追加
==> モデルのComponent数が「8」になる("Tanh"と"AffinePre"を追加)
Splice / FixedAffine / AffinePre / Tanh / AffinePre / Tanh / AffinePre / Softmax
- カウンタが「13」でmixup
==> モデルのComponent数が「9」になる("SumGroup"を追加)
Splice / Fixed Affine / AffinePre / Tanh / AffinePre / Tanh / AffinePre / Softmax / SumGroup
ループの各段階でやっていることを書き出してみると下表のとおり。
mixup後のモデルを使って「final.mdl」を生成する。
nnet-combine-fast \ exp/nnet4c/14.mdl \ exp/nnet4c/15.mdl \ <snip> \ exp/nnet4c/25.mdl \ ark:exp/nnet4c/egs/combine.egs \ # <valid-examples-in> exp/nnet4c/final.mdl