概要
- プログラムの表現と実行の学習をするニューラルネット
- ICLR2016のbest paper awardを受賞した論文
- 著者:Scott Reed, Nando de Freitas (DeepMind)
関連リンク
- 論文
- Qiitaでの紹介
- ↑のmokemokechickenさんのkerasでの実装
- ブログでの紹介
- 動画(Two Minute Papers)
オフィシャルスライド(pdf)- redditディスカッション①
- redditディスカッション②
注目した経緯
- General AI Challengeの関連論文として書かれていた
- 最近出たICLR2017のMaking Neural Programming Architectures Generalize via Recursion(①)を読もうと思ったけどNPIが先行研究
- 前目を通したことがあったけど結構忘れた
ノート
- 簡単なプログラムから複雑なプログラムを構成することにより、タスクを単純化し、汎化能力が向上する(普通のLSTMと比較して)
- 例のプログラム実行・トレースを教師あり学習
- 既に学習したプログラムから新しいプログラムの学習をする→プログラム・知識の再利用→continual learning
- 普通のNNと比べ、NPIが生成するコマンドは解釈しやすい
- 学習できたこと:足し算、ソート、3Dモデルの簡単な操り
NPIの論文読み返すのが面倒くさいからリンク①でのNPIの振り返りを読む
NPIの式:
NPIの式:
- コアはLSTMコントローラー(NTM・DNCを思い出す)
- 毎ステップ:
- 入力:外部環境e(t)の状態を表すベクトルs(t)、渡された引数a(t)と現在実行している関数・プログラムの埋め込みベクトルp(t)(各プログラムにベクトルが与えられる)
- 出力:現在のプログラムから戻る確率r(t)、プログラムp(t+1)と引数a(t+1)
- 補足:NPIの元論文では実際pを直接出力するのではなく、M(key)とM(prog)のキーバリューメモリーを使う。コアはベクトルkを出力し、kとの内積が一番高いM(key)に対応するM(prog)が選択され、それがp(t+1)となる。
- 実行するプログラムpがprimitive(原子動作?他のプログラムで構成されていないコマンド)であれば、環境e(t+1)に作用する
- 実験では引数の数・型は固定されている(aは3つの整数)
- NPIのメインアルゴリズム
- これで典型的なプログラムの実行の様に、これらをある順番で繰り返す
- サブプログラム・関数を呼び出す+値を渡す
- 補足:関数を呼び出す場合、LSTMの内部状態hを一旦保存し、0にリセットされる。読んだ関数から戻ったら、内部状態をhに戻す。これにより各関数の実行・学習は渡された引数のみに依存する。
- primitiveを実行する(環境に作用)
- 現在のプログラムから戻る
- 基本的に、↑の順番・パターンを既存の例から学習し、汎化する
NPIが生成したトレースの例:
タスクは3Dモデルを正面の向きに直すこと
タスクは3Dモデルを正面の向きに直すこと



