ichou1のブログ

主に音声認識、時々、データ分析のことを書く

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

「forward-backward」(またはalpha-beta)アルゴリズムの後ろ向き確率が求まったら、
続けて前向き確率を求める。

t=2において、ラベル1の状態2にいる確率(下図の赤枠)は

f:id:ichou1:20171125182048p:plain

①(t=1でラベル1の状態2にいる確率) * ②(遷移確率) * ③(出力確率)

により求まる。

log ( ① * ② * ③ )
= log( ① ) + log( ② ) + log( ③ )
= (-76.116) + log( 0.6 ) + (-83.129)
= (-76.116) + (-0.510) + (-83.129)
= -159.757

これに、後ろ向きにより求めた、t=2において、ラベル1の状態2にいる確率を掛け合わせて対数をとる。

log ( 前向き確率 * 後ろ向き確率 )
= log( 前向き確率) + log( 後ろ向き確率 )
= (-159.757) + ( -15460.627 )
= -15620.384

後ろ向きにより求めたベストパス(t=1において、ラベル1の状態1にいる確率)との比を求める。

log( ( 前向き確率 + 後ろ向き確率 ) / ( 後ろ向きベストパスの確率 ) )
= log( 前向き確率 + 後ろ向き確率 ) - log( 後ろ向きベストパスの確率 )
= ( -15460.384 ) - (-15620.139)
= 0.245

これを確率に直し、「t=2でラベル1の状態2にいる確率」を求める。

exp(-0.245)
= 0.782


同様に、t=2において、ラベル1の状態3にいる確率(下図の赤枠)は

f:id:ichou1:20171125182203p:plain

log ( ① * ② * ③ )
= log( ① ) + log( ② ) + log( ③ )
= (-76.116) + log( 0.4 ) + (-83.129)
= (-76.116) + (-0.916) + (-83.129)
= -160.162

後ろ向きにより求めた、t=2において、ラベル1の状態3にいる確率を掛け合わせて対数をとり、

log ( 前向き確率 * 後ろ向き確率 )
= log( 前向き確率) + log( 後ろ向き確率 )
= (-160.162) + ( -15461.502 )
= -15621.664

後ろ向きにより求めたベストパス(t=1において、ラベル1の状態1にいる確率)との比を求める。

log( ( 前向き確率 + 後ろ向き確率 ) / ( 後ろ向きベストパスの確率 ) )
= log( 前向き確率 + 後ろ向き確率 ) - log( 後ろ向きベストパスの確率 )
= ( -15621.664 ) - (-15620.139)
= -1.525

これを確率に直し、「t=2でラベル1の状態3にいる確率」を求める。

exp(-1.525)
= 0.217

これを繰り返すことで、ある時間における、各ラベル、各状態の確率が求まる。
(ある時間における確率の総和は1)

これを全時間に対して求めると、各ラベル、各状態のoccupation probability(占有確率:状態を専有する確率)が求まる。

f:id:ichou1:20171127204410p:plain

例えば、ラベルq=1の状態2の占有確率は「4.55574036」で、全体に占める割合は、

4.55574036 / 198
= 0.023

「2.3」%となる。

占有確率をもとに、HMMにおける平均、分散、遷移確率を更新する。

モデルの平均の更新

以下、「モデルにおけるMFCC-1の平均」を更新する例。
f:id:ichou1:20171127212052p:plain

1. 「ある時間における観測値」と「モデルの平均」の差(zmean)を求める
2. 「ある時間における確率」(Lr)を掛け合わせたもの(zmean*Lr)を合計する(上図例では「7.013」)

3. (zmean*Lr)の合計を占有確率で割った値を求める
f:id:ichou1:20171127213536p:plain

4.「モデルにおけるMFCC-1の平均」(更新前)に足し合わせる

「モデルにおけるMFCC-1の平均」(更新前) + 1.53958738
= -7.092237 + 1.53958738
= -5.5526495

これが、更新後の値となる。

モデルの分散の更新

以下、「モデルにおけるMFCC-1の分散」を更新する例。
モデルの分散(更新前)は使わない。
f:id:ichou1:20171217092827p:plain

1. 「ある時間における観測値」と「モデルの平均」の差(zmean)の2乗を求める
2. 「ある時間における確率」(Lr)を掛け合わせたもの(zmean*zmean*Lr)を合計する(上図例では「75.579」)

3. (zmean*zmean*Lr)の合計を占有確率で割った値を求める
f:id:ichou1:20171217090424p:plain

4.平均の項で求めた、(zmean*Lr)の合計を占有確率で割った値(今回の例では1.539)の2乗を、3.で求めた値から引く

16.589 - (1.539)^2 
= 14.219

これが、更新後の値となる。

モデルの遷移確率の更新

ある時間における遷移確率の合計を、占有確率で割る。
「x」はベストパスとの差(対数での値)。時間が経つほど乖離が大きくなる(確率として低くなる)。
exp(x)は確率に換算した値(0から1の範囲をとる)
f:id:ichou1:20171217114023p:plain
青枠の和(0.611 + 0.170)=緑枠(0.782)が成立する。

state2からstate2へ遷移する確率は、

3.555 / 4.555
= 0.780

state2からstate3へ遷移する確率は、

1.000 / 4.555
= 0.219

これが更新後の値となる。