音声認識メモ(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