スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

自動微分でBESOMの実装は可能か?

BESOMのCPTモデルを変えたときの
認識・学習アルゴリズムの導出と実装が
めんどうでなかなか進まないので、
chainer 等で実装されている
自動微分が使えないか考えてみました。
私は chainer 等使ったことがないので、
勘違い等ありましたらご指摘いただけるとありがたいです。

また、こういった研究に関心がある方はご連絡ください。
すでに chainer に慣れている人なら簡単に実装できそうな気がします。
学生さんのインターンで1週間くらい産総研に来ていただいて
実装できる人がいれば非常に助かりますが、どなたかいかがでしょうか。


BESOMにおけるCPTモデルは、
ニューラルネットワークにおける活性化関数みたいなものです。
CPTモデルの設計が、性能に大きく影響します。
最近は noisy-OR と他の数種類のCPTモデルのノードを
組み合わせたものが、
大脳皮質のモデルとしても産業応用としても有望だと私は考えています。
しかしCPTモデルを追加するたびにそれに応じて
効率的に動作する認識アルゴリズムと学習アルゴリズムを導出し、
実装・デバッグ・調整するのはけっこう手間がかかります。
そこで自動微分の利用を検討しています。

自動微分とは、目的関数を計算するプログラムを記述して実行するだけで、
その目的関数の勾配を自動的に求めてくれる技術です。
最近の多くの機械学習フレームワークに実装されています。
自動微分 - Wikipedia


認識・学習ともに勾配法を使うことにすれば、
自動微分が使えるので認識・学習アルゴリズムの実装が
非常に容易になるはずです。
例えば chainer の上で実装できれば、
ミニバッチ化、最新の加速化手法の利用、GPGPU対応も
ほぼ自動的にできることになります。
LIS との連携もしやすくなるでしょう。

まず、学習について。
入力 i に対する隠れ変数の推定結果(MPE) h* が
すでに求まっているとすると、
パラメタθの対数尤度は
log P(h*,i|θ) = Σ_x log P(x|pa(x))
で、簡単なプログラムで素直に実装できます。
あとは自動微分を使って勾配法でθを自動的に更新できるはずです。
なお、ベイジアンネットではパラメタが区間 [0,1] に
収まる必要があり、そこは何らかの対処が必要と思われます。

BESOMの場合、
学習よりも認識の方が計算時間がかかるのですが、
学習が chainer に乗るだけでも、
Adam のような最新の学習の加速化手法が
簡単に使えるため、大きなメリットがあります。
素朴な EM は学習の終盤で一次収束ですが、
Adam は二次収束らしいので、
認識の計算が定数倍遅くなっても
トータルでは速くなる可能性があります。
参考:Adam の説明
確率的勾配降下法 - Wikipedia


認識の方は、自動微分を使うには少し工夫が必要そうです。
認識においても隠れ変数 h の対数尤度
log P(h|i) ∝ log P(h,i) = Σ_x log P(x|pa(x))
の計算は簡単なプログラムで素直に実装できます。
しかし確率変数が離散値なので微分可能ではないのが問題ですが、
工夫すればできそうに思っています。
また、勝率ペナルティ、側抑制ペナルティのための
パラメタの学習のコードを少し書く必要があります。


なお、関連技術として、 NIPS 2015 でこういうものが
出てきているようです。
自動微分変分ベイズ法の紹介
Stan, PyMC3 に実装されているとのこと。
しかし、やはり離散確率変数は使えないようです。

コメント

コメントの投稿

トラックバック


この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。