深層カルマンフィルタについて(1)

この記事は東京大学航空宇宙工学科/専攻 Advent Calendar2018の七日目の記事として書かれています。

adventar.org

昨年はカルマンフィルタについての記事を書きましたが、今年は引き続きカルマンフィルタについて書いていきます。といっても一年前と同じことを書いても芸がないので近年流行りのディープラーニングを用いた「深層カルマンフィルタ」[1] に関するお話です。猫も杓子もディープラーニングな時代ですから航空宇宙工学専攻でもきっとディープラーニングが花開いているんですよ、多分。

はじめに

去年に引き続きAdvent Calendarの記事がやって来たわけで、昨年のカルマンフィルタの記事が比較的好評だったのもあって、今年も真面目に専門的な話題を書いていこうと思ったわけですが、ふとすると専門無し弱者になりがちな弊学科にあって研究テーマに悩みに悩んで大した研究もしてこなかった僕としては専門的な話を他の優秀な学科民のようにはできないような気がしてしまったりしまわなかったりします。

仕方ないのであえて言うなら専門と言えないでもない状態推定のお話をしようと思ったわけですが、せっかくなので流行りに乗ってディープラーニングでもしてみむとするかと思い、深層カルマンフィルタの記事を書くことにしました。そこで早速深層カルマンフィルタについて調べ始めたのが、この記事が公開される一週間前とかになります。

なにが言いたいかと言うと、ドシロートが雰囲気で書いている記事なので大目にみてくださいよろしくお願いします。

事前知識

カルマンフィルタの復習

カルマンフィルタは、「モデルがわかっている線形システムに関して、観測誤差による影響と状態遷移誤差による影響を上手に扱うことにより精度よく状態推定を行う関数」でした。去年と微妙に文言が変わっていますがお気になさらず。

ここでキモになってくるのが、「線形モデルが分かっている」ことと「誤差に関する情報は事前に分かっている」ことが前提にある点です。現実的には線形モデルではうまくいかない場合は数多くありますし、そもそも数理モデルが存在しなようなシステムというのも一般には存在します。また、観測誤差、状態遷移誤差も実際のところ事前に確率分布が分かっているということは多くはないかと思います。

実際に式を書いてみると、時刻tの状態変数を\mathbf{x}_t、観測変数\mathbf{y}_t、制御入力を\mathbf{u}_tとして

$$ \begin{align} \mathbf{x}_{t+1} &= \mathbf{A}\mathbf{x}_t + \mathbf{B}\mathbf{u}_t + \mathbf{w}_t \\ \mathbf{y}_{t} &= \mathbf{C}\mathbf{x}_t + \mathbf{v}_t \\ \mathbf{w}_t &\sim \mathcal{N}(\mathbf{0},\mathbf{Q}) \\ \mathbf{v}_t &\sim \mathcal{N}(\mathbf{0}, \mathbf{R}) \end{align} $$

と表されるような系が対象となるわけですがこの\mathbf{A}\mathbf{B}\mathbf{C}がわからないような系というのも一般には数多く存在すると考えられます。例をあげるとすれば、

  1. ある講義を受けている受講者の学力の推移
  2. 治療を受ける患者の体調の推移

などが挙げられます1。2.は[1]で論文著者たちが利用法として挙げている例ですね。1.の例を状態推定という枠組みで見るとすれば、学力が状態変数\mathbf{x}_tに対応し観測変数\mathbf{y}_tとしてはテストのスコアが対応するでしょう。制御入力\mathbf{u}_tは講義になります。同様に、2.の例では状態変数が体調、観測変数が検査スコア、制御入力が治療になるのでしょうか?

いずれにせよ数理モデルとしての表現は容易では無いように思える例ですがこのような例に関して推定を行いたいという状況もありうるでしょう。

データからの学習

話は変わって、機械学習にうつります。機械学習、近年大流行りですよね。

先に挙げた数理モデルを論理的に構築する2のが困難な状況においても、データが豊富であればそのデータを使ってなんらかのモデルを構築することはできます。これを可能にしているのが機械学習の技術です。ここで「数理モデル」ではなく「モデル」というぼやかした表現にしているのは必ずしも数式的な表現ができる形になるとは限らないということを表現する3意味合いを持たせています。

最も単純な例として線形重回帰モデルを考えてみます。線形重回帰モデルは、説明変数と目的変数の間に線形な関係が存在するという仮定を置いたモデルになります。つまり、目的変数は説明変数の線形結合(アフィン結合)

$$ \begin{equation} y=\sum_{i=0}^N w_i x_i +b \end{equation} $$

