やること
DQNでマリオをクリアします。9-3ではGAでマリオをクリアしましたが、あれはいわば「目を閉じて走り、ジャンプのタイミングを最適化」しているに過ぎません。ここではきちんと画面を見て、進み方を学習してもらいましょう。マリオの動かし方については9-3を、DQNのアルゴリズムについては3-1をご参照ください。
実行環境とコード
Google Colaboratoryが利用可能です。


マリオのエミュレータ


Kautenjaさんが作った環境は、Colab上で問題なく動作しましたが、報酬体系が少し惜しい感じでした。具体的には、「右に進んだら+x点」「左に進んだら-x点」「死んだら-x点」という3種類の報酬しか用意されていません。マリオがクリボーや崖を恐れてしまい学習に失敗する可能性があります。これは、クリボーを踏み越えるご褒美よりも、クリボーで死ぬペナルティのほうが大きいためです。
ppaquetteさんが作った環境は、ソースコードを一部書き換えることでColab上でなんとか動きました(それもまあまあ大変でしたが…)。一方で報酬体系はとても良いようで、Kautenjaさんの基本報酬に加え、「クリボーを踏んだら+x点」「崖を飛び越えたら+x点」といったきめ細やかなご褒美が用意されています。しかし残念ながら、keras-rlとの相性が悪いようで、DQNの学習ができませんでした。
よって、今回は前者の環境を採用することにします。
ニューラルネット

DQNの結果
13800エピソード時点のマリオです。
18800エピソード時点のマリオはさっきよりも早く死んでしまいます。
GAで走ったマリオに比べると、やたらにジャンプしないので賢く見えます。
今回は20000エピソードまで学習しましたが、ゴールはできませんでした。原因は、1エピソードが長かったことです。ランダムにステージを生成し、2画面分くらいの長さ単位で学習を行えば、きっとうまくいくと思います。