読者です 読者をやめる 読者になる 読者になる

Itsukaraの日記

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

【DL、RL、A3C+】Montezumaの得点要因を検証中(12:40更新)

これまで書きましたように、A3Cにpseudo-countを入れたコード(A3C+)で、Atari2600のMontezuma's Revengeで最高得点2500点が出たり平均得点が400点を超えるなど、良い結果が得られています。

学習途中でi-node不足で異常終了したため、既存pseudo-countデータ無しで再開し、結果としては下記のような学習曲線になりました。30M STEPSぐらいまでは平均得点が順調に増え、500点を超えています。ただ、500点を超えた辺りから伸び悩んでいる状況です。
f:id:Itsukara:20160902101303p:plain

50M STEPSで学習を終了し、a3c_display.pyでのプレイ画像(下記)を見たところ、1つ目の部屋から隣の部屋に行ったり来たりを繰り返し、先に進みません。隣の部屋にはLIFEを失う要因であるSKULLがいるために、これを恐れてなかなか進めないように見えます。
youtu.be

LIFEが減った時に減点を与えている(オプション「--lives-lost-reward=-0.1」で指定)ことが原因ではないかと考え、減点の絶対値を減らして検証してみることにしました。

ただ、「tensorflowのnetworkをsave/restoreする際に、peudo-countも一緒にsave/restoreする機能」が無いと、途中中断/再開ができず非常に不便です。そこで、まずは、この機能を実装しました。実装結果はGithubにアップロード済みです。

検証にあたり、減点の絶対値を減らし「--lives-lost-reward=-0.02」、ついでに、高得点の主要因とは無関係と考えていた機能を縮小しました(「--train-episode-steps=30」「--reset-max-reward=False」)。

ところが、これらのオプションで学習させたところ、30M STEPSでも平均得点が100点程度になってしまいました(下記)。
f:id:Itsukara:20160902105050p:plain

上記で縮小した機能は、「高得点が出た時に、その履歴から学習させる機能」です。上図では、学習する履歴の長さを150から30に縮小し「--train-episode-steps=30」、最高得点以外でも学習させる機能をOFFにし「--reset-max-reward=False」、学習させていました。

もしかしたら、上記でOFFにしてしまった「高得点が出た時に、その履歴から学習させる機能」が、高得点の要因ではないかと考え、現在、検証中です。

なお、「高得点が出た時に、その履歴から学習させる機能」が高得点の主要因としたら、この部分をもっと工夫することで、もっと得点が伸びると思います。例えば、現状では、得点が得られたら必ず履歴から学習するようにしていますが、これを変更して、現状の平均点*1よりも得点が多い場合のみ学習させるとか、得点分布の中で上位半分以上の得点が得られた場合のみ学習させるとか、得点を得るまでのSTEPSが少ないほど優先して学習させるなどです。これ以外にも、色々な選択肢が考えられると思います。

それにしても、検証に非常に時間が掛かってしまいます。1つのパラメーターを検証するのに約1日掛かり、Google Cloud PlatformはGPU無しで遅いため更に時間が掛かります。そのため、上記の検証も、パラメーターを色々と振るのではなく、当たりそうなものを感で選んで試すぐらいしかできません。

GoogleやDeepMindは豊富なCPUリソースがあるため、パラメーターを色々な値に振って試行し、最適なパラメーターを探したりしていますが、個人の環境では、これは難しいですね。もっと強力なCPUリソースがほしいものです。

本当は、もっと色々なアイデアを試したり、最適なパラメーターを探したりしたいのですが、とりあえず、途中報告まで。

追記(9/2 12:40頃)

30M STEPSまで学習したデータを元に、「高得点が出た時に、その履歴から学習させる機能」をONにしてが学習を再開させたところ、いきなり平均点数が上がりだしました(32M STEPS〜)。期待できそうです。

f:id:Itsukara:20160902124037p:plain

*1:移動平均点での現状値ということです。例えば、過去1 M STEP分の平均点など。単なる平均点以外も考えられます。例えば偏差値を計算し、偏差値が60以上のプレイ履歴のみ学習させるとか。人間なら、プレイが下手な人から教わるよりも、プレイが旨い人からのみ教われば良いということです。