と表されるという仮定を置いています。このとき各説明変数にかけられた係数w_iをデータを最もよく説明するように調節します。この場合であれば、ある説明変数\mathbf{x}_jに対応した目的変数y_jがあるとしてこの説明変数に対してモデルが出力する値を\hat{y}_{j}とするとモデルの予測値と目的変数の値から計算される二乗誤差\sum_{j=1}^M (y_j - \hat{y}_j)^2を最小化するように係数を調節する、などが妥当です。

この例は教師あり学習の例ですが、基本的に教師あり学習はどの手法であっても根っこの部分では同じ思想に基づいていると言えます。すなわち、

  • データには説明変数と目的変数のセットがあります。
  • モデルは説明変数と目的変数の関係を表現するようにフィッティングさせます。
  • フィッティングの作業はモデルの予測値と目的変数の値を近づける4ようにします。

だいぶざっくりした話ですが、この考え方を使えば適切なモデルとデータを用いることで先に挙げた状態方程式・観測方程式が数理モデルとして与えられない場合にも対応できそうな気がします。

とまあ、ここまで話してきたわけですが実のところデータが豊富にあってただ単に説明変数と目的変数の関係が抽出したいのならばカルマンフィルタの良さというのは使うことなく終わるので機械学習のモデルを組めば良いわけです。もう一度カルマンフィルタとは何だったのかを振り返ってみると

「モデルがわかっている線形システムに関して、観測誤差による影響と状態遷移誤差による影響を上手に扱うことにより精度よく状態推定を行う関数」

でした。ポイントとなるのは後半の「観測誤差による影響と状態遷移誤差による影響を上手に扱うことにより精度よく状態推定を行う」の部分です。精度よく状態推定を行うと言っていますが、これは誤差の伝播を評価して事後確率分布の誤差分散が小さくなるようにしていくと言い換えることもできます。

ニューラルネットワークについて

話はニューラルネットワークに飛びます。

ニューラルネットワーク機械学習のモデルの1つになります。さまざまなアーキテクチャやバリエーションがあるためその全てを紹介することは出来ませんが、基本となる部分は同じですのでその部分についてまず紹介します。

ニューラルネットワークを構成するのは人工ニューロンと呼ばれる素子です。ニューロンは複数の入力を受け取り1つの出力を吐き出す関数と見ることが出来ます。人工ニューロン内部では次のような演算を行っています。

  1. 入力の重み付き線形和をとる。
  2. 重み付き線形和の値を非線形な活性化関数に通す。
  3. 活性化関数の出力値を人工ニューロンの出力値とする。

f:id:koukyo1213:20181206131954p:plain
人工ニューロン

ポイントとなるのは重み付き線形和と、活性化関数です。

まず重み付き線形和ですがニューラルネットワークをデータに対してフィットさせるときに調節するのはこの重み付き線形和の各入力に対する重みの値です。この値を適切に調節することで説明変数と目的変数を結ぶ関数を表現できるようにします。活性化関数はの役割は、ネットワークの出力に非線形性を加えることです。ここが線形関数だったり重み付き線形和をそのまま出力していたりするとネットワークは全体として線形になってしまいます。

非線形関数としてよく使われるのはシグモイド関数5

$$ \begin{equation} f(x) = \frac{1}{1 + \exp(-x)} \end{equation} $$

ReLU関数

$$ f(x) = \max (0, x) $$

tanh関数

$$ f(x) = \frac{e^{x} - e^{-x}}{e^{x} + e^{-x}} $$

などがありますがいずれも微分値が存在し6、容易に計算できるものです。これらを使って1つの人工ニューロンを関数として表現すると

$$ \begin{equation} f(x) = h\left(\sum_{i=0}^{N} w_i x_i + b\right) \end{equation} $$

となります。h(\cdot)が活性化関数です。

ニューラルネットワークはこの人工ニューロンを多数まとめた層をいくつも積み重ねるようにして構成し、層から層へ値を伝播して変換を施していくようなモデルです。

f:id:koukyo1213:20181206162355g:plain
人工ニューラルネットワーク

このとき、一番最初の層は説明変数の入力を受け取るため入力層と呼ばれ、最後の層は目的変数の予測値を出力するため出力層と呼ばれます。間の層は中間層、隠れ層などと呼ばれますがこの中間層の存在がニューラルネットワークが複雑な関数に対しても高い近似性能を誇る理由となっています。

深層ニューラルネットワークまたの名をディープラーニングはこの隠れ層が一般に2~3以上になった深いネットワーク構造に対する呼称ですが実際のところ明確な定義はありません。

ニューラルネットワークの学習

