🐙

強化学習未経験者がテトリスの AI を作ってみた話

に公開
2

Discussion

ゆあともゆあとも

こんにちは、記事を拝見させていただきました。
現在私も強化学習未経験でテトリスのAIを作成しようとしているのですが、調べても分からない点がいくつかあったのでご質問させてください。
まず1点目に、Input(14)の14という値がどこから来たのかが分からないです。盤面の特徴量とnext,holdミノが入っているのかと思ったのですが、それだと数が足りないので他に何を入力値として入れているのかを教えていただきたいです。
次に、私はjsでTensorFlowを使って作成しようとしているのですが、chatGPTに聞いたところinputDataのほかにもtargetDataというエージェントが達成しようとする目標や、望ましい行動の情報が不足していると言われました。このデータについてthroughさんのtetris-projectのコードを確認したのですが、私の勉強不足でどこにそのデータが入っているのかが分かりませんでした。テトリスのラインを消した数などが入るという認識で合っているのでしょうか?もしよければ、コードのどの部分で実装されているのかを教えていただきたいです。
以上、長文になってしまいましたがよろしくお願いいたします。

throughthrough

コメントありがとうございます。
返信が遅れてしまい申し訳ありません。

まず1点目に、Input(14)の14という値がどこから来たのかが分からないです。盤面の特徴量とnext,holdミノが入っているのかと思ったのですが、それだと数が足りないので他に何を入力値として入れているのかを教えていただきたいです。

これはこちらのミスでした。
正しくは、盤面の特徴量(8個)+ 現在のミノの種類 + ホールドミノの種類 + ネクストミノの種類(3個)の計 13 個を入力として持っていることになるので Input(13) になります。(記事の方は修正しておきました。ご指摘ありがとうございます。)

なお今回用いている特徴量に関するプログラムは以下の部分になります。

https://github.com/seihirochi/tetris-project/blob/7d8f41fc101e8d57667e30f4fe4e4c0da22d13ad/src/tetris_gym/tetris/tetris.py#L139-L160

今後 AI の改良があった場合、現在のリポジトリとここの記事に書かれている特徴量やモデルに差異が出る事があると思うので、記事は参考程度で見て頂けると幸いです!



chatGPTに聞いたところinputDataのほかにもtargetDataというエージェントが達成しようとする目標や、望ましい行動の情報が不足していると言われました。このデータについてthroughさんのtetris-projectのコードを確認したのですが、私の勉強不足でどこにそのデータが入っているのかが分かりませんでした。テトリスのラインを消した数などが入るという認識で合っているのでしょうか?

認識が違うような気がします。

ここでいう「targetData」は、おそらく「実際にテトリスを動かして得られたデータ」の事を言っているのかなと思います。今回のプログラムで言うと以下の部分になります。
https://github.com/seihirochi/tetris-project/blob/7d8f41fc101e8d57667e30f4fe4e4c0da22d13ad/src/tetris_project/nn/NN.py#L210-L224

また「望ましい行動」というのは、下記の get_action 関数のことを言っているのではないかと思います。これは今の盤面からどういった行動をすべきかを返す関数になっています。これは本番フェーズと学習フェーズで異なります。

本番フェーズの get_action 関数は Greedy 法 という「常にNN が推測する最高の行動を選択する」手法になります。プログラムは以下に該当します。

https://github.com/seihirochi/tetris-project/blob/7d8f41fc101e8d57667e30f4fe4e4c0da22d13ad/src/tetris_project/nn/NN.py#L271-L297

一方、学習フェーズの get_action 関数は ε-Greedy 法 という「一定の確率でランダムで動いて、それ以外の確率で今の NN が推測する最高の行動を選択する」手法になります。プログラムは以下に該当します。

https://github.com/seihirochi/tetris-project/blob/7d8f41fc101e8d57667e30f4fe4e4c0da22d13ad/src/tetris_project/nn/NN.py#L113-L143

今回の NN を大まかに説明すると、

  1. train関数の内部 にてテトリスを動かして、実際の盤面・即時報酬等のデータを収集
  2. learn関数 にて、過去に収集されたデータからランダムでサンプリング
  3. NN の推測値がサンプリングした実データに近づくようにTD誤差を用いてモデルに反映

という感じになります。

よって、本来 NN があるべき姿として必要になるのが「targetData」であり、またシミュレーションを遂行するうえで必要になるのが「望ましい行動」であるという認識が正しいと思います。