深層強化学習の実装練習

 深層強化学習プログラムの実装練習として『Which are you?』というトイタスクを考えて、エージェントを実装した。

1.『Which are you?』の説明

概要

 以下のような5×5マスの2次元グリッドの世界を考える。

#####
#...#
#A.B#
#...#
#####

 A, Bはこの2次元グリッドを移動する存在であり、どちらかがあなたであるが、ゲーム開始時点でどちらがあなたであるかはわからない。あなたは1ターンに1度移動を選択することができ、あなたである方の文字は選択した移動方向へ移動する。あなたでない方の文字は、毎ターン上下左右ランダムに(25%ずつの確率で)移動する。# マスは壁マスであり、そこへ移動することはできない。.は空きマスであり、そこへ移動できる。

 たとえば上の状態であなたが上方向への移動を選択したとする。あなたがAであった場合、Aは意図通り上に動く。Bはランダムに移動方向が決まり、左に動いたとする。その場合2ターン目の状態は以下のようになる。

#####
#A..#
#.B.#
#...#
#####

 あなたは各ターンで移動する代わりに「自分はAであると回答する/自分はBであると回答する」という行動を取ることもできる。この行動を選択した場合、ゲームは終了し、回答の正否によって報酬が与えられる。

人手で解く場合の想定解法

 上下左右適当に行動を選択し、盤面がどのように遷移するかを観察して、自分の入力通りに動いたものを答える。自分ではない方の文字は25%ずつ各方向へランダムに動くので、毎ターン75%で異なる動き方をすることになり、自分がどちらか特定可能になる。

タスクを解くために必要な情報

 このタスクでは特定のターンだけの盤面を何時間凝視していてもどちらが自分だかわかることはない。「過去の自分の行動」と「その際の盤面遷移」を結びつけることで十分な情報になる。

 おそらく遷移確率などを詳細に定義していけば部分観測マルコフ決定過程の一例として正確に定義できるのだと思う。

2.解くために作成したプログラム

 適当に過去の情報を持ちつつ処理していけばこの問題自体を解くことはできるが、今回の目的は深層強化学習の実装練習であるため、(深層であるかはともかく)LSTMを用いて実装を行った。

エージェント

 LSTMを持ち、各ターンで取るべき行動を6次元(上下左右の移動、A/Bであるという回答)のSoftmax方策で出力する。LSTMは各エピソード開始時刻に隠れ状態・メモリセルを0初期化する。

入力特徴量

 盤面の5×5について、プレイヤーA,B,壁の3種類のどれかについてOnehotベクトルにした5×5×3を与える。空きマスは[0, 0, 0]になる。

 また直前のターンでどのような行動を取ったかという情報も入れる必要があるため、前ターンに上下左右どの方向への行動を選択したかという情報を4次元のOnehotベクトルで与える。

 盤面と行動合わせて5×5×3 + 4次元の0 or 1がエージェントのネットワークへと与えられる。

学習

 毎回1エピソードを終えたらその結果を用いて方策勾配法で学習を行う。リプレイバッファなどはなし、分散でエピソードを集めることもしていない。

細かい実装点

  • 回答をせず移動だけで10ターン経過した場合、強制的に不正解とする。(ずっと移動し続けて終わらなくなってしまう状態になることがあったため)
  • A, Bの初期位置は(3,1),(3, 3)で固定する。
  • 正解した場合の報酬は1/(回答までのターン数), 間違えた場合(および10ターン経過した場合)は-0.1
  • 壁に対して移動した場合、なにも起こらない
  • 移動はA、Bの順番で処理される。AとBが同じ位置に移動しようとした場合、Aが優先される

3.結果

 1万ステップの学習を独立に10回試行した。200ステップごとに直近200ステップの正答率をプロットした結果が以下となる。

f:id:tokumini:20211113131404p:plain

 1万ステップ時点で10回中7回は正答率が80%を超える結果となったが、それ以外ではチャンスレートと同程度だった。一応学習はできているが、不安定な様子がグラフからもわかる。また上手くいっている場合も正答率100%には達さない点が気にかかる。

 今回はかなり雑な形でLSTMに入力しているので、ちゃんと特徴抽出に気を払ったり行動入力の与え方をどうにかすることでもう少し安定化できるのではないか。今後やる気があればそのあたりを触ってみる予定。

4.あとがきと余談

 とりあえず基本形としてこういうタスクが解ける場合もあるということがわかったのは良かった。

 今回このようなタスクを考えたのは、個人的に「最も原始的な形の自己意識」とはこのタスクのように自分の行動と環境の変化を結びつけ、世界の中で自分(意志により動かせるもの)を発見することにあるのではないかと考えているからである。

 私はこの肉体が(そしてこの肉体のみが)「自分」と感じられることについて不思議さを覚えることがあり、その発達についてあり得たかもしれない道筋が少しでも見えればなぁと思うところである。