Itsukaraの日記

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

【DRL,Montezuma】ALE環境でLaser Barrier通過!

あけましておめでとうございます。
相変わらず、Montezuma's Revengeの強化学習実験を行っています。

GCPから自宅PCへ

昨年は、GCP (Google Cloud Platform)の無料枠($300、3ヶ月以内)を使い、格安のPreemptible VMを活用し、一度に8個の学習を行っていたのですが、無料枠利用は基本的に1回であり、3回めの利用でGCPアカウントが削除されてしまいました

そこで、今年から、自宅PCで強化学習を継続することにしました。幸い、冬は冷房が不要なので、PCを数日間点けっぱなしにする強化学習には、非常に向いています。自宅学習結果はクラウド(AWS 1年無料枠)にアップし、スマホで確認できるようにしています。

OpenAI GymからALEへ

OpenAI Gymは、かなり多数の実験を実施済みであり(100回程度)、OpenAI社自体はGymからUniverse(昨年12/5発表)に移行しているので、当面はALE(Arcade Learning Environment)での実験に絞ることにしました。

直感と仮説に基づいた狭い探索

自宅PCは、GCPと較べてITリソースが少ないので、ハイパーパラメータ探索は、乱数を使った広域探索ではなく、直感と仮説に基づいた狭い探索とする必要があります。今回、直感と仮説に基づいたアプローチが成功したので、報告させて頂きます。

以前のALE実験結果

ALEでは、昨年10/7に、平均点が2000点近く出ましたが、その後、ALEでの実験は行っていませんでした。OpenAI Gymでは平均点が1500点止まりだったので、ALEの方が平均点が高いのですが、ROOM#0とROOM#7にあるLaser Barriersを通過できず、探索範囲が非常に限定されていました*1

ALEとOpenAI Gymの違い

ALEとOpenAI Gymの最大の違いは、frameスキップ数*2です。ALEでは、DeepMindのAtari2600でのframeスキップ数である4を使っていました。これに対して、OpenAI Gymでは、frameスキップ数が2〜4の一様乱数となります。当方の強化学習環境では、OpenAI Gymのframeスキップ処理を2回呼び出す度に学習するので、frameスキップ数は中心が6の正規分布(的な分布)になります

昨年は、frameスキップ数を6にして何回か実験を繰り返しましたが、Laser Barriersを通過でませんでした。また、タイミングを正確に測ってLaser Barriersを通過できるように、frameスキップ数を1や2にしたりもしましたが、この場合は学習が殆ど進まず、うまく行きませんでした。

仮説を立て実験の結果、Laser Barrier通過!

そこで、今回、次の仮説を立てました。

  • Laser Barrierを通過できないのは、Laser BarrierがON/OFFする周期(frame数)と、学習高速化のためにスキップするframe数が互いに素ではないため、色々なタイミングでの試行が難しいためではないか?

この仮説に基づき、frameスキップ数を7にしたところ、思惑通り、Laser Barriersを通過することが出来ました。学習曲線と、到達した部屋は、下記です。

f:id:Itsukara:20170108060610p:plain

OpenAI Gymでは、平均点が急に0になった後で回復しない現象が頻発したのですが、今回の実験では、平均数が度々0になるものの、ちゃんと回復し、1400点弱を維持しています。

ちなみに、frameスキップ数として3,4,5,6を選ばなかったのは、1秒のframe数が60だからです。つまり、3,4,5,6はframe数60の約数となり、各1秒毎に同じframeしか学習対象にならなず、Laser Barrierを通過できるframeが学習対象にならない可能性があると考えたためです。7の次は11や13が良さそうですが、まだ試していません。

今後は、frameスキップ数=7に、他のハイパーパラメーターを組み合わせて実験していこうと思います。また、frameスキップ数として11や13も試したいですが、なにぶんITリソースが余り無いので、週単位で、かなり先になりそうです。

ソースコード

ちなみに、ソースプログラムは下記にあります。興味のある方はトライください。
github.com

ALEなどの環境を構築後、下記コマンドで学習させてください。

> run-option montezuma-y-cnc-tes60-b020-ff-fs7

ちなみに、学習曲線や到達部屋を表示したい方は、次のようにしてください。

# 1つめの端末で実行
> script log.montezuma-y-cnc-tes60-b020-ff-fs7
> run-option montezuma-y-cnc-tes60-b020-ff-fs7


# 2つめの端末で実行
> python plot.py log.montezuma-y-cnc-tes60-b020-ff-fs7


# 3つめの端末で実行
> while true; do python rooms.py log.montezuma-y-cnc-tes60-b020-ff-fs7 ; sleep 30; done

*1:ALEでの(旧)探索範囲 f:id:Itsukara:20170108054228p:plain

*2:DeepMindのAtari2600強化学習では、学習高速化のために、Atrai2600が生成する毎秒60 frameの画像のうち、一部のみを使っています。具体的には、4 frame毎に学習を行い、間のframeはスキップしています。この場合、正確に言うとframeスキップ数は3ですが、当方は4のことをframeスキップ数と呼んでおります。ご承知おきください。