音声認識メモ(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、ガウス分布)の確率密度関数に従うことを示している。
正規分布の確率密度関数は平均と分散の2つを与えれば求まり、Rでプロットしたグラフは次のようになる。
curve(dnorm(x, -7.092237, sqrt(88.20943)), -15, 1, col="blue")
ある時間における"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