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

Itsukaraの日記

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

【DL、A3C+、OHL、Montezuma】パラメーターの影響確認中

A3C+に独自機能(On-Highscore-Learning)を加えたプログラムでのMontezuma's Revengeの強化学習を試行中です。

学習に時間が掛かるため、最適なパラメータを探索できず、山勘で選んでいると書きましたが、実は、学習が終了するのを待ちきれず、学習途中でも、思いついた機能を色々入れたり、パラメーターを変えたりしていました。そのうち幾つかは、影響が無いと思っていましたが、実は大きな影響があることが分かってきたのでお知らせします。

現在分かっている中で一番影響が大きいのは、ゲーム画像の前処理です。9/2の記事に載せた下記のグラフは、1つに繋がっていますが、実は、3.8M STEPSあたりで、ゲーム画像の前処理方式を変更しています。具体的には、2画面の「平均化(--color-averaging-in-ale=True, --color-maximizing-in-gs=False)」から「最大化(--color-averaging-in-ale=False, --color-maximizing-in-gs=True)」に変更していました。

f:id:Itsukara:20160902105050p:plain

変更した理由は、「最大化」でないと特定場面で見えないアイテム(SWORD)があるためです。両者でゲーム画像の見かけがほとんど変わらず、学習には影響ないだろう思っていました。そこで、「最大化」をデフォルトにしました。

ところが、その後、色々と機能を付け加えているうちに、学習が進まなくなっていることに気が付きました。慌てて、手元のコードではなく、githubから持ってきたコードで試しても学習が進みません。この段階で、顔面蒼白になり、原因を探るために、過去にどのようなオプションをいつ使ったかを改めて確認しました。その結果、上記の「平均化」と「最大化」の影響が、予想以上に大きいことが分かりました。

下記は、「最大化」での学習曲線です。全く学習が進んでいないことが分かります。
f:id:Itsukara:20160906050544p:plain

ちなみに、「平均化」のみだと、下記のようになります。学習が進みますが、20M STEPSぐらいまでは、平均SCOREの上昇がなく、立ち上がりが遅いです。
f:id:Itsukara:20160906050929p:plain

これに対して、一番最初に示したグラフは、学習が進み、0〜15M STEPSで平均スコアの立ち上がりが早いです。ただ、この評価ではOn-Highscore-LearningがOFFになっていたため、平均スコアが100点前後で飽和しています。

これらを纏めると下記に様になります。

ゲーム画像前処理方式 効果
最大化のみ 学習が進まない
平均化のみ 学習は進むが立ち上がりが遅い
途中で平均化から最大化に切替 0〜15M STEPSでの立ち上がり早い

3M STEPSで「平均化」から「最大化」に切り替えると、おそらく、最大化でのゲーム画像と平均化でのゲーム画像に微妙な差があるため、最大化でのゲーム画像のPseudo-countが減って、逆にPseudo-countベースのRewardが大きくなり、学習を促進するのだと思われます。ただ、切り替え時期として3M STEPSがベストか不明です。

現在、平均化から最大化に3M STEPSで切り替える方式に関し、再現実験を行っています。まだ途中ですが、下記を見ると、再現できそうな雰囲気です。下記は、当然ながら、On-Highscore-LearningをONにして試しているので、平均SCOREが500点程度になるはずですが、念の為、そうなるか確認しています。
f:id:Itsukara:20160906051745p:plain

あとがき

Pseudo-countでは全く同じ画素値でないと同じと判断しないため、画素値の値が1異なるだけで、大きな影響があるようです。そのため、人間の目には同じに見える画像でも、Pseudo-countでは、影響が大きく出るようです。これを避けるには、画素の比較精度を落とす事が考えられます。実現方法としては、現在7ビットで表現している画素値を6ビットにするだけでOKであり、オプション指定可能です。

なお、今回の影響は、精度の良い比較がプラス方向には働いているので、上記を実施する理由はありません。

それにしても、途中でゲーム画像前処理方式を変えるのは不自然なので、もっと自然な方法がないか模索中です。例えば、Pseudo-countからRewardを計算するときの係数を変えるなどの方法が考えられます。しかし、色々とパラメーターを振って試す時間や計算リソースがないので、どうしたものか...