Uncertainty decoding

耐雑音音声認識において,モデルベースの手法と特徴量ベースの手法では,
一般的に性能面はモデルベースの勝ち,計算量は特徴量ベースの勝ちです.
今日は,特徴量ベースの手法を計算量はそのままモデルベースの性能に近づけることができる, uncertainty decoding(UD)を紹介します.


クリーン音声特徴量を x,雑音で劣化した音声特徴量を y とします.
まずは通常通り,音響モデルとしてクリーン音声の GMM-HMM を学習しておきます.
すると,以下のようなガウス分布が沢山学習されることになります.
 p(x|m) = \mathcal{N}(x; \mu_m, \Sigma_m)
 m はある音響イベントに対応する GMM に含まれる一つのガウス分布のインデックスです.
この他に,GMM の重みと HMM の遷移確率も学習されます.
HTK とかで学習した hmmdefs ファイルをみると,実際沢山の正規分布,GMM の重み,遷移確率が並んでいることが分かると思います.


今我々は,y のみしか観測できないので, p(y|m) を計算しなくてはなりません.
GMM の重みと HMM の遷移確率は,雑音が重畳しても変わらないとすれば,
p(y|m) さえ求まれば,あとは普通に音声認識のデコーディングを行うことができます.
ただ,p(y|m) の計算は大量にでてくるので,計算コストが低いことも重要です.
そのため現実的には,p(y|m)正規分布として近似することになります.
以下,この p(y|m) をどうやって計算するか,というお話になります.


我々は既に p(x|m) を学習して持っているので,p(y|m)p(x|m) を含むように展開します.
 p(y|m) = \int p(y,x|m) dx = \int p(y|x,m) p(x|m) dx


突然ですが,ここで,あるある式展開を紹介します.以下の式は恒等的に成り立ちます.
 \mathcal{N}(a;b,\Sigma) = \mathcal{N}(b;a,\Sigma)
ガウス分布の変数と平均を入れ替えても式自体は変わらない.ガウス分布の定義より,明らか.
 \int \mathcal{N}(x;a,\Sigma_a) \mathcal{N}(x;b,\Sigma_b) dx =  \mathcal{N}(a;b,\Sigma_a+\Sigma_b)
→証明するには,exp の肩の部分を平方完成して「ガウス分布の全積分は1」を使えばよい


この「あるある式展開」を考慮してもう一度先の式に戻ると,p(x|m)正規分布だったので,
もし  p(y|x,m)x を変数or平均とする正規分布として表現されていれば,
p(y|m)正規分布として計算できることになります.
以下,p(y|x,m)x を変数or平均とする正規分布としてどう計算するか,という話になります.


Uncertainty decoding では,まず最初に,以下の重要な近似を使います.
p(y|x,m) \simeq p(y|x)
すなわち,x にノイズがのって y になる過程は,音響モデルに依存しない!という仮定です.
この近似を導入することにより,計算量は劇的に減ります.
m は音響モデルに含まれるガウス分布の数分あるので,
例えば 2000 状態 16 混合の GMM-HMM なら,単純に考えても 1/32000 に計算量が減らせます.
以下,p(y|x)x を変数or平均とする正規分布としてどう計算するか,という話になります.


p(y|x) の計算方法には,いろいろやり方があります.
昨日 SPLICE について書いたので,まずは SPLICE を使った UD について述べます.
論文はこちら.UD が初めて提案されたのも,この論文です.
http://research.microsoft.com/pubs/63614/2002-droppo-icassp.pdf


UD with SPLICE では,p(y|x) を以下のように展開します.
p(y|x) = \frac{ p(x|y) p(y)}{ p(x) }
これで,p(x|y)p(y)p(x) を計算すればよくなりました.
以下,それぞれの計算について述べます.


まず,p(x|y) について.
SPLICE なので,区分線形変換で yx に変換する以下の式を使います.
p(x|y) = \sum_k p(x|y,k) p(k)
通常の SPLICE の枠組みで,ステレオデータ使えば,
p(x|y,k)正規分布とした場合の平均値を学習することができます.
p(x|y,k) の分散については,平均値と同様,重み付き最小二乗誤差基準で学習できます.
論文でいうと,式 (5) です.
(論文は例によってバイアス項 b_k のみを使う場合しか書いていないです.A_k を使う場合は…後日.)


