強化学習(DL:DQN+Transformer:記憶)迷路デモ

プログラミング

はじめに

ディープラーニング(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 で行動を選びます。

学習の流れ

  1. 観測履歴(最大 16)を作る(足りない分はパディング)
  2. Transformer が履歴を統合し、4 行動分の Q 値を出力
  3. 行動選択(ε-greedy)
  4. 行動を実行し、報酬を得る
  5. 経験をリプレイバッファに保存(シーケンス単位)
  6. まとめて学習

内部は、

  • Double DQN
  • Huber 損失
  • 勾配クリッピング
  • ターゲットネット同期

といった「DQN の定番セット」を入れています。


おわりに

このデモは、強化学習を「迷路で動くもの」として眺めるだけでなく、
「記憶がないと解けない状況」をどう扱うか を体感するために作りました。

特に maze_mode = "memory" は、局所観測だと迷いやすい構造になっているので、

  • 学習 OFF(ランダム行動)だとループしやすい
  • 学習 ON だと、だんだんループを抜けてゴールに向かう

という差が見えやすいはずです。

Transformer が「過去の観測を参照して意思決定する」感覚を、まずは挙動から掴む入口になれば嬉しいです。


コメント

タイトルとURLをコピーしました