ニューラルネットワーク教師あり学習アルゴリズムの1つ7なので、学習データに対するフィッティングの作業があり、その作業が学習と呼ばれるという点は機械学習一般の話と変わりません。この場合もやはり、予測値と目的変数値から計算される損失関数を最小化することでフィッティングを行います。この際には微分が重要となってきます。

人工ニューロンを1つとってみたとき、出力値に対する重みによる微分というものを計算することを考えます。いま、人工ニューロンの入力と出力の計算において

$$ \begin{align} y &= \sum_{i=0}^{N} w_i x_i + b \\ f(\mathbf{x}) &= h(y) \end{align} $$

のように書くことにすると、その出力に対する重み \mathbf{w}による微分とは

$$ \begin{align} \frac{\partial f}{\partial \mathbf{w}} = \frac{\partial h}{\partial y} \cdot \frac{\partial y}{\partial \mathbf{w}} \end{align} $$

となります。この右辺第一項は活性化関数に依存しますが、入力から出力へと値を伝播するとき(forwardといいます)に計算した値を保存しておくことで効率的に計算することができます。

また右辺第二項は入力されたベクトル\mathbf{x}そのものになります。

さて、このように人工ニューロンは出力に対する重みの微分が簡単に求められるのですが、これは多層に重なっていても同じです。同様にして各演算についての偏微分の積になりますので、出力層での出力値に対する第一層の重みによる微分みたいなものも簡単に求められます。

ニューラルネットワークの学習においては、損失関数に対する各重みによる微分というものを計算します。この重みによる微分の意味を考えるとその重みを少しずらした時にどれくらい損失関数の値が変わるかを表現していると言えますので、損失関数の値が小さくなるように微分値を用いて各重みを更新してやれば損失関数を最小化することができます。

もちろん、損失関数は山あり谷ありなことがほとんどですので、単純に損失関数値が下がる方向にだけ調節しても大域的な最適解というものに辿り着かないこともあります。そこのあたりの最適化に関しては今回は割愛させていただきます。

潜在変数モデル

またまた、話は飛びます。カルマンフィルタのような、観測変数の背後に非観測の状態変数の存在を仮定するモデルを潜在変数モデルと言います。潜在変数モデルの考え方は機械学習の世界では非常によくみられます。これは、潜在変数モデルにおける潜在変数の考え方が機械学習の適用先となる現実世界の問題設定によくある階層構造やデータの分布構造をよく表現できているからだと考えられます。

カルマンフィルタは潜在変数が時系列性を持つ隠れマルコフモデルですが、それ以外にも単語群の出現の背後にトピックと呼ばれる潜在変数の存在を仮定するトピックモデルや、変分オートエンコーダも潜在変数モデルの1つと考えることができます。

今回、深層カルマンフィルタを理解する上でこの変分オートエンコーダを潜在変数モデルの1つと考えることがキモとなります。

潜在変数モデルにおいてよく現れる考え方として、潜在変数の分布が観測変数の分布の事前分布となる、すなわち潜在変数の取る値が観測変数を生成する分布のパラメータとなる、というものがあります。実際トピックモデルなどにおいてはトピックと呼ばれる潜在変数の分布をディリクレ分布として仮定し、その値に応じて各単語の出現確率を決定する多項分布のパラメータが変化する、というLDAというモデルが一般的に用いられます。

変分オートエンコーダ

変分オートエンコーダの説明をする前に、オートエンコーダについて簡単に触れておこうと思います。

オートエンコーダは、ニューラルネットワークによる次元削減の教師なし学習アルゴリズムの1つです。オートエンコーダは入力に対応した出力として入力と同じデータを用います。

f:id:koukyo1213:20181207113355p:plain
オートエンコーダの構造

上の図のような構造のニューラルネットワークの入力と出力に同じデータを与えた場合このネットワークが学習するのはなんでしょうか?

左半分のネットワーク、すなわち入力から中間層へと流れていく部分に関しては、層を挟むごとにどんどん層のサイズが小さくなるようにします。これにより、入力データをより圧縮したような中間的な表現が中間層には現れることになります。そして右半分の中間層から出力層へと流れていく部分では、この圧縮された中間的な表現を再度拡張して元の入力と同じようなデータを出力するようにしています。結果としてこの構造をもったニューラルネットワークの入力と出力に全く同じデータを与えた場合には、そのデータの本質的な部分のみを抜き出したような表現が得られると考えられます。この中間表現を得ることは画像や自然言語など情報が疎な構造に分散している場合には有効であると考えられています。

