Monday, March 27, 2017

FeUdal Networks for Hierarchical Reinforcement Learningのノート


arxivリンク

概要

  • 階層的強化学習
  • エージェントは報酬がもらえる状態の変化「指令・目標(goal)」を出力するmanagerと、その指令に沿って実際にアクションを出力するworkerで構成されている
  • actor-criticモデル
  • 短く「FuN」


全体図。少し複雑に見える。

  • 状態x(e.g. 画像)はmanagerとworker両者に入力される
  • managerはそれからゴールg(d次元のベクトル)を出力する。これが「指令」・「サブゴール」になる
  • managerはより長期的なパターンを捉えるため、LSTMを改造したdilated LSTM(dLSTM)というものが使われる。dLSTMの詳細は論文にて
  • (7) managerの学習が進むと、gは有効・報酬が得られる状況の状態の変化 s(t+c)-s(t) を表すようになる。 例えば、エージェントが仮想空間で地点Aから地点Bに移動したときに報酬がもらえた場合、gは「地点Aから地点Bへの移動」を表すように学習される。
  • (3) gは正規化されている。つまり超球体上に存在する。この理由は、論文によると、絶対的な(状態の)変化よりは、より柔軟な変化の「方向」を表すため。その結果、(7)はユークリッド距離ではなく、コサイン類似度を使っている。
  • (4) workerの方では、cステップ前から現在のgが総和され、一旦線形変換(φ)され、k次元のベクトルwとなる。kは任意だが、普通dより小さい。指令であるgがゼロベクトルであるとworkerに「無視」されるため、線形変換にはバイアスなし。
  • (5) workerはxからUという行列を出力する。Uは|a|行、k列。つまり、行動が「左」、「前」、「右」であれば、 3xkの行列になる。
  • (6) wとUの内積をとり、softmaxに通す。つまり、Uの行iがwに類似しているほど、iに対応するアクションをとる確率が高くなる。
  • workerの目標関数は、R+R(I)と比例する(詳細省く)。Rは強化学習の普通の外部報酬だが、内部報酬R(I)((8)のこと)はmanagerが出力したゴールを実際に果たしたかに依存する。例えば、managerが「AからBへ移動」である場合、workerが実際にAからBへと移動するアクションを出力していればR(I)は高い。
  • 結果は色々面白いのがあったが、スポットライトは難関であるMontezuma's Revengeをかなり攻略できたこと。
報酬がとてもスパースであるため、ベースラインLSTMは行き詰まり。
それに比べ、FuNはどんどん上がっている。
青いバーは高いほどworkerはmanagerの指令を従うことができたということ。
特に高い部分を見ると、指令は実際にレベル内のチェックポイント的な部分を表していることがわかる。左から2番目は「右に行く」、3番目は「ハシゴを下る」、4と5番めは「ドクロモンスターを飛び越える」、最後の6番目は「カギを獲得する」、と見れる

Tuesday, March 7, 2017

Neural Episodic Controlのノート

概要
  • 深層強化学習のエージェント(主にDQN)の学習をかなり効率化する手法を紹介
  • 典型的な深層強化学習エージェントは、複数の理由で学習にかなり時間がかかる
    • NNベースなので、学習係数を高くしすぎると学習が不安定になる上、破壊的干渉の影響を受けやすくなる。なので、学習係数を低くし、ゆっくり安定に学習を進めるしかない
    • 教師あり学習と違い、強化学習の学習は報酬に依存する。難しいタスク・ゲームだと、この学習に欠かせない報酬の出現率がスパースなので、学習が進みにくい。その上、エージェントの報酬の予測・期待が「悲観的」になる
    • Q学習などでは報酬と過去の状態・行動の紐づけのため、報酬情報が時間軸で過去へと伝搬されていく。しかし、ここも学習を安定させるため、この情報の伝搬を遅くしてしまう工夫がよくされる。
  • これらの問題の対策として、この論文で新たな手法が紹介される
  • 主にDQNのreplay buffer/memoryに加え、更にこった工夫をするかんじ
  • replay memoryとまた別に、各アクションにDifferentiable Neural Dictionary(DND)と呼ぶメモリーが追加される
    • 例えば、「左」「前」「右」がアクションであれば、3つのDNDを使う
    • 行動空間が連続的の場合、ちょっとわからない...
  • このメモリーはキーバリュー構造、言い換えるとPythonなどでよく見る辞書(dictionary)形式になっている
  • キーは強化学習エージェントの内部状態h(隠れ層の活性)であり、そのときの状態sの埋め込みとも考えられる
  • バリューは強化学習のアルゴリズムによるが、Q学習の場合はQ値になる
  • こうなると、NNを用いた強化学習が流行る前によく見たテーブルベースの強化学習に似ている
  • DNDはどんどん大きくなっていく(毎回新しいキーバリューが追加されるか、既存のキーのバリューが更新される)



  • Q値の推定をするとき、従来と違い直接NNが計算するのではなく、DNDを利用して推定する
  • 現在の内部状態hと近似しているキーのバリューを引き(カーネルと近傍法を利用、kd-treeで高速化)、重みづけ(近似しているほど高く)して総和する(Figure 1のLookup、Figure 2)
  • このようにメモリーに追記していくので、報酬が高い経験をしたら、経験の情報はNNが学習(重みの変化)するまで待つ必要はなく、すぐにQ値の計算に反映される
  • 結果:学習の目覚ましい高速化(論文で沢山の比較をしている)
今まで深層強化学習でも難しいと指摘されていたゲームの一つ「Frostbite」もこのような学習カーブ
  • DNDと脳の海馬の関連も論文で書かれている
思ったこと
  • 行動空間が連続的になっても使い方はあるか?
  • Q学習ではなくactor-critic系にも適用できるか?その場合バリューは何になるか?

Sunday, March 5, 2017

Attentive Recurrent Comparatorsのノート

読んだ経緯
  • redditで見かけた
  • one-shot learning系に関心がある
事前知識
  • one-shot learningではモノ・概念の類似度推定がよく関わる
  • 例えば、画像の分類器のone-shot learningの場合、ネコの画像セットが数枚与えられ、新しい画像がネコであるかを判断するとき、最初に与えられた画像セットと類似していれば、この画像もネコだと判断できる
論文の概要
  • 最近deepでone-shot learning系の論文が出ており、その中で結構Siameseアプローチが多い
  • Siameseでは、2つ(普通2つ)の入力だと、各入力で独立に特徴抽出し、互いの特徴/埋め込みベクトルの類似を計算する
    • 例:画像Aと画像Bを比べる場合、画像をVGGに通して得る埋め込みベクトルをx(A)としたら、AとBの類似度はx(A)とx(B)の内積で計算したりできる
  • しかし人間は、サヴァンでない限り、そのようにAを見て記憶し、Bを見て記憶し、最後にAとBを頭の中で比較するよりは、AとBを何度も見渡しながら判断するだろう
  • 例えば、左と右の画像の間違い探しをするとき、左と右を何度も見て違いを探していくだろう
  • よりボトムアップ
  • 簡単に言うと、この様なメカニズムをこの論文で実現している
  • RNNベース
  • AttentionはSpatial Transformer Networkのようなもの
  • 入力を各タイムステップでA、B、A、B...と入れ替えていく
NNの図

Attentionを可視化した出力の例

Attentionのパターンを見ると、最初全体像を確認してから細かいところを比べているのがわかる。
  • 結果:OmniglotやWebFaceデータセットなどのone-shot learningの精度で記録を出している
論文でアピールしている通り、今までよく見る手法と一味違って面白いと思った。
工夫の理由も納得する。

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モデルを正面の向きに直すこと