Calendar2018の七日目の記事として書かれています。adventar.org昨年はカルマンフィルタについての記事を書きましたが、今年は引き続きカルマンフィルタについて書いていきます。猫も杓子もディープラーニングな時代ですから航空宇宙工学専攻でもきっとディープラーニングが花開いているんですよ、多分。Calendarの記事がやって来たわけで、昨年のカルマンフィルタの記事が比較的好評だったのもあって、今年も真面目に専門的な話題を書いていこうと思ったわけですが、ふとすると専門無し弱者になりがちな弊学科にあって研究テーマに悩みに悩んで大した研究もしてこなかった僕としては専門的な話を他の優秀な学科民のようにはできないような気がしてしまったりしまわなかったりします。仕方ないのであえて言うなら専門と言えないでもない状態推定のお話をしようと思ったわけですが、せっかくなので流行りに乗ってディープラーニングでもしてみむとするかと思い、深層カルマンフィルタの記事を書くことにしました。そこで早速深層カルマンフィルタについて調べ始めたのが、この記事が公開される一週間前とかになります。なにが言いたいかと言うと、ドシロートが雰囲気で書いている記事なので大目にみてくださいよろしくお願いします。事前知識カルマンフィルタの復習カルマンフィルタは、「モデルがわかっている線形システムに関して、観測誤差による影響と状態遷移誤差による影響を上手に扱うことにより精度よく状態推定を行う関数」でした。去年と微妙に文言が変わっていますがお気になさらず。ここでキモになってくるのが、「線形モデルが分かっている」ことと「誤差に関する情報は事前に分かっている」ことが前提にある点です。現実的には線形モデルではうまくいかない場合は数多くありますし、そもそも数理モデルが存在しなようなシステムというのも一般には存在します。実際のところ事前に確率分布が分かっているということは多くはないかと思います。わからないような系というのも一般には数多く存在すると考えられます。治療を受ける患者の体調の推移などが挙げられます1。2.は[1]で論文著者たちが利用法として挙げている例ですね。してはテストのスコアが対応するでしょう。同様に、2.の例では状態変数が体調、観測変数が検査スコア、制御入力が治療になるのでしょうか?いずれにせよ数理モデルとしての表現は容易では無いように思える例ですがこのような例に関して推定を行いたいという状況もありうるでしょう。先に挙げた数理モデルを論理的に構築する2のが困難な状況においても、データが豊富であればそのデータを使ってなんらかのモデルを構築することはできます。これを可能にしているのが機械学習の技術です。ここで「数理モデル」ではなく「モデル」というぼやかした表現にしているのは必ずしも数式的な表現ができる形になるとは限らないということを表現する3意味合いを持たせています。単純な例として線形重回帰モデルを考えてみます。線形重回帰モデルは、説明変数と目的変数の間に線形な関係が存在するという仮定を置いたモデルになります。$$と表されるという仮定を置いています。データを最もよく説明するように調節します。最小化するように係数を調節する、などが妥当です。この例は教師あり学習の例ですが、基本的に教師あり学習はどの手法であっても根っこの部分では同じ思想に基づいていると言えます。データには説明変数と目的変数のセットがあります。モデルは説明変数と目的変数の関係を表現するようにフィッティングさせます。フィッティングの作業はモデルの予測値と目的変数の値を近づける4ようにします。数理モデルとして与えられない場合にも対応できそうな気がします。ここまで話してきたわけですが実のところデータが豊富にあってただ単に説明変数と目的変数の関係が抽出したいのならばカルマンフィルタの良さというのは使うことなく終わるので機械学習のモデルを組めば良いわけです。一度カルマンフィルタとは何だったのかを振り返ってみると「モデルがわかっている線形システムに関して、観測誤差による影響と状態遷移誤差による影響を上手に扱うことにより精度よく状態推定を行う関数」でした。ポイントとなるのは後半の「観測誤差による影響と状態遷移誤差による影響を上手に扱うことにより精度よく状態推定を行う」の部分です。精度よく状態推定を行うと言っていますが、これは誤差の伝播を評価して事後確率分布の誤差分散が小さくなるようにしていくと言い換えることもできます。ニューラルネットワークについて話はニューラルネットワークに飛びます。ニューラルネットワークは機械学習のモデルの1つになります。さまざまなアーキテクチャやバリエーションがあるためその全てを紹介することは出来ませんが、基本となる部分は同じですのでその部分についてまず紹介します。ニューラルネットワークを構成するのは人工ニューロンと呼ばれる素子です。ニューロンは複数の入力を受け取り1つの出力を吐き出す関数と見ることが出来ます。人工ニューロン内部では次のような演算を行っています。入力の重み付き線形和をとる。重み付き線形和の値を非線形な活性化関数に通す。活性化関数の出力値を人工ニューロンの出力値とする。人工ニューロンポイントとなるのは重み付き線形和と、活性化関数です。重み付き線形和ですがニューラルネットワークをデータに対してフィットさせるときに調節するのはこの重み付き線形和の各入力に対する重みの値です。この値を適切に調節することで説明変数と目的変数を結ぶ関数を表現できるようにします。活性化関数はの役割は、ネットワークの出力に非線形性を加えることです。ここが線形関数だったり重み付き線形和をそのまま出力していたりするとネットワークは全体として線形になってしまいます。$$などがありますがいずれも微分値が存在し6、容易に計算できるものです。