■ はじめに
前回はブロック崩しを題材に、カリキュラム学習+PPOでなんとかクリアまで持っていくことができました。
ただ、正直なところ ChatGPTさんがPPOを提案してくれなかったら詰んでいた と思います。
そこで今回は、ChatGPTさんと相談しながら
レベルに合った次のステップ=「LunarLander(月面着陸)」
に挑戦してみました。
ChatGPTさんに応援されながら月面着陸を目指すプロンプト・ウサギ(イメージ)
■ やる前のひと工夫:仕様変更の確認
LunarLanderは昔から人気のある教材で、その分 仕様変更が多い です。
ChatGPTさんに相談したところ、まずは仕様が現在どうなっているかネットで調べてもらいました。
調べた結果:
1. Gym → Gymnasium に移行中
2. Box2D が別途必要(pip install gymnasium[box2d])
3. 風や乱流のある高難度版、研究用の多目的 Lander が存在
最初にここを押さえておくと、後のトラブルをだいぶ防げます。
やっておいてよかった事前調査でした。
■ まさかの結果:いきなり着陸できた!?
環境が動いたので、とりあえずPPOの デフォルト設定 で学習させてみました。
model = PPO("MlpPolicy", env, verbose=1)
たったこれだけ。でも結果は…
いきなり着陸成功。
もちろん「旗の枠の外」に着陸してしまいましたが、それでもデフォルトでここまでやってくれるとは驚きです。
旗の枠を外して着陸する動画
この時のソフト→Githubにリンク
● なぜデフォルトで着陸できる?
LunarLanderは状態が比較的シンプル(8次元)で、報酬も素直な構造なので、
PPO の標準ハイパーパラメータでも十分学習しやすい と言われています。
■ 改善:報酬を追加して「中央着陸」を狙う
ChatGPTさんに聞くと、こんな返答が返ってきました。
> 「LunarLanderには“中央に降りる”っていう報酬が無いんよ。」
なるほど…。
つまり“場所の正確さ”を評価する仕組みが無いから、旗の枠外でも平気で着陸してしまうわけです。
そこで、中央に寄るように 独自の報酬を追加 してみました。
■ 追加した報酬
① x 座標の距離に応じたペナルティ
中央(x=0)ほど良いようにします。
reward -= abs(state[0]) * 2.0
② 成功着地時の「ズレ量」に応じた追加ペナルティ
着地点の正確さを強調します。
if done and not crashed:
reward -= abs(state[0]) * 50
● なぜこれでうまく行くの?
LunarLanderは横方向(x軸)の制御がやや苦手
標準の報酬には「中央へ寄る」要素がない
そのため、x座標の誤差を明示的に評価すると挙動が劇的に改善する
小さな追加ですが、学習が“方向性を理解する”ようになります。
■ 結果:ちゃんと旗の間に着陸!
この報酬を追加すると、狙い通り 旗の枠内に着陸 できるようになりました。
旗の枠内に着陸する動画
報酬の調整が綺麗に作用した形です。
この時のソフト→Githubにリンク
■ 今回の学び
● LunarLanderは「報酬追加」の入門に向いている
もともとの報酬がシンプルなので、
新しい報酬を足しても邪魔になりにくい です。
初心者が試行錯誤しやすい良い教材ですね。
● PPOは本当に優秀
標準設定でここまでできるのは本当にすごい。
「まずPPOを試してみる」方向性はかなり強いと感じました。
■ まとめ
今回は LunarLander を PPO で学習させてみました。
デフォルト設定だけでも着陸可能
追加報酬で“中央着陸”まで狙える
PPO の強さを改めて実感
報酬設計の練習にも最適な教材
ゲームAIの課題をひとつずつクリアしていくのが、やっぱり楽しいですね。
次はどんな課題に挑戦しようかな?
