Monday, February 27, 2017

Neural Programmer-Interpreters のノート

概要
  • プログラムの表現と実行の学習をするニューラルネット
  • ICLR2016のbest paper awardを受賞した論文
  • 著者:Scott Reed, Nando de Freitas (DeepMind)
関連リンク
ノート
  • 簡単なプログラムから複雑なプログラムを構成することにより、タスクを単純化し、汎化能力が向上する(普通のLSTMと比較して)
  • 例のプログラム実行・トレースを教師あり学習
  • 既に学習したプログラムから新しいプログラムの学習をする→プログラム・知識の再利用→continual learning
  • 普通のNNと比べ、NPIが生成するコマンドは解釈しやすい
  • 学習できたこと:足し算、ソート、3Dモデルの簡単な操り
NPIの論文読み返すのが面倒くさいからリンク①でのNPIの振り返りを読む

NPIの式:

コアの図:

別のイメージ:
func1(a) {
    func2(args);
    ...
    return;
}
  • コアは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モデルを正面の向きに直すこと

No comments:

Post a Comment