■ はじめに
前回は MiniGrid(ドアあり鍵あり)をなんとかクリアできました。
しかし、最後は、運で当たりを引いた感じで解いた感がありません。
原因は、CNNです。
イマイチよくわかりません。
別の課題で、もう少しCNNをやってみようと思いました。
ATARIのBreakoutを、CNNデータ(画像)で学習する方法があるらしいです。
これが、復習に良いのと思ったのですが
ChatGPT さんからストップが掛かりました。
曰く「Breakoutはレベル高いから復習には向かん。Cartpoleにしとき!」
とのこと、でもCartpoleは初めにやったしな。
あれをもう一度やっても復習になるとは思えんな…
「PixelデータでやるとCNNの復習になる。悪いこと言わんから、これにしとき!」
ChatGPTさんが、そこまで言うならやってみよう!
今回は、「Cartpole再び、画像データで学習!」という感じで復習します!
■ まず最初の壁:CNNの罠
いや〜今回も良くエラーにハマりました。
「環境から返ってきた画像が 400×600 なのに、84×84 の箱に無理やり入れようとして失敗した」
「学習用 env と評価用 env か同じ wrapper 構成になってない」
「SB3 公式で、動画とラッパは分離を推奨しているにも関わらず、何故か分離を忘れる」
等など、CNN周りのフルコースを食らいましたね。CNN以外は経験済みでよかった。
ChatGPTさん疑ってごめんよ。
■なんとかVer1.0出来ましたが…
CNNに振り回されながら、何とかできたVer1.0!
だけど200K学習しても、あんまり保持できない。
どこか悪いところがあるかな?
Ver1.0のコードはコチラ→GitHubにリンク
動画はこれ
ChatGPTさんに聞くと、CNN化して学習がむづかしくなるのは、むしろ当たり前だそうです。
あと僕のコードでは、棒の角速度・台車の速度を知ることができないから、フレーム・スタックを4つ積めというものでした。
■何で、4つなんでしょう?
速度を知りたければ2フレームで良いのでは?
不思議に思って、ChatGPTさんに聞いてみます。
ChatGPTさん回答抜粋:
⚫CNN関係理由:
CNNは本質的に、空間パターンは得意だけど、時間差分は苦手だから
2フレームだけだと、
ノイズ、1pxのズレ、レンダリング誤差
に 極端に弱い。
4フレームあると、
過去 ← [ fₜ₋₃, fₜ₋₂, fₜ₋₁, fₜ ] → 現在
→ 「傾き」「加速傾向」を空間パターンとして捉えられる
とのことで、これが重要だそうです。
⚫見え方の問題:
符号(±方向)が安定する
2フレームだと、
・右に倒れ始めたのか
・左に戻ってきている途中なのか
が 分かりづらい。
4フレームだと、
・倒れ始め
・加速中
・減速中
がはっきりわかる。
👉 制御が「ビクビク」しなくなります。
こっちの方がわかりやすいね。
■4フレーム・スタック版
コードはコチラ→Githubにリンク
学習結果の動画はコチラ
200Kの平均リワードの結果は、
20→ 30 → 40 → 50 → 80 → 120 → 200
↓ ↓
2フレーム 4フレーム
2フレームの学習
4フレームに軍配が上がってます。(と言っても、数値Cartpoleに負けます)
PixelCartPole は、数値CartPole に負けるのか?
それは、角度・角速度などをピクセルから、CNNで自力で抽出しているためです。
だから
> 「負けて当然」で今回の結果が正しい。
■ 結果:
CartpoleをCNN使って画像から解いてみました。CNN絡みのエラーを乗り越え、更に、速度の算出方法として、
4フレーム・スタック
という方法を学びました。
■ 今回の学び
今回CNNを復習する為に、Cartpoleを画像から解くという縛りゲーをしました。
Cartpoleて強化学習を勉強したてで、先ず初めにトライする課題じゃないですか?
それにこんな形でやる事になるとは、思ってもいませんでした。
強化学習には、まだまだ知らない扉がありそうですね。
■ まとめ
今回は PixelCartpoleと称して、Cartpoleを画像データだけで解く方法に挑戦してみました。
ChatGPTさんの力を借りてなんとかクリアしましたが、数値版Cartpoleに学習上は負けます。
あくまで、CNNの勉強と割り切ります。
さて、MiniGridへの逆襲ですが、ちょっと思い付いた事があって…
「これって、Slam使えば一撃なのでは?」
ChatGPT さんには、
「うん。それはもうMiniGridじゃないね」
と言われたけど、面白そうだからまあいいか。


