音声認識メモ(HMM)その5(HTK HERestコマンド(2))

HMMは2種類の確率を持つ。

  • 遷移確率(transition probabilities)
  • 出力確率(output probabilities)

出力確率は、HTK Bookの数式を見ていてもイメージがわきにくかったので、まとめてみた。

パラメータを「NUMCEPS = 12」、「MFCC_D_A_0」で与えた時、HMMにおける39個(=(12+1)*3)の各値が示す内容は以下のようになる。

-------------------------------- Observation Structure -------------------------------
  MFCC-1  MFCC-2  MFCC-3  MFCC-4  MFCC-5  MFCC-6  MFCC-7  MFCC-8  MFCC-9 MFCC-10
  MFCC-11 MFCC-12      C0   Del-1   Del-2   Del-3   Del-4   Del-5   Del-6   Del-7
  Del-8   Del-9  Del-10  Del-11  Del-12   DelC0   Acc-1   Acc-2   Acc-3   Acc-4
  Acc-5   Acc-6   Acc-7   Acc-8   Acc-9  Acc-10  Acc-11  Acc-12   AccC0

また、一例として、HCompVコマンドで生成した初期モデルが以下のとおりであったとする。

~o
<STREAMINFO> 1 39
<VECSIZE> 39<NULLD><MFCC_D_A_0><DIAGC>
~h "proto"
<BEGINHMM>
<NUMSTATES> 5
<STATE> 2
<MEAN> 39
 -7.092237e+00 -3.793652e+00 -7.671155e-01 -2.177134e+00 -5.022529e+00 1.197599e+00 1.391658e+00 -4.522811e+00 2.475666e+00 -3.983630e+00 5.284266e-01 -1.634990e+00 4.749557e+01 -4.500959e-03 3.395595e-02 -3.449689e-03 -3.757998e-03 3.827242e-02 -1.681405e-03 1.282120e-02 1.411823e-02 -3.382706e-02 1.359682e-02 1.815424e-02 -5.942781e-03 -3.426783e-02 2.786980e-04 1.465090e-03 1.092864e-04 -1.989758e-05 1.961447e-03 2.404057e-03 1.864515e-03 -2.342970e-03 -1.394336e-03 1.911470e-03 -1.182858e-03 -6.819504e-04 -7.749228e-04
<VARIANCE> 39
 8.820943e+01 3.861458e+01 2.029625e+01 4.565988e+01 5.828498e+01 3.247619e+01 2.395605e+01 2.902121e+01 4.258837e+01 3.167321e+01 1.901695e+01 1.848357e+01 1.582491e+02 2.507793e+00 1.302295e+00 1.097857e+00 1.644960e+00 1.892603e+00 2.083208e+00 1.524675e+00 1.840137e+00 2.125722e+00 1.673089e+00 1.448895e+00 1.457264e+00 1.123323e+00 3.027864e-01 2.330465e-01 1.922042e-01 2.741396e-01 3.304867e-01 3.573498e-01 2.958795e-01 3.398049e-01 3.900207e-01 3.005882e-01 2.781184e-01 2.784989e-01 1.345709e-01
<GCONST> 1.084410e+02
<STATE> 3
(省略、STATE2と同じ)
<STATE> 4
(省略、STATE2と同じ)
<TRANSP> 5
(省略)
<ENDHMM>

"MFCC-1"を例にすると、

  • 平均:-7.092237e+00
  • 分散:8.820943e+01

正規分布(Gaussian distribution、ガウス分布)の確率密度関数に従うことを示している。
f:id:ichou1:20171123124926p:plain

正規分布確率密度関数は平均と分散の2つを与えれば求まり、Rでプロットしたグラフは次のようになる。

curve(dnorm(x, -7.092237, sqrt(88.20943)), -15, 1, col="blue")

f:id:ichou1:20171123120016p:plain

ある時間における"MFCC-1"の値が「-12.438」だったとすると、その出力確率は「3.61%」となる。

> dnorm(-12.438, mean=-7.092237, sd=sqrt(88.20943))
[1] 0.03612463

これを39個全部、掛けあわせたものが、ある時間における特徴量(MFCC)の出力確率になる。

小数点を掛けあわせていくとアンダーフローを引き起こすので、

0.03 * 0.06 * .... 

対数を計算する(対数をとっても大小関係が変わらない性質を利用する)。

 log(0.03 * 0.06 * .... )
= log(0.03) + log(0.06) + ....

実際の計算を示す。
ある時間における特徴量(MFCC)が以下の時、

  -12.438  -3.049  -4.389  -1.899   2.578  -5.795  -3.100  -3.889  -4.516  -1.362
     2.812  -9.024  36.115  -0.607  -0.962  -0.332   0.013  -0.139  -2.087  -1.590
    -1.025  -1.040   0.152   0.350   0.315  -0.158  -0.036  -0.210  -0.091   0.040
    -0.131  -0.440  -0.371  -0.222   0.068   0.118   0.333   0.534   0.027

モデルにあてはめた、ある時間における特徴量の出力確率(の対数をとったもの)は次のようになる。

log( dnorm(-12.4380102    , mean=-7.092237e+00 , sd=sqrt(8.820943e+01)) ) +
log( dnorm( -3.04935169   , mean=-3.793652e+00 , sd=sqrt(3.861458e+01)) ) +
log( dnorm( -4.38874006   , mena=-7.671155e-01 , sd=sqrt(2.029625e+01)) ) +
(途中省略)
log( dnorm( 0.0265753511  , mean=-7.749228e-04 , sd=sqrt(1.345709e-01)) )
[1] -63.58353

これを確率に直すと、

> exp(-63.58353)
[1] 2.432337e-28