(Translated by https://www.hiragana.jp/)
ビタビアルゴリズム - Wikipedia コンテンツにスキップ

ビタビアルゴリズム

出典しゅってん: フリー百科ひゃっか事典じてん『ウィキペディア(Wikipedia)』

ビタビアルゴリズムえい: Viterbi algorithm)は、観測かんそくされた事象じしょう系列けいれつ結果けっかとしてしょうじるかくされた状態じょうたいもっともっともらしいならび(ビタビ経路けいろぶ)をさが動的どうてき計画けいかくほうアルゴリズム一種いっしゅであり、とくかくれマルコフモデルもとづいている。観測かんそくされた事象じしょう系列けいれつかくりつ計算けいさんのアルゴリズムである 前向まえむきアルゴリズムえい: forward algorithm)も密接みっせつ関連かんれんしている。これらのアルゴリズムは情報じょうほう理論りろん一部いちぶである。

このアルゴリズムには、いくつかの前提ぜんてい条件じょうけんがある。まず、観測かんそくされた事象じしょうかくされている事象じしょうは1つの系列けいれつじょうならんでいる。この系列けいれつおおくの場合ばあいどき系列けいれつである。つぎに、これら2つのならびには一対一いちたいいち対応たいおうがあり、1つの観測かんそくされた事象じしょう正確せいかくに1つのかくされている事象じしょう対応たいおうしている。だいさんに、時点じてん でのもっともっともらしいかくされている事象じしょう計算けいさんは、 での観測かんそくされた事象じしょう でのもっともっともらしいかくされた事象じしょう系列けいれつのみに依存いぞんしている。これらの前提ぜんてい条件じょうけんは、すべいちがくれマルコフモデルでたされている。

「ビタビ経路けいろ えい: Viterbi path」および「ビタビアルゴリズム」という用語ようごは、観測かんそく結果けっかについて1つのもっともっともらしい説明せつめいあたえる動的どうてき計画けいかくほうのアルゴリズムにかんして使つかわれる。たとえば、動的どうてき計画けいかくほうのアルゴリズムを使つかった統計とうけいてき構文こうぶん解析かいせきは、文字もじれつについて1つのもっともっともらしい解析かいせき結果けっかしょうじる。そのため、これを「ビタビ構文こうぶん解析かいせき えい: Viterbi parse」とぶこともある。

ビタビアルゴリズムは、アンドリュー・ビタビがノイズのあるデジタル通信つうしん経路けいろにおけるあやま検出けんしゅつ訂正ていせい手法しゅほうとしてしたものである。CDMAGSMといったデジタル携帯けいたい電話でんわダイヤルアップ接続せつぞくようモデム、通信つうしん衛星えいせい宇宙うちゅう探査たんさでの通信つうしんIEEE 802.11 無線むせんLAN などのたた符号ふごう復号ふくごうひろ利用りようされている。また、音声おんせい認識にんしき自然しぜん言語げんご処理しょり計算けいさん言語げんごがくバイオインフォマティクスなどにも使つかわれている。たとえば、音声おんせい認識にんしきでは、音声おんせい信号しんごう観測かんそくされた事象じしょう系列けいれつとしてあつかい、それを文字もじ変換へんかんしたものがその音声おんせい信号しんごう対応たいおうした「かくされた原因げんいん」となされる。ビタビアルゴリズムは、あたえられた音声おんせい信号しんごうからもっともっともらしい文字もじれつつけす。

概要がいよう

[編集へんしゅう]

まず、上述じょうじゅつ前提ぜんてい条件じょうけんについてくわしく解説かいせつする。ビタビアルゴリズムは状態じょうたい機械きかい仮定かていして動作どうさする。すなわち、モデルとしたシステムは任意にんい時点じてんなんらかの状態じょうたいつ。状態じょうたいすう膨大ぼうだいであっても有限ゆうげんであり、リストアップ可能かのうである。かく状態じょうたいがノードとしてあらわされる。あたえられた状態じょうたい対応たいおうする状態じょうたい系列けいれつ経路けいろ)が複数ふくすうかんがえられるとしても、もっともっともらしい状態じょうたい経路けいろが1つあり、これを「生存せいぞんしゃ経路けいろ えい: survivor path」とぶ。これがこのアルゴリズムの基本きほんてき前提ぜんていである。このアルゴリズムは、ある状態じょうたい到達とうたつするあらゆる経路けいろ調しらべ、もっともっともらしい経路けいろえらぶ。これを状態じょうたいならびにたいして順次じゅんじ適用てきようするため、あらゆる経路けいろ保持ほじしておく必要ひつようはなく、状態じょうたい1つにつき1つの経路けいろだけを保持ほじする。

