"機械学習","信号解析","ディープラーニング"の勉強

読者です 読者をやめる 読者になる 読者になる

HELLO CYBERNETICS

深層学習、機械学習、強化学習、信号処理、制御工学などをテーマに扱っていきます

時系列データ:隠れマルコフモデルの基礎と、リカレントネットの台等

はじめに

隠れマルコフモデルでは、時系列的に変動するデータを確率的なモデルで表現します。

通常の機械学習手法(例えばサポートベクターマシン)などでは、データは各時刻毎に独立したデータであると仮定しており、そのデータの順番に意味がないという前提を持っています。(厳密には更に強く仮定をし、各データ点はある一つの確率分布から生起しているとし、各データ点同士は独立であるとする。これを独立同分布に従うデータと言う。)

 

一方で隠れマルコフモデルでは、データの変動(隠れマルコフモデルでは遷移と呼ぶ)が確率的に起こっているとしてその部分をモデル化します。

 

ここまでは単なる「隠れていないマルコフモデル」です。

隠れマルコフモデルでは、時系列の観測データに対して、観測はできないが潜在的なデータの変動が起きているとし、その潜在的なデータに応じて出力データ(観測データ)が得られるという二段構えのモデルになっています。

この観測できない潜在的(観測できる時刻とできない時刻が混在していても良い)なデータの方をマルコフモデルで記述しているので「隠れマルコフモデル」と言います。

 

隠れマルコフモデルは音声認識や自然言語処理で活躍していたものです。

現在はリカレントネットワーク、Long Short-Term Memory(LSTM)に置き代わっている状況です。

 

隠れマルコフモデル

確率分布として考える

隠れていないマルコフモデル

マルコフモデルというのは、1つ前の時刻のデータに依存して確率的にデータが変動するというモデルです。(実際はこれを1次マルコフモデルと良い、n次マルコフモデルではn個前までの時刻のデータ全てに依存して現在のデータが決まる)

 

数式で書くと、時刻tでのデータ点x_t

 

x_t 〜 p(x_t|x_{t-1})

 

と表します。〜の記号は、右辺の確率分布から左辺の変数が生起するという意味です。

 

f:id:s0sem0y:20170114225430p:plain

 

例えば、x_{t-1}は昨日の晩御飯で、x_{t}は今日の晩御飯という形です。昨日は牛丼だったので、今日は麺類かもしれません。しかし、麺類→麺類→麺類→麺類なんていう形式は考えにくいでしょう。いや、ラーメンが大好きな人はそうかもしれません。そうであれば、マルコフモデルで麺類が続く日が多いことをモデル化すればいいのです。そのような場合

 

p(x_t=麺類|x_{t-1}=麺類)=0.9

 

のような形でモデル化されることになり、この人は前の日が麺類だったら今日も9割麺類を食べると表していることになります。

1個前が○○だったら、次は☓☓になるということを確率で表現するのがマルコフモデルです。

このようなモデル化は、その人の食生活のデータを大量に有していれば可能でしょう。

 

隠れマルコフモデル

ここに、隠れ変数(潜在変数とも言う)z_tを導入します。

隠れ変数は観測はできませんが、仮定したモデルに内在する変数です。

 

z_t 〜 p(z_t|z_{t-1})

 

であり、先ほど説明したマルコフモデルそのものです。

 

f:id:s0sem0y:20170114225522p:plain

 

しかし重要なのは、この隠れ変数z_tは直接観測することができません。データとして手元には無いのです。代わりに、隠れ変数z_tに応じて何らかの観測y_tが得られるとしましょう。つまり以下のようにモデル化します。

 

z_t 〜 p(z_t|z_{t-1}) 

 

y_t 〜 p(y_t|z_t)

 

2つ目の式は、単純に時刻tの隠れ変数z_tに応じてy_tの振る舞いが変わることを示しています。観測できるのはy_tのみであるときに、y_tに背景にあるz_tと、その(隠れている)マルコフモデルを記述するのが隠れマルコフモデルです。

 

f:id:s0sem0y:20170114225805p:plain

 

先程の例に習って、この隠れマルコフモデルの概要を掴みましょう。

隠れ変数z_tは直接観測することはできませんが、日にちtでの朝御飯としましょう。私たちはある有名人の朝の食生活をモデル化したいと思っており、p(z_t|z_{t-1})のマルコフモデルを構築したいと思っていますが、彼のプライベートはとても謎に包まれています。

ただし、毎日の仕事での彼の表情y_tがその日の朝御飯z_tに依存するとします。

 

つまり、y_t〜p(y_t|z_t)という依存関係を持っているということです。

我々が知りたいのは、彼の食生活z_t 〜 p(z_t|z_{t-1})の方ですが、観測できるのがその日の表情y_t 〜 p(y_t|z_t)だけである場合に、なんとか観測できない食生活の方も含めたモデルを得るのが隠れマルコフモデルというわけです。

 

いまz_tは観測できないと言いましたが、観測できる時があっても構いません。

特に最初のz_1を決めないことには始まりませんから、適当に仮定するか、観測できた点から隠れマルコフモデルを開始します。

 

f:id:s0sem0y:20170114230304p:plain

 

 

隠れマルコフモデルの学習

隠れマルコフモデルを見ていると、とても観測データだけから隠れているデータのマルコフモデルを構成できるようには思えません。しかし、隠れマルコフモデルでは、観測データも隠れているデータも離散変数として扱います。

隠れ変数が食事ならば、「麺類、米、パン」の三種類にするというような形です。(つまり株価の連続的な値などは扱えません)

