Itsukaraの日記

最新IT技術を勉強・実践中。最近はDeep Learningに注力。

【DRL, Montezuma】スライドを再更新

相変わらず続けているMontezuma's Revengeの実験ですが、pseudo-countを各部屋ごとに持つように変更したところ、到達部屋が1つ増えましたので(ROOM 20、DeepMindの論文には未記載)、スライドを更新しました(p.16、p.18、p.20を微修正。p.19を追加)。なお、p.19記載のように、1回の学習(50M steps)で、かなり広い範囲の部屋に到達することができました。

補足

実は、参考にしているDeepMindのpseudo-countの論文が11/7に更新されました。新たな情報として、DeepMindの実験では、pseudo-countに使うゲーム画像のpixelの値を3bit(最大値が7)で表現しているということが書かれていました。ちなみに、当方は7ビット(最大値が127)で表現していました。そこで、3bit(最大値が7)〜6bit(最大値が63)でどうなるかを試したのですが、残念ながら、良い結果は全く得られませんでした(このサイトのmontezuma-p 〜 montezuma-sの00index.html参照)。

そこで、pseudo-countからpseudo-rewardを計算する式の指数(pseudo-reward = 1/power(pseudo-count, p)でのpの値)を少し変えて試しましたが(montezuma-t)、これも今ひとつ。

そこで、以前から懸案であった「pseudo-count」を各部屋毎に持たせるようにしたところ、非常に良い結果が得られました。このページの一番最後のグラフを参照頂くと分かりますが、訪問部屋は[ 0 1 2 3 4 5 6 7 8 9 10 11 12 18 19 20]とかなり多く、平均得点も1700点ぐらい出ています。

ただ、点数が上がり始めたのが40M stepsからです。他の実験では、30M stepsで諦めてしまったものもあるので、これらも、もっと続ければ高得点に繋がった可能性があります。

高速な実験環境が多数利用できれば、1週間ぐらいで試せると思うですが、これが無いので、この結果が出るまでに、1ヶ月ぐらい掛かってしましました。Google Cloud Platformの無料枠を最大限に使い、4CPUの仮想サーバを8台使って試しているので、結構リソースは活用しているつもりですが、やはり、個人でできることには、かなり限界がありますね。

補足2

Google Cloud Platformは2回めの無料試行期間が後1〜2日で終了するので、過去の実験結果は、AWSに移しました。

補足3

実験の学習グラフを見ると、平均スコアが途中で完全に0になったりと、かなり不安定なことが分かります。この不安定性を除去できれば、もっと良い点数が出ると思います。ただ、この原因調査は不十分な状況です。

不安定性の調査の一環として、下記2つの仮設を立てて、ちょっとだけ試したところ、下記1つ目は誤っているように見えました。2つ目は、なんとなく、効果が出ているように見えます。ただ、本来は、数十回以上の実験を行わないと、統計的な差は示せないと思います。これも、リソースが無いため、勘に頼らざるを得ない状況です。

  • 【仮説1】各スレッド毎に別々にpseudo-countを持っているのに、そこでの経験を同じネットワークに学習させるので、学習環境とネットワークの間で矛盾が生じている可能性がある。もしかしたら、pseudo-countをthread間で共用すれば良いかも。
  • 【仮説2】上記とは逆で、学習が進んで点数が上がると、全てのthreadでpseudo-countが似た値になるため、A3Cで重要となる「thread間での多様性」が失われるため、学習が不安定になるのでは? もしかしたら、各thread毎に、パラメーターをもっと変えれば、学習が安定するかも。

上記を確認するために行ったことを少し説明します。

montezuma-v0を見ると、gcp10, gcp30, gcp40の学習曲線が、一度ピークに達した後、急激に0になっていることが分かります。そこで、上記1つ目を試すために、gcp10とgcp40に対し、ピークになった時点での学習データのthread0のpseudo-countを、全てのthreadでロードして再度学習させてみました。この結果は、montezuma-v1のgcp10とgcp40です。これを見ると、結局、ピークの後で急激に0になっています(gcp40は、一度値が回復するものの、直ぐに0になっている)。

これに対し、gcp30では、逆に、thread毎の多様性を持たせるため、pseudo-rewardを計算するときの指数をthread毎に少し変えてみました(2.0 + thread番号(0〜7)*0.7)。たまたまの可能性も高いのですが、gcp30は、点数が一度0になっても、その後で回復しているように見えます。やはり、thread間で多様性が合ったほうが良いのかも。(全くもって曖昧な話ばかりで申し訳ありません...)

上記から、単なる直感ではありますが、thread間で多様性があったほうが良いのではないかと思い、現在、試しているところです。ただ、既に書きましたように、使っているリソースであるGoogle Cloud Platformの無料試用期間は後1〜2日なので、学習曲線が上向くまで試せるか、微妙な状況です。