だい重要じゅうよう前提ぜんていは、ある状態じょうたいからべつ状態じょうたいへの遷移せんいについて増分ぞうぶん通常つうじょうかず)を付与ふよするてんである。この遷移せんい事象じしょうからもとめられる。

だいさん重要じゅうよう前提ぜんていは、事象じしょう一般いっぱん加算かさんてき意味いみ経路けいろじょう累積るいせきするとされる。したがって、このアルゴリズムの急所きゅうしょは、かく状態じょうたいについてのかず保持ほじするてんである。ある事象じしょうきたとき、このアルゴリズムではこれまでの状態じょうたい経路けいろあらたな遷移せんいにおける増分ぞうぶん考慮こうりょし、もっといものを選択せんたくする。事象じしょう対応たいおうした増分ぞうぶんは、ある状態じょうたいからべつ状態じょうたいへの遷移せんいかくりつ依存いぞんして決定けっていされる。たとえばタ通信たつうしんにおいて、シンボルの半分はんぶん奇数きすう状態じょうたいのときにおくり、のこ半分はんぶん偶数ぐうすう状態じょうたいのときにおくるということも可能かのうである。さらに、おおくの場合ばあい状態じょうたい遷移せんい完全かんぜん連結れんけつされてはいない。単純たんじゅんれいとして、自動車じどうしゃは、前進ぜんしん停止ていし後退こうたいという3つの状態じょうたいつとしたとき、前進ぜんしんから後退こうたいへの直接ちょくせつ遷移せんい不可能ふかのうであり、つね一旦いったん停止ていし状態じょうたいになる必要ひつようがある。増分ぞうぶん状態じょうたい組合くみあわせを計算けいさんすると、最良さいりょうのみがのこり、経路けいろてられる。基本きほんアルゴリズムの変形へんけいとして、後方こうほう探索たんさくだけでなく前方ぜんぽう探索たんさくゆるすものもある。

経路けいろ履歴りれき記録きろくする必要ひつようがある。エンコーダ開始かいし状態じょうたい既知きち状態じょうたいで、ぜん経路けいろ保持ほじできるだけのメモリがあるなら、経路けいろ履歴りれき有限ゆうげんである。そうでない場合ばあい、リソースがかぎられているため、なんらかのプログラムじょう解決かいけつさく必要ひつようとする。1つのれいとしてたた符号ふごうがある。その場合ばあい性能せいのう許容きょよう可能かのうなレベルに維持いじしつつ、デコーダ履歴りれきふかさを制限せいげんできる。ビタビアルゴリズムは非常ひじょう効率こうりつてきだが、さらに計算けいさん負荷ふか削減さくげんする変形へんけいばん存在そんざいする。メモリ使用しようりょう一定いっていとなる傾向けいこうがある。

具体ぐたいれい

[編集へんしゅう]

とおはなれた友人ゆうじんがいて、毎日まいにちその友人ゆうじん電話でんわをしてかれがそのなにをしたかをくものとする。その友人ゆうじんは、公園こうえん散歩さんぽすること、ものをすること、部屋へや掃除そうじすることという3つのことにしか興味きょうみい。あるにどれをするかは、その天気てんきだけに依存いぞんする。その友人ゆうじんんでいる天気てんきかんする具体ぐたいてき情報じょうほうは、べつ経路けいろではまったられないが、一般いっぱんてき傾向けいこうはわかっている。かれ電話でんわはなした毎日まいにち行動こうどうもとづいて、その場所ばしょ天気てんき推測すいそくしてみよう。 天気てんき変動へんどう離散りさんマルコフ連鎖れんさになっているものとする。状態じょうたいとしては「あめ; Rainy」と「れ; Sunny」の2つだけだが、直接ちょくせつ観測かんそくすることはできないので、我々われわれにとってはそれが「かくされた」状態じょうたいである。毎日まいにち友人ゆうじんは「散歩さんぽ; walk」、「もの; shop」、「掃除そうじ; clean」のいずれかをおこな可能かのうせいがある。かれなにをしたかを電話でんわ連絡れんらくしてくるので、それが「観測かんそくされた」状態じょうたいとなる。システム全体ぜんたいとしては、かくれマルコフモデル (HMM) となる。

その地域ちいき天気てんき傾向けいこうはわかっていて、平均へいきんてきにその友人ゆうじんなにをする傾向けいこうがあるかもわかっている。いいかえれば、HMM のパラメータは既知きちである。これを Pythonくとつぎのようになる。

states = ('Rainy', 'Sunny')
 
observations = ('walk', 'shop', 'clean')
 
start_probability = {'Rainy': 0.6, 'Sunny': 0.4}
 
