はじめに
ディープラーニング(DL)× 強化学習(RL)を迷路で動かすと、「だんだん賢くなる」様子が直感的に観察できます。
ただし、迷路の見え方を エージェント周辺の一部(局所観測) にすると話が変わります。
局所観測では、同じように見える場所がいくつも出てきます。
たとえば ループや T 字路 では、今見えている 5×5 の景色だけでは「どっちから来たのか」が分からず、
行動がふらついたり、同じところをぐるぐる回ったりしがちです。
そこで今回は、
Transformer が「過去の観測履歴」を統合することで、記憶のように振る舞う迷路デモ
を紹介します。
ざっくり言えば、
「今の見え方」だけでなく「直近の歩み」をまとめて見て、
次に何をするべきか(Q 値)を出す
という方針です。
ソースコード(GitHub)
実装全体はこちらで公開しています。
👉 GitHub
https://github.com/daiki3027/app-ai-grid-world/tree/grid-world-dl-tf-memory
デモ動画(YouTube)
実際の動作や学習の進み方はこちらの動画で確認できます。
🎥 YouTube
デモで見られること
このデモは FastAPI + WebSocket + Canvas で、学習の進み具合をブラウザ上でリアルタイムに確認できます。
- 迷路上でエージェントが動く(学習初期はかなり迷走)
- 学習が進むと、ループ/T 字路での無駄な往復が減る(「記憶が効く」)
- 画面上に次の学習指標がリアルタイムで更新される
episode:挑戦回数step:エピソード内ステップ数epsilon:どれだけランダム行動するかtotal_reward:累積報酬(※報酬整形込み)success_rate:直近エピソードの成功率last_loss/avg_recent_loss:直近の損失avg_episode_reward:直近エピソード報酬の平均
また、WebSocket メッセージで迷路モードを切り替えられます。
{"type": "maze_mode", "value": true}:ランダム迷路(デフォルト){"type": "maze_mode", "value": false}:固定迷路{"type": "maze_mode", "value": "memory"}:記憶が必要な迷路(ループ/T 字路)
「数値の変化」と「行動の変化」が同時に見えるのがポイントです。
どのようなルールで学習させているか
学習環境は 10×10 の GridWorld(盤面) です。
迷路には以下の要素が含まれます。
- 壁
- スタート
- ゴール
- 罠(到達すると失敗)
エージェントは毎ステップ、次の 4 つの行動 から1つを選択します。
- 上
- 下
- 左
- 右
用語整理
- 環境:迷路そのもの(ルールを持つ世界)
- エージェント:迷路内を動く学習主体
- ステップ:1 回の行動
- エピソード:スタートから終了までの1まとまり
報酬設計
基本の報酬は次の通りです。
| 状態 | 報酬 |
|---|---|
| 通常移動 | -0.01 |
| 壁に衝突 | -0.05 |
| ゴール到達 | +1.0 |
| 罠に到達 | -1.0 |
加えて、デフォルトでは ゴールまでの最短距離が縮むとわずかに加点 する「報酬整形(reward shaping)」も入っています。
これにより、学習初期でも「ゴールに近づく方向」がやや学びやすくなります。
1 エピソードは最大 200 ステップ。
ゴール到達・罠到達・タイムアウトのいずれかで終了します。
学習(記憶付き DQN)の流れをざっくり
このデモの中身は DQN(Deep Q-Network) をベースにしています。
違いは「状態」を 1 枚の観測として扱うのではなく、直近 N ステップの履歴 として扱うところです。
なぜ「記憶」が必要になるのか
入力は、エージェント中心の 5×5 観測パッチ(盤面の外は壁扱い)です。
局所観測なので、ループや T 字路では
「今どこにいるか」を 5×5 だけで判別できない(見た目が似ている)
という状況が起きます。
ここで必要になるのが 直前までの行動や報酬、過去の観測 です。
Transformer を「記憶」にするやり方
過去 N=16 ステップ 分について、次の情報を 1 ステップ = 1 トークンとしてまとめます。
- 5×5 観測パッチ(CNN で埋め込み)
- 「前回行動」(Embedding)
- 「前回報酬」(MLP)
それらを足し合わせたトークン列に Positional Encoding を加え、
Transformer Encoder で系列として統合します。
最後に「最後の有効トークン」から Q 値(4 行動分)を出し、
ε-greedy で行動を選びます。
学習の流れ
- 観測履歴(最大 16)を作る(足りない分はパディング)
- Transformer が履歴を統合し、4 行動分の Q 値を出力
- 行動選択(ε-greedy)
- 行動を実行し、報酬を得る
- 経験をリプレイバッファに保存(シーケンス単位)
- まとめて学習
内部は、
- Double DQN
- Huber 損失
- 勾配クリッピング
- ターゲットネット同期
といった「DQN の定番セット」を入れています。
おわりに
このデモは、強化学習を「迷路で動くもの」として眺めるだけでなく、
「記憶がないと解けない状況」をどう扱うか を体感するために作りました。
特に maze_mode = "memory" は、局所観測だと迷いやすい構造になっているので、
- 学習 OFF(ランダム行動)だとループしやすい
- 学習 ON だと、だんだんループを抜けてゴールに向かう
という差が見えやすいはずです。
Transformer が「過去の観測を参照して意思決定する」感覚を、まずは挙動から掴む入口になれば嬉しいです。


コメント