このような場合は、隠れ変数z_tが麺類になるか米になるかパンになるのかの確率を、3次元のベクトル\bf z_tで表し、それぞれの成分を、それぞれ三種類の食事を取る確率とします。

 

\bf z_t = (0.2,0.5,0.3)^T

 

と言った具合です。そして、次の日の食事z_{t+1}を知りたい場合には

 

\bf z_{t+1}=Az_t

 

と言った具合に、行列で変換することによって、z_{t+1}の成分の中身が得られ、その日の食事の確率を知ることができるという仕組みです。

この仕組みによって、パラメータは少数に収まります。(高々行列の成分の数だけ)

同じように観測データy_tも離散値であり、とりうる値のパターンの次元を持つベクトル\bf y_tを準備して、それぞれの成分に確率を入れます。

そして、\bf y_t=Bz_tというモデルを考えることで、パラメータの数が少数で済むことになります。

 

具体的なモデルは

 

\bf z_t=Az_{t-1}

\bf y_t = Bz_t

 

となり、確率分布で表されている頃に比べ、だいぶ目処が立ったように見えますね。

詳細は避けますが、学習はバウム-ウェルチのアルゴリズムによって行われます。

これはEMアルゴリズムの一種であり、EMアルゴリズムは観測できない変数がある場合の学習に使う一般的な学習手法です。

 

また上記の連立方程式は状態空間モデルと呼ばれるものの一種です。同じ構造でも、値が連続値である場合にはEMアルゴリズムでは解けなくなります。

 

隠れマルコフモデルでの予測

 

\bf z_t=Az_{t-1}

\bf y_t = Bz_t

 

\bf A,Bが学習により求まったとしましょう。

そうだとしても、やはり我々が手に入れられるのは観測データy_tだけです。

従って、手元にある新しいy_tのデータ列から、やはり本当に知りたいz_tがなんだったのかを上記の式から逆算する必要が出てきます。

y_tの時系列を実現するようなz_tの時系列の中で最も確率の大きなものを選べばいいのですが、これを総当りで計算して比較するのは時間がかかります。

その効率的な解法がビタビアルゴリズムと呼ばれるもので、動的計画法の一種です。

 

 

隠れマルコフモデルで何ができるか

結局、隠れマルコフモデルは、第n成分に第nパターンが生起する確率を入れたベクトル\bf z_t\bf y_tを準備して以下でモデル化するものでした。

 

\bf z_t=Az_{t-1}

\bf y_t = Bz_t

 

y_tが観測データであり、z_tが隠れデータである場合にどのようなことができるでしょうか。

 

 

例えば、観測y_tが音波であり、ある音波は「あ」とか「か」とか「に」とかの音素を表現しているとします。しかし、人間の使う言語である以上、「あかいろ」という音の並びはあっても、「あかきふ」などという音の並びは無いはずです(あるいは確率が非常に低い)。

 

音素z_tの並び方にはルールがありz_tz_{t-1}に依存し、ある音素z_tのときには音波y_tを観測できるということです。

これならば、隠れ変数を音素として、観測された音波を使って、その確率を成分としたベクトルを用いて

 

\bf z_t=Az_{t-1}

\bf y_t = Bz_t

 

とモデル化できそうです。音波は通常単なる波形ではなくスペクトログラムにしたりなどの工夫が施されます。

 

 

リカレントネット

リカレントネットは、リカレントニューラルネット(RNN)とも呼ばれ、または現在流行中のLong Short-Term Memory(LSTM)の名で呼ばれることも多いです。

 

リカレントネットの構造

 

f:id:s0sem0y:20170114233157p:plain

 

出力が\bf yで、入力が\bf x、中間層の変数を\bf zだと思えば

 

{\bf z_t} = f({\bf z_{t-1}})+g(\bf {x_t})

{\bf y_t} =h(\bf {z_t})

 

という具合になっているのが分かるでしょうか。これ状態空間表現にかなり似ていますね。

LSTMだとかGRUだとかは、上記の関数f,g,hを工夫してみたり、新たな変数を内部に導入したりしているものです。まずは本質的な部分を知る上では普通のリカレントネットから理解するのが大事でしょう。

 

時間方向への展開

時間方向で展開すれば以下のような形になります。

実際にはアルゴリズムの都合上\bf z_1の前に初期値\bf z_0を与える必要はありますが、まあそれは本質的なことではないでしょう。

 

f:id:s0sem0y:20170114233610p:plain

 

リカレントネットでは、変数は離散値でも連続値でも構いませんし、出力\bf y_tが再びリカレントネットへの入力になっていても構いません(すなわち多層のリカレントネット)。

また、\bf x_tが別のニューラルネットの出力によって構成されていてもよく(すなわちリカレントネットの手前に普通のニューラルネットなどがある状態)、このニューラルネットの柔軟性によって、ほとんどの伝統的な手法が取って代わられています。

 

また、上記のように時間方向に展開するとループ構造が消えるため、バックプロパゲーションを行うことができ、最適化の方法を新たに考える必要もありません。

 

深層学習について

音声認識や自然言語処理にRNNがなぜ有効なのかは、伝統的な手法がある程度うまくいっていた背景を見れば、その拡張に相当するということを認識することで理解することができます。

 

それは画像認識なども然りです。

畳み込みニューラルネットの畳み込み層に相当する操作は、伝統的に人手で行われてきたものです。深層学習はどこからともなく現れたわけではなく、伝統的な手法とかぶっている部分もあります。今はいきなり深層学習から入る人が多いかと思いますが、たまには伝統的な手法を省みることもしてみてください。

 

 

記事

s0sem0y.hatenablog.com

 

s0sem0y.hatenablog.com

 

s0sem0y.hatenablog.com

 

s0sem0y.hatenablog.com