音声認識メモ(Kaldi)その10(入力層 Karel's DNN)

入力層の構成を掘り下げてみる。

特徴量(MFCC)に対して変換を実行したもので、仮にMFCCが13次元、198フレームだとすると、変換後は143次元、198フレームになる(spliceは「5」を想定、詳細は前回を参照)。

splice5.proto
<Splice> <InputDim> 13 <OutputDim> 143 <BuildVector> -5:5 </BuildVector>

続けて、spliceした結果を正規化(CMVN、Cepstral mean and variance normalization)する。

まず、正規化のための統計をとる。
「featbin/compute-cmvn-stats」コマンドを実行。
この時、第2引数(WriteSpecifier)には"ark:"を付けない(付けると、発話ごとのIDが付与されるが、後続の「nnetbin/cmvn-to-nnet」コマンド実行時に入力エラーになる)

featbin/compute-cmvn-stats ark:mosimosi_splice.ark mosimosi_splice.stat
[インプット] mosimosi_splice.ark (198row x 143col)
utterance_id_001  [
  62.45969 6.921756 -3.167147 <snip> 7.116017 3.814293 -11.61487 
  <snip>
  43.7294 -12.57844 0.5020582 <snip> -4.028705 9.270482 -15.07414 ]

<snip>は省略の意味で使用

[アウトプット] mosimosi_splice.stat (2row x 144col)
[ 13006.95 -1868.364 -2065.489 <snip> -1037.709 1670.101 -1622.727 1103.897 -185.1455 198 
  917240.7 94988.03 56884.15 15132.56 <snip> 48641.36 32924.85 17136.12 17641.37 0 ]

1行目は平均を求めるためのもので、列(次元)ごとに、値を足しあわせたもの。最後尾はフレーム数を示す。
2行目は分散を求めるためのもので、列(次元)ごとに、値を2乗したものを足しあわせたもの。
今回は、1ファイルしかないが、複数ファイルの場合は、単純に全て足し合わせる。

続けて、「nnetbin/cmvn-to-nnet」コマンドを実行して、Nnet形式に変換する。

nnetbin/cmvn-to-nnet mosimosi_splice.stat mosimosi_splice.nnet
[アウトプット] mosimosi_splice.nnet
<Nnet> 
<AddShift> 143 143 
<LearnRateCoef> 0  [ -65.69 9.43 10.43 <snip> 8.19 -5.57 0.93 ]
<!EndOfComponent> 
<Rescale> 143 143 
<LearnRateCoef> 0  [ 0.05 0.05 0.07 <snip> 0.10 0.13 0.10 ]
<!EndOfComponent> 
</Nnet> 

「AddShift」は、統計の平均(例えば、1列目なら13006.95 / 198 = 65.69)にマイナスを掛けたもの。
「Rescale」は、統計の分散に対して、以下の計算を実行したもの。

標準偏差 / (( 分散 / フレーム数 ) - (平均の2乗))の平方根

標準偏差はデフォルトで「1」で、例えば1列目なら、

1 / sqrt((( 917240.7 / 198 ) - (65.69 * 65.69)))
= 1 / sqrt(317.3)
= 1 / 17.80
= 0.0561

続けて、「nnetbin/nnet-concat」コマンドで、spliceに関するNnet

tr_splice5.nnet
<Nnet> 
<Splice> 143 13 
[ -5 -4 -3 -2 -1 0 1 2 3 4 5 ]
<!EndOfComponent> 
</Nnet> 

と結合する。

nnetbin/nnet-concat tr_splice5.nnet mosimosi_splice.nnet "アウトトップととなるNnet名" 

これが、「nnetbin/nnet-forward」コマンドや「nnetbin/nnet-train-frmshuff」コマンドの「--feature-transform」オプションで渡す特徴量変換のパラメータになる。

(参考)パラメータを「nnetbin/nnet-info」コマンドで表示

num-components 3
input-dim 13
output-dim 143
number-of-parameters 0.000286 millions
component 1 : <Splice>, input-dim 13, output-dim 143, 
  frame_offsets [ -5 -4 -3 -2 -1 0 1 2 3 4 5 ]
component 2 : <AddShift>, input-dim 143, output-dim 143, 
  shift_data ( min -65.6917, max 10.6742, mean -2.88202, stddev 19.0171, skewness -2.61368, kurtosis 5.95439 ) , lr-coef 0
component 3 : <Rescale>, input-dim 143, output-dim 143, 
  scale_data ( min 0.0505918, max 0.134276, mean 0.0879972, stddev 0.0225562, skewness 0.214666, kurtosis -0.551825 ) , lr-coef 0