日記とか、工作記録とか

自分に書けることを何でも書いてゆきます。作った物、買ったもの、コンピュータ系の話題が多くなるかもしれません。

【8-1クリア】OpenAI Gym + Colab NotebookでAIマリオを強化学習

Midjourneyに描いてもらったコンセプトアート

AIマリオチャレンジ、私は長いトライアルを終えることにしましたので、チャレンジにかかわる皆さんへの感謝の気持ちも込めて、区切りとしてブログのエントリを残しておきます。

以前は挑戦中だったAIマリオのチャレンジですが、最難関だったステージ8-1をクリアしました。平凡な表現になりますが、この一言が書けるのはとてもうれしいです。

AIマリオにチャレンジし始めたのが2021年12月30日、8-1にチャレンジを始めたのが2月27日(これらは手元のEvernoteに記録されています)でした。着手時点でからあげさんのプロジェクトでは、8-1と8-4を残すのみの状態でした。私がクリアしたのが7月24日ですから、約5か月の期間、あれもダメ、これもダメ、次はどうしよう、と思いながら試行錯誤を続けていました。今考えれば、良くあきらめずにやり続けたなと感心します。

着手当初は、ほかの協力者の皆さんが苦労されている理由が知りたかった、というのがきっかけでした。そのうち誰かがクリアしてしまうだろうから、いまのうちに着手しないとやらないまま終わりそう、とも思いました。まさか自分でクリアするとは、思っていなかったのです。

最初は、1-1をクリアしたときのNotebookから始めました。Double Q Network(DQN)を実装したもので、ほかの方のサンプルをもとに、ログや統計がとれるようにカスタマイズしていました。もともと、私は長いこと某UNIX系OSの障害解析を専門にしていました。動かない理由を何日もかけて調べて原因を突き止める(注:直すとはいってない)のが役割です。思うように動かないのは、ある意味慣れていました。

最初のうち、Newral Network(MarioNet)を何倍も大きくしたり、学習率を調整して長く学習させてみたり、そういうことでゴールに迫れると想定していたのですが、状況は想定以上に厳しく、パラメータの調整では8-1の半分くらいまでしか到達できません。そもそも、8-1は難所が多いだけではなく、1-1よりもずっと長さもあります。やりながら、子供のころよくタイムアップで死んだよなぁ、なんて思っていました。

マリオの動きを観察していて、DQNではそもそも難しいように感じてきました。というのも、DQNには確率εというパラメータがあり、この確率でランダムな操作をします。これは「新しい発見」をするために必要なことではあるのですが、実際のところεが低めの0.1に設定されていたとしても、stepが1000回あれば、100回は適当な操作をするわけです。これでは、マリオは挙動不審になりすぎてしまいます。ステージ上の新しい場所に到達する前に、ほとんどのマリオがイージーミスでやられてしまい、学習が進まないわけです。手堅く操作するところと、いろいろ試す場面とを切り替える必要性を感じました。

そこで、ひとりのマリオ(1エピソード)中にX座標の値を確認しながらεの値を動的に調整する、ということをしばらく試みました。が、εをゼロにすると、今度はステージ上の同じところで同じミスを繰り返すようになりやられてしまいます。微妙な調整をいくつも試みたのですが、このアプローチはうまくいきませんでした。

マリオを走らせている間、私も勉強して新しい技術の導入を試みました。

画面の認識を強化するために畳み込み層を改良してRESnetのような構造を取り入れました。これはある程度、最長不倒地点を延ばす効果がありました。

さらに、上で説明したε-greedy法をやめて、Noisy Networkを導入することもしてみました。こちらは、聞いているほどうまくいきませんでした。私の推定ですが、マリオの操作が離散的な選択肢から選ぶ形式であるかぎり、Noisy Networkはε-greedyとあまり変わらないのかもしれません。

ひととおり自分で実装できそうなことはやってみて、自分の手に負えそうな論文もいくつか読んでみても、目の前のマリオに応用するのはなかなか簡単ではありません。著名な論文でも(スーパーマリオより単純そうな)ATARI2600での適用結果を載せていたりしますから、自分の取り組みはそれよりずっと複雑で無謀な挑戦のように思えてきました。

ネタ切れは近づいていましたが、とはいえ正直やめるきっかけもない、という感じで、初心にもどってほかの方のNotebookを読んで、DQNからPPO(Proximal Policy Optimization)に乗り換えることにしました。これが7月18日です。ここから先は、あっという間でした。DQNのときに作成していたRESNetほかいくつかの作りこみを移植して、パフォーマンスを確認するための仕組みも移植して、観察をしながら微妙なパラメータを調整して…… とやっているうちに、もうあと一歩というところまできました。

この時点ではまだまったくクリアを信じていません。機械学習アルゴリズムの改良がこれほどクリティカルに影響することに驚き、「巨人の肩に乗る」のは大事だと思いなおしました。先行している人たちの苦労をやっと実感できるところまできた、さぁここからが大変だ、という印象です。

……などといっているうちに、急に見えたこのGOALの文字。

待てあわてるな、これは孔明の罠だ、という例のセリフが思い浮かびますが、罠ではなく本当にクリアしていました。学習を途中で止めて、再現動画を撮るために200エピソードほど走らせると、最初の動画が録画できました。

月並みな言い方ですが、この半年でかなりいろいろ勉強させてもらいました。コンピュータに機械学習をさせると、プログラマーが一番学習します。これは真理です。結局学習結果がでるのに半日や一日が必要ですので、それまで勉強して次のネタを作って…… という作業とのルーチンが組みやすいんですね。ポモドーロタイマーみたいなものです。

プロジェクトは8-4を残していますが、私はほかのテーマを探そうと考えています。私はクリエイターというよりはデータ分析官のような性格なので、Kaggleに行こうかなと思っています。ともかく、このプロジェクトでは多くのことを学びました。ありがとうございました。

追記

からあげさんのGitHubにクリア報告を載せました。こちらにクリアしたときのColab Notebookとモデルをリンクしておきます。
github.com