■ はじめに

前回はブロック崩しを題材に、カリキュラム学習+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の課題をひとつずつクリアしていくのが、やっぱり楽しいですね。
次はどんな課題に挑戦しようかな?