このオートエンコーダを先のニューラルネットワークの学習という観点で見直すと、説明変数と目的変数が同じものになっていると考えれば教師あり学習の枠組みで捉えることが出来ます。したがって出力の予測値と出力(入力)が近づくと小さくなるような損失関数を与えてやりそれを最小化するように学習すればネットワークはそのデータに対してフィットしたということが出来ます。

さて、変分オートエンコーダでは、オートエンコーダでは特に制限を加えなかったこの中間層に関して、多次元標準正規分布に従うような制限をかけることを考えます。これにより、例えば画像群に関してフィットさせると各画像は中間層においては標準正規分布を構成する一点として配置されるようになります。そして、学習データが射影されていない点というのをその正規分布からサンプリングすることで学習データには含まれないデータを得ることが出来ます。このように、学習によって分布を得るような機械学習のモデルを生成モデルと言いますが、これが生成モデルと言われるのは学習データにはないデータも生成できるから、という背景があります。

変分オートエンコーダは、オートエンコーダの中間表現を標準正規分布を構成するような制限をかけたもの、ということはわかりましたがこれをどのように実現するのでしょうか?

世の中には変分オートエンコーダに関する説明がいろいろと溢れていますのでそれらとの差異を出すためにも、ここではお気持ちについて詳しく述べていこうと思います。

まず、標準正規分布を構成するように制限をかける、という点に関してですが、これは「エンコーダでの行き先の分布を標準正規分布にできるだけ近づける」ということを行って実現します。ここで分布同士の近さを表現する指標としてKullback-Leiblerダイバージェンスと呼ばれる指標

$$ \begin{equation} D_{KL}[p(x)||q(x)] = \int p(x) \log\frac{p(x)}{q(x)}dx \end{equation} $$

と呼ばれるものが導入されます。この指標は、分布が完全に一致する場合には0となり、それ以外の場合は正の値をとります。また、一般には非可換です。したがってこの値を0に近づける(=最小化する)ようにすれば、2つの分布は近づいていくことになります。

エンコーダでの行き先の分布を標準正規分布に近づけるためにはエンコーダの出力が分布(のパラメータ)になっている必要があります。したがって、エンコーダ部分に関して言えば、さきにニューラルネットの学習で述べた損失関数としてこのKullback-Leiblerダイバージェンスを設定し、エンコーダの出力としては多次元正規分布のパラメータ\mu\Gammaを設定します。これらの値がKLダイバージェンスを最小化するように学習をすすめればいいのです。

一方で、エンコーダで標準正規分布を近似するように構成された潜在変数をデコーダでは入力データを再構成するように復元してやる必要があります。これを実現するために潜在変数からデコードされたデータと入力データの再構成誤差

$$ \begin{equation} \sum_{i=1}^{D} \left( x_i \log y_i + (1 - x_i) \log (1-y_i) \right) \end{equation} $$

を最小化するようにしてやります。この2つの和を最小化するように学習をすすめることで、エンコーダの行き先の分布を標準正規分布に近づけるようにしながら入力と出力ができるだけ同じようになるニューラルネットワークというものを得ることが出来ます。

f:id:koukyo1213:20181207175757p:plain
変分オートエンコーダの構造

深層カルマンフィルタとは

ここまでくるともうお気づきの方も多いかもしれませんが、深層カルマンフィルタとは状態方程式\mathbf{x}_{t+1} = \mathbf{A}\mathbf{x}_{t} + \mathbf{B}\mathbf{u}_t + \mathbf{w}_tや観測方程式\mathbf{y}_t = \mathbf{C}\mathbf{x}_t + \mathbf{v}_tを深層ニューラルネットワーク(DNN)に置き換えたものになります。

数学的な表現をすると、記号の定義は同じとして

$$ \begin{align} \mathbf{x}_{0} &\sim \mathcal{N} \left(\mu_{0} , \Gamma_{0}\right) \\ \mathbf{x}_{t} &\sim \mathcal{N} \left( G_{\alpha}(\mathbf{x}_{t-1}, \mathbf{u}_{t-1}, \Delta t), S_{\beta}(\mathbf{x}_{t-1},\mathbf{u}_{t-1}, \Delta t) \right) \\ \mathbf{y}_{t} &\sim \Pi (F_{\gamma}(\mathbf{x}_{t})) \end{align} $$

となります。このうちG_{\alpha}(\cdot)S_{\beta}(\cdot)F_{\gamma}(\cdot)の部分がDNNで表現されているというのが深層カルマンフィルタです。この、G_{\alpha}(\cdot)S_{\beta}(\cdot)の部分をエンコーダ、F_{\gamma}(\cdot)の部分をデコーダと考えると、これは変分オートエンコーダに非常によく似たモデルであることがわかります。変分オートエンコーダとの違いがどこにあるかというと、制御入力\mathbf{u}があることと状態変数\mathbf{z}_tが時系列性をもつ、すなわち