transition_probability = {
    'Rainy' : {'Rainy': 0.7, 'Sunny': 0.3},
    'Sunny' : {'Rainy': 0.4, 'Sunny': 0.6},
    }
 
emission_probability = {
    'Rainy' : {'walk': 0.1, 'shop': 0.4, 'clean': 0.5},
    'Sunny' : {'walk': 0.6, 'shop': 0.3, 'clean': 0.1},
    }

このコードにおいて、start_probability最初さいしょ友人ゆうじん電話でんわしてきたときに HMM がどの状態じょうたいにあるかをあらわしている(つまり、あめ可能かのうせいがややたかいということしからない)。ここで使つかわれているかくりつ分布ぶんぷ定常ていじょうのものではない(定常ていじょうかくりつ分布ぶんぷはだいたい {'Rainy': 0.571, 'Sunny': 0.429} である)。transition_probability は、このマルコフ連鎖れんさでの天気てんき変化へんかあらわしている。このれいでは、今日きょうあめだった場合ばあい翌日よくじつれとなる可能かのうせいは 30% しかない。emission_probability は、友人ゆうじんがある活動かつどうおこなかくりつしめしている。あめだった場合ばあい、50% のかくりつ部屋へや掃除そうじする。れだった場合ばあい、60% のかくりつそと散歩さんぽする。

友人ゆうじんさん日間にちかんつづけてはなしをしたところ、初日しょにち散歩さんぽ二日ふつかもの三日みっか掃除そうじをしたという。ここで2つの疑問ぎもんしょうじる。この観測かんそくされたシーケンスの全体ぜんたいとしてのかくりつはどうなるか? そして、この観測かんそく結果けっか説明せつめいするもっともっともらしい天気てんきのシーケンスはどうなるか? だいいち疑問ぎもんには前向まえむきアルゴリズムでこたえられる。だい疑問ぎもんにはビタビアルゴリズムでこたえられる。これら2つのアルゴリズムは構造こうぞうてき非常ひじょうちかいので(実際じっさい、これらはおな抽象ちゅうしょうアルゴリズムのインスタンスである)、1つの関数かんすうとしてつぎのように実装じっそうできる。

 def forward_viterbi(y, X, sp, tp, ep):
    T = {}
    for state in X:
        ##          prob.      V. path  V. prob.
        T[state] = (sp[state], [state], sp[state])
    for output in y:
        U = {}
        for next_state in X:
            total = 0
            argmax = None
            valmax = 0
            for source_state in X:
                (prob, v_path, v_prob) = T[source_state]
                p = ep[source_state][output] * tp[source_state][next_state]
                prob *= p
                v_prob *= p
                total += prob
                if v_prob > valmax:
                    argmax = v_path + [next_state]
                    valmax = v_prob
            U[next_state] = (total, argmax, valmax)
        T = U
    ## apply sum/max to the final states:
    total = 0
    argmax = None
    valmax = 0
    for state in X:
        (prob, v_path, v_prob) = T[state]
        total += prob
        if v_prob > valmax:
            argmax = v_path
            valmax = v_prob
    return (total, argmax, valmax)

関数かんすう forward_viterbi は、つぎのような引数ひきすうをとる。y観測かんそくシーケンスであり、れいでは ('walk', 'shop', 'clean') となる。Xかくされた状態じょうたい集合しゅうごうである(れいでは states)。sp初期しょきかくりつである(れいでは start_probability)。tp遷移せんいかくりつである(れいでは transition_probability)。epかくされた状態じょうたいから観測かんそくされた状態じょうたいへの対応たいおうかくりつである(れいでは emission_probability)。

このアルゴリズムは、TU というマッピングを使つかう。これらは、状態じょうたいから3つくみ (prob, v_path, v_prob) へのマッピングであり、prob初期しょき状態じょうたいから現在げんざい状態じょうたいまでのぜん経路けいろかくりつv_path現在げんざい状態じょうたいまでのビタビ経路けいろv_prob現在げんざい状態じょうたいまでのビタビ経路けいろかくりつである。マッピング Tあたえられた時点じてん についてのこの情報じょうほう保持ほじし、メインループで構築こうちくする U時点じてんについての同様どうよう情報じょうほう保持ほじする。マルコフせいがあるため、 以前いぜん時点じてんかんする情報じょうほう不要ふようである。

このアルゴリズムでは、まず 初期しょきかくりつ初期しょきする。ある状態じょうたい全体ぜんたいかくりつたんにその状態じょうたい初期しょきかくりつとなる。初期しょき状態じょうたいへのビタビ経路けいろは、その状態じょうたいのみをふくむシングルトン経路けいろである。ビタビ経路けいろかくりつは、初期しょきかくりつひとしい。

