音声認識メモ(Kaldi)その13(特徴量変換 Dan's DNN(nnet2))

Dan氏による実装版(nnet2)の中身を見てみる。

公式ドキュメントの説明によると、インプットとなる特徴量(MFCC)に対して、次の変換を行うとある。
Dan氏の論文でいうところの、baseline/Type I featuresにあたるようだ。

  • splice
  • LDA(linear discriminant Analysis;線形判別分析)
  • MLLT(maximum likelihood linear transform;最尤線形変換)/ global STC(semi-tied covariance;半結合共分散)
  • fMLLR(feature space maximum likelihood linear regression;最尤線形回帰)


論文では4パターンについてword error rate (WER) を比較しており、もっともパフォーマンスが良かったのが以下のパターン。

The Type-IV features consist of our baseline 40-dimensional speaker adapted features that have been spliced again,followed by de-correlation and dimensionality reduction using another LDA.

baselineとなる特徴量に対し、さらにspliceを適用し、(2度目の)LDA変換を適用する。

2度目のLDA変換については、Neural Networkモデルの"FixedAffineComponent"の部分に該当する。
この部分はトレーニングの過程で更新されない(fixed in advance and not trainable)

モデル(抜粋)
<Nnet> <NumComponents> 7 <Components> 
<SpliceComponent> 
    <InputDim> 40 <Context> [ -4 -3 -2 -1 0 1 2 3 4 ] <ConstComponentDim> 0
</SpliceComponent> 
<FixedAffineComponent> 
    <LinearParams>
    [ 0.1481841 0.1649369 (snip)
      (snip)
      -0.0002072983 0.0001211765 (snip) ]
    <BiasParams>
    [ 7.769857 5.612672 (snip) ]
</FixedAffineComponent> 
(snip)
</Components> </Nnet>

仮に、baselineとなる特徴量が「40」次元だったとすると、2度目のsplice後は「360次元」(40 x 9フレーム)
2度目のLDA変換を次元削減無しで実行した場合、”LinearParams”パラメータは「360row x 360col」、"BiasParams"パラメータは「1row x 360col」となる。

LDA変換用データは「steps/nnet2/get_lda.sh」内部でコールされる「src/nnet2bin/nnet-get-feature-transform」コマンドで生成する。

Get feature-projection transform using stats obtained with acc-lda.
See comments in the code of nnet2/get-feature-transform.h for more information.
Usage:  nnet-get-feature-transform [options] <matrix-out> <lda-acc-1> <lda-acc-2> ...

ここで、LDAは次元削減(reduce the dimensionality)のためでなく、無相関化(decorrelated the data)のために実施するとある。

ラッパースクリプト「steps/nnet2/get_lda.sh」を見ても、デフォルトで次元削減は行わないようになっている。

lda_dim=  # This defaults to no dimension reduction.

論文にもあるとおり、DNNトレーニングのインプットとしては、次元削減よりも白色化の方が有益であるらしい。