音声認識メモ(Kaldi)その8(training Karel's DNN)
DNNモデルの学習過程をトレースしてみる。
学習には「nnetbin/nnet-train-frmshuff」コマンドを使う。
nnetbin/nnet-train-frmshuff \ --minibatch-size=128 \ --randomize=false \ scp:train/feats.scp \ <--inputとなる特徴量 ark:mosimosi_ali2post.ark \ <-- 正解 nnet.init \ <-- モデル dbn_dnn_iter1 <--更新後のモデル
オプションとして以下を指定。処理の流れを確認することが目的なので、randomizeはオフにしている。
- mini-batchのサイズは「128」(=2の7乗、198フレームに対する網羅率は約65%)
- randomizeは使用しない(インプットとなるMFCCのフレームをshuffleしない)
初期モデル(nnet.init)は以下の条件で作成。
- 入力層 : 13 (MFCC13次元)
- 出力層 : 6 (pdf-idの数)
- 隠れ層(中間層)の数 : 1
- 隠れ層のニューロン数 : 256
Propagate(Forward)の流れは下図のとおり。
図中の意味
- mini : mini-batch size(今回の例では「128」)
- prop_buf : forward-pass buffers
- transpose : 転置行列を使用
図中の"prop_buf[5]"が出力層における活性化関数(softmax)の出力となる。
値は以下のとおりであった。各フレームで最も確率が高いものを緑枠、正解に該当するものを赤枠で囲んでいる。
()はphone symbolを表す
なお、正解となるMatrixは下図のとおり。
これは"bin/ali-to-post"コマンドの出力結果である"mosimosi_ali2post.ark"より生成する。
mosimosi_ali2post.ark
utterance_id_001 [ 3 1 ] [ 3 1 ] [ 3 1 ] [ 3 1 ] [ 3 1 ] ...(以降193個省略)
2つのMatrixの差をとる。
これが、バックプロパゲーションのインプットになる。
Propagate(backward)の流れは下図のとおり(2つのMatrixの差をとったものは"backprop_buf[5]"に該当)
図中の意味
- backprop_buf : backward-pass buffers
モデルのパラメータ更新に使用する勾配を求める。
図中の意味
- linearity_corr_ : gradient(勾配)
勾配
これに学習率「0.008」を掛けたものを更新前パラメータから引いて、パラメータを更新する。
パラメータ(更新前)
パラメータ(更新後)