■ はじめに
前回は LunarLander(月面着陸)に挑戦して、PPO と報酬設計でなんとか“旗の枠内に着地”までこぎつけました。
そして今回、ChatGPT さんと相談して次のステップに選んだのが、MiniGrid(ドア無し) です。
「月面から、いよいよ迷路へ!」という感じでワクワクしながら挑戦開始!
■ まず最初の壁:環境トラブルとの戦い
MiniGrid の前に…まずは 環境構築でハマる!
これ、強化学習あるあるですね。
ここでは、私がガッツリつまずいたポイントをまとめます。
⚫ 1. 学習環境は壊れやすい(ほんまに)
ChatGPT さんはよく
「何回もインストールするの鬱陶しいやろ?」
と言って import だけで済ませようとするんですが…
MiniGrid はエラーが出ると簡単に環境が壊れます。
なので、面倒でも毎回これを実行リストに入れた方が安全。
!pip install gymnasium minigrid stable-baselines3 imageio
依存関係エラーが出ると MiniGrid が起動しなくなるので、“とにかく最新版セットを毎回入れ直す” が安心。
⚫ 2. MiniGrid のサイズは「決まったものだけ」
MiniGrid-Empty 系のマップは サイズの種類が決まってます。
MiniGrid-Empty-5x5-v0
MiniGrid-Empty-6x6-v0
MiniGrid-Empty-8x8-v0
MiniGrid-Empty-16x16-v1(←ここだけ v1)
7×7 とか 10×10 は存在しません。
……知らずに指定して、しっかりエラーをもらいました。(数字をいじると地味に爆発するタイプの罠)
⚫ 3. 学習が正しいかどうか判断するまで時間がかかる
MiniGrid(Empty-8x8)の PPO(CnnPolicy)で学習したとき、ChatGPT さんと何度も検証して、だいたいこんな感じの成長でした👇
20k ほぼランダムで迷子
50k 迷いながらも時々ゴール
100k ゴール率 50% 前後
200k ほぼ確実にゴール
300k+ ゴールへ一直線(完全に理解)
※ステップ数はエピソード数とは関係なし
(例:150k ステップで 約 750エピソード ぐらい)
CNN は画像から特徴を学ぶので、
「安定して物を理解するまでの助走期間」が長い のが特徴やね。
■ CNNってなに?MiniGridではどう使うの?
MiniGrid は画像ベースの環境なので、モデルは CnnPolicy を使います。
私のコードだと、指定はこれだけ。
model = PPO("CnnPolicy", env, verbose=1)
強化学習フレームワーク Stable-Baselines3 では
“どのニューラルネットを使うか” を名前で選ぶ仕組みになってます。
Policy 役割の意味
MlpPolicy 普通の全結合ニューラルネット
CnnPolicy 画像処理(MiniGridはこれ)
MultiInputPolicy 辞書型観測スペース用
CnnPolicy の中身(畳み込み層など)は ライブラリ内部に実装されていて、ユーザーが直接変更できません。指定するだけで勝手に働いてくれます。
ありがたいけど、「痒いところに手が届かへん」感じもあるやつ。
■ 結果:バグとエラーの向こうにゴールがあった!
最終的に、MiniGrid(ドア無し)はちゃんとゴールできました!
完成したコード→Githubにリンク
・100k だとゴール直前で止まる“惜しい挙動”も発生
・150k 以上だと安定してゴールに突っ込む
動画も撮影(ゴールへ一直線に走り込む動画)
やったーーーー!!🎉
■ 今回の学び
MiniGrid は想像以上に “環境構築の沼” が深い
CNN を使うと学習が安定するまで時間がかかる
でも PPO はやっぱり強い!(設定ほぼデフォルトでも動く)
「わかったつもり」だったバージョン管理の大切さを思いっきり痛感しました……。
■ まとめ
今回は MiniGrid(ドア無し)× PPO(CnnPolicy) に挑戦しました。
・ハマりポイントが多い
・でも学習は安定して強くなる
・報酬はデフォルトのままでも攻略可能
次は キーとドアありバージョン に挑戦したいところですが、ちょっと準備が必要そう……。
もう少し勉強してから、また ChatGPT さんと挑戦します!
