音声認識メモ(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)の流れは下図のとおり。

f:id:ichou1:20180401223200p:plain
図中の意味

  • mini : mini-batch size(今回の例では「128」)
  • prop_buf : forward-pass buffers
  • transpose : 転置行列を使用

図中の"prop_buf[5]"が出力層における活性化関数(softmax)の出力となる。
値は以下のとおりであった。各フレームで最も確率が高いものを緑枠、正解に該当するものを赤枠で囲んでいる。
f:id:ichou1:20180402191516p:plain
()はphone symbolを表す

なお、正解となるMatrixは下図のとおり。
f:id:ichou1:20180402192938p:plain

これは"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の差をとる。
f:id:ichou1:20180402194643p:plain

これが、バックプロパゲーションのインプットになる。

Propagate(backward)の流れは下図のとおり(2つのMatrixの差をとったものは"backprop_buf[5]"に該当)
f:id:ichou1:20180402195305p:plain
図中の意味

  • backprop_buf : backward-pass buffers

モデルのパラメータ更新に使用する勾配を求める。
f:id:ichou1:20180402201636p:plain
図中の意味

  • linearity_corr_ : gradient(勾配)
勾配

f:id:ichou1:20180402213151p:plain

これに学習率「0.008」を掛けたものを更新前パラメータから引いて、パラメータを更新する。

パラメータ(更新前)

f:id:ichou1:20180402213407p:plain

パラメータ(更新後)

f:id:ichou1:20180402213422p:plain