メインループでは、y からじゅん観測かんそく結果けっかす。T はそこまでの時点じてんでのただしい情報じょうほうふくむが、現在げんざい観測かんそく時点じてんかんする情報じょうほうふくまない。このアルゴリズムではつぎに、かんがえられるつぎ状態じょうたいについての3つくみ (prob, v_path, v_prob)計算けいさんする。あたえられたつぎ状態じょうたい全体ぜんたいかくりつ total は、その状態じょうたい到達とうたつするぜん経路けいろかくりつ総和そうわによってられる。より正確せいかくえば、このアルゴリズムはかんがえられるすべてのもと状態じょうたいについてかえしている。それぞれのもと状態じょうたいについて T は、その状態じょうたい到達とうたつするぜん経路けいろ全体ぜんたいかくりつ保持ほじしている。このかくりつに、その状態じょうたい現在げんざい観測かんそくられるかくりつつぎ状態じょうたい遷移せんいするかくりつをかける。それによってられるかくりつ probtotal加算かさんする。ビタビ経路けいろかくりつ同様どうようもとめられるが、その場合ばあいぜん経路けいろ総和そうわ計算けいさんするのではなく、最大さいだい経路けいろ選択せんたくする。初期しょき状態じょうたいでは、最大さいだい valmax はゼロに設定せっていされている。もと状態じょうたいについて、その状態じょうたいまでのビタビ経路けいろかくりつ既知きちである。この場合ばあい同様どうように、その状態じょうたい現在げんざい観測かんそくられるかくりつつぎ状態じょうたい遷移せんいするかくりつをその時点じてんまでのビタビ経路けいろかくりつにかけ、それが valmax現在げんざいよりもおおきい場合ばあいvalmaxえる。ビタビ経路けいろそのものは、最大さいだい対応たいおうした状態じょうたい系列けいれつargmax として保持ほじする。このように計算けいさんされた3つくみ (prob, v_path, v_prob)U格納かくのうされ、すべての可能かのうつぎ状態じょうたいについて U計算けいさん完了かんりょうした時点じてんで、それを T代入だいにゅうする。

最後さいご総和そうわ最大さいだいをとる(最後さいご実際じっさい観測かんそく結果けっか処理しょりしたのち仮想かそうてき観測かんそく結果けっか処理しょりするようにすれば、メインループないでもできる)。

当初とうしょれいにこのアルゴリズムを適用てきようする場合ばあいつぎのようになる。

def example():
    return forward_viterbi(observations,
                           states,
                           start_probability,
                           transition_probability,
                           emission_probability)
print example()

これにより、['walk', 'shop', 'clean'] というならびの全体ぜんたいかくりつは 0.033612、ビタビ経路けいろ['Sunny', 'Rainy', 'Rainy', 'Rainy'] となる。3つ観測かんそく結果けっかから3つ状態じょうたいと4つ状態じょうたいへの遷移せんいもとめられるので、ビタビ経路けいろには4つ状態じょうたいふくまれている。つまり、あたえられた観測かんそく結果けっかから、友人ゆうじん散歩さんぽ初日しょにちれだったが、そのあめつづいている可能かのうせいもっとたかいとえる。

このアルゴリズムを実装じっそうするさいおおくの言語げんごでは浮動ふどう小数点しょうすうてんすう使つかうとおもわれるが、p がちいさいと結果けっかとしてアンダーフローをしょうじる危険きけんせいがある。これをふせ技法ぎほうとして、かくりつ対数たいすうをとり、計算けいさんすべてそのたい数値すうちおこな方法ほうほうがある。最終さいしゅうてき対数たいすうられたら、それに適切てきせつ指数しすう関数かんすう適用てきようすれば、しんもとめられる。

拡張かくちょう

[編集へんしゅう]

反復はんぷくビタビ復号ふくごうばれるアルゴリズムでは、あたえられた HMM にもっともよくマッチする観測かんそく結果けっかない部分ぶぶん系列けいれつさがす。反復はんぷくビタビ復号ふくごうは、評価ひょうか収束しゅうそくするまでかえしビタビアルゴリズム(の変形へんけいしたもの)をす。

べつのアルゴリズムとして遅延ちえんビタビアルゴリズムが提案ていあんされている。これは本当ほんとう必要ひつようになるまでノードを展開てんかいしない方式ほうしきで、ソフトウェアでは通常つうじょうのビタビアルゴリズムよりもすくない手順てじゅんすうおな結果けっかられる。しかし、これをハードウェアで並列へいれつするのは容易よういではない。

参考さんこう文献ぶんけん

[編集へんしゅう]

関連かんれん項目こうもく

[編集へんしゅう]

外部がいぶリンク

[編集へんしゅう]