ChainerでNeural Processesを実装した

Neural Processes

人間は新しい環境におかれた時、その環境を理解しようとがんばります。正確に全体を理解したい一方で、時間は有限なので、なるべく効率的に情報を収集して環境の予測を更新していくことも重要です。そうした情報収集をどのように、そしていつまで続けるかには、今の環境の予測にどれぐらい自信があって、どのへんに自信がもてないかを定量化する必要があります。

ニューラルネット(Neural Network: NN)は大量のデータと長い訓練時間が与えられた時に正確な環境把握をすることが極めて得意です。また、計算時間という観点でも、訓練後であればNNによる予測の出力には殆ど時間がかかりません。一方で、訓練後のモデルに新たな情報を取り入れることや、予測に対する自信を出力する方法は自明ではありません。

そのようなNNの欠点を補う手法の一つに、確率過程、特にガウス過程(Gaussian Process: GP)があります。GPは予測時にこれまで収集した情報を明示的に用いるため、新たな情報を自然に予測の改善に取り入れられます。加えて、予測に対する自信度も出力することができます。一方で、予測時にこれまでの情報を使う必要があるという性質上、これまでの情報を保持する必要があり、さらに予測時の計算にも時間がかかるという欠点があります。

先日DeepMindから提案された深層生成モデルであるNeural Processes(NP)は、そんなNNとGPのいいとこ取りをしたモデルです。
[1807.01622] Neural Processes

Learning-to-learn

NPは、様々な環境を事前に経験しておけば、新しい環境について少数の学習データを与えられるだけで全体を高精度に推定することが可能です。

このように少数の学習データからでも上手く学べるような学習方法自体を学ぶことは、Meta-learningとかLearning-to-learnとか言われており最近ホットな分野です。

僕の分野では昔から興味があった問題ですし、データが大量にあれば学習できることはもうわかっている機械学習界隈でも最近盛んに研究されています。

ベイズニューラルネット

NPは予測の分布を出力することができます。つまり、予測値にどれだけ信頼が持てるかを出力してくれるので、利用者側はNPの予測の自信度を定量的に把握できます。

こうした手法はベイズニューラルネットワークと呼ばれる界隈で盛んに研究されてきており、NPはその流れにも位置付けられます。

Chainerで実装してみた

github.com
既にtensorflowのR版(!)で実装し解説記事を書いてくれている人がいたので、その人の実験設定を参考にChainerで実装しました。

一次元の問題については上手く動いていると思うのですが、二次元の問題として元論文で取り組んでいるMNISTとCelebAではまだうまく動いていません。一次元の問題でも活性化関数によって挙動がだいぶ変わるので、ハイパーパラメータの問題かもしれません。

なぜ実装したか?

NPsは以前に紹介したGenerative Query Network (GQN; Science 2018)の一般化とも考えられます。オリジナルのGQNは以下の記事で紹介しました。

抽象的な空間表現を獲得するDeepMindの深層生成モデル(GQN) - tkg日記

以下の記事はGQNの自然言語処理への応用です。

文章から抽象的な空間表現を推測する深層生成モデル(GQNの言語への応用) - tkg日記

GQN論文は僕の立場からも興味深い内容で、オックスフォードの研究室でも話題になっていました。ちょうど先週1週間エディンバラとバースにバケーションに出かけており、夜の時間が暇だったのでその時に実装してみた感じです。

ちなみに同じグループからConditional Neural Processes(CNP)というモデルも提案されています。
[1807.01613] Conditional Neural Processes