次に,p(y) について.
これは,p(y) = \sum_k p(y|k) p(k) なので,
SPLICE で利用する y の GMM から簡単に計算できます.


最後に,p(x) について.これが,厄介です.単純には計算できません.
今回,p(y|x)ガウス分布でないといけなかったので,
p(x)ガウス分布である!と仮定します.(本当は GMM などで近似されるものなので,この仮定はおかしい.)


計算は,以下のように進みます.
 p(x) \simeq \sum_k p(x|k) p(k) = \sum_k \int p(x,y|k) p(k) dy = \sum_k \int p(x|y,k) p(y|k) p(k) dy
ここで p(x|y,k), p(y|k), p(k) はすべて既知なので,計算可能で,
それらは y を変数とする正規分布なので,積分もできます.
しかし,\sum_k が残ってしまうので,GMM となってしまいます.
そこで,この GMM の平均/分散を,p(k) をつかって重み付け平均のような形で無理やり近似します.
このきちゃない近似は論文を参照してください.


ここまでできれば,p(y|x),ひいては最終的に欲しかった p(y|m) が,ガウス分布として計算できることになります.
しかも,p(y|x,m) を音響モデルに依存させない近似のおかげで,計算量は通常の SPLICE からほとんど変わりません.
ただし,p(x) を無理やりガウス分布で近似するせいで,不整合がおこる部分もあります.


気になる UD with SPLICE の精度は,普通に SPLICE から良くなっています.
論文では,AURORA2 の set A の平均で,
単語正答率 SPLICE:88.21% から UD w/ SPLICE:90.63% となっています.
結構いい認識率です.
また論文では,noise mean normalization- (NMN-) SPLICE や CMN を使っても,
同様に UD ができる,としています(この結果は NMN も CMN もしていない).
これらを考慮すると,さらに率を改善する余地が残されているように思います.


さて,ここまで UD with SPLICE を紹介しましたが,
p(x) を無理やり正規分布で近似するという強引な近似が含まれていました.
別の方法を用いると,実は UD with SPLICE よりましな近似で p(y|x) を計算することができます.
これが,joint uncertainty decoding (JUD) です.
http://www.sciencedirect.com/science/article/pii/S0167639307001720


JUD でも,p(y|x) を使う部分までの式展開は同じです.
JUD では,p(y|x) を以下のように近似します.
p(y|x) \simeq \sum_k p(y,k|x) = \sum_k p(y|x,k) p(k|x)
この近似は,x の GMM と y の GMM のインデックスは共通であるといった近似です.


p(y|x,k) 及び p(k|x) は,
xy の結合ベクトルの GMM を予め学習しておき,そのパラメタをもとに計算します.
これは,声質変換(Voice Conversion; VC)の研究でも広く用いられている手法です.
式は疲れてきたので省略します…


(追記)
JUD では,p(k|x) がある k で 1,それ以外は 0 であると近似します.
これにより, \sum_k p(y|x,k) p(k|x) が GMM ではなくガウシアンになります.
また,argmax_k p(k|x) は計算できませんが,これは argmax_k p(k|y) で近似します.
このあたりの近似の「雑さ」が,UD w/ SPLICE の近似より良いかどうか,,がポイントです.



気になる JUD の性能ですが,論文によると UD with SPLICE よりも性能が高いそうです.
AURORA2 ではないデータベースなので単純には比較できませんが…


さらに,JUD には model-based JUD という亜種があります.
Model-based JUD では,p(y|x,m) \simeq p(y|x) という近似を,
もうちょっとよい近似として,m より大幅に少ないクラス c を用意して,
p(y|x,m) \simeq p(y|x,c) とするものです.
これにより計算量は,c のクラス数倍になりますが,精度もいくらか向上するようです.


精度ですが,論文によると,クラス数を 16 まであげれば,
クリーン音声から学習した GMM-HMM を使っているのにもかかわらず,
同じ雑音環境下で劣化した音声から学習した GMM-HMM を使った場合とほぼ同等の精度がでるようです.
素晴らしい.


UD を実装するためには,デコーダを書き換える必要があります.
HTK の future plans のところに,JUD の実装が含まれていますが,待ってるのもなんですし,
機会を見つけて自分で書いてしまいたいなーと思っています.実装自体はそんなに難しくなさそうだし.
今日の一人勉強会はこれでおしまいです.