$$ \begin{equation} q_{\phi}(\mathbf{z} | \mathbf{x}, \mathbf{u}) = \Pi_{t=1}^{T}q(z_t | z_{t-1}, x_1, x_2, \cdots, x_T, \mathbf{u}) \end{equation} $$

となっている点です。また、用途としても変分オートエンコーダが主にデコーダを用いて未知画像を生成する、といった用途を考えている8のに対し、深層カルマンフィルタではエンコーダ、すなわち観測データと制御入力の系列から状態を推定する方がメインになっている点が異なります。

このq(z_t | z_{t-1}, x_1, x_2, \cdots, x_T, \mathbf{u})はエンコーダ部分に対応しています。デコーダ部分に関して言えばやっていることは変分オートエンコーダと変わりません。

このネットワークの学習においてはどのような損失関数を最小化すれば良いのでしょうか?ここでも、詳細な証明は元の論文[1]が詳しいため割愛させていただくとして、お気持ちだけ書いておこうと思います。

まず、デコーダ部分は潜在変数を入力としてエンコーダに入ったデータと全く同じデータが出力されるようにしたいため再構成誤差を最小化するようにします。この部分は変分オートエンコーダと変わりません。

変分オートエンコーダと大きく異なるのが、状態遷移が存在する点です。結論から言えば変分オートエンコーダがエンコーダとデコーダの2つのネットワークを用いていたのに対し、深層カルマンフィルタではエンコーダとデコーダと状態遷移の3つのニューラルネットワークを使います。ではどのようにしてこれを学習するか、というと初期状態については初期の潜在変数分布とエンコーダの出力の分布を近づけるようにKullback-Leiblerダイバージェンスを最小化するのですが、それ以降の時間ステップに置いては、状態遷移のニューラルネットワークの出力と、1ステップずれた観測変数+制御入力の入力があったエンコーダの出力の分布を近づけるように学習していく、という点が変分オートエンコーダとの大きな違いです。

f:id:koukyo1213:20181207224131p:plain
Deep Kalman Filterのアーキテクチャ

まとめ

今回は深層カルマンフィルタの説明を行いました。変分オートエンコーダの理論的な詳細や深層カルマンフィルタの理論的な説明は僕の理解力不足もあっておざなりになってしまったので今後余裕があったら追加していこうと思います。また、実装に関してもできたらいいなと思っています。かなり中途半端ですが、アドベントカレンダーに間に合わせるために今回は一旦ここで終わりにしたいと思います。

参考文献

[1] Krishnan, Rahul G., Uri Shalit, and David Sontag. "Deep kalman filters." arXiv preprint arXiv:1511.05121 (2015).

[2] Kingma, Diederik P., and Max Welling. "Auto-encoding variational bayes." stat 1050 (2014): 10.

[3] Variational Autoencoder徹底解説
https://qiita.com/kenmatsu4/items/b029d697e9995d93aa24

[4] 猫でも分かるVariational AutoEncoder
https://www.slideshare.net/ssusere55c63/variational-autoencoder-64515581

[5] DL_hacks_20151225
https://deeplearning.jp/wp-content/uploads/2017/07/DL_hacks_20151225.pdf

[6] 深層カルマンフィルタ
http://ubnt-intrepid.hatenablog.com/entry/2016/10/10/205229

[7] 著者GitHub
https://github.com/clinicalml/structuredinference


  1. 正確にはこの二例はおそらく非線形になるので、\mathbf{A}\mathbf{B}\mathbf{C}が分かっていない場合の例としては不適切だが説明の手間を考えてごまかしています。

  2. 論理的に構築する、というのがなんともぼやかした言い方ですが、自然科学の伝統的方法を鑑みるに「データからの法則性の抽出」と「法則性の適用と組み合わせ」によって数理モデルは成り立っているというのが個人的な見解です。この「法則性の適用と組み合わせ」を「論理的に構築する」と表現したつもりです。

  3. 数理モデルの定義としてこれが妥当なのかはよくわからない。

  4. 近づけるという表現が結構曖昧ですがまあここはごまかしています。

  5. \expの中身に実数倍かけたものであることもあります。

  6. 正確にはReLUはx=0微分不可能であるが劣微分により、x > 0で1、x \le 0で0とする。

  7. それ以外の使い方もありますが

  8. 違うかもしれない