暇さえあればアルゴリズムいじり

暇があればアルゴリズムいじり

Obsessed with algorithms whenever I have a free moment.

AI & IT Engineer / Father of 3

"Dream shall be realized with dream — Always tinkering with algorithms"

協調学習の例題問題の環境をコツと合わせて解説

今日は先日扱った協調学習について、問題の定義、環境コードを実装してみました。

環境実装のコツと合わせて説明します。

協調学習の例題

強調学習の練習を行うために以下のような問題を考えてみました。

協調的な例題:フォークリフトによる倉庫管理 (Multi-Robot Warehouse)

この例題は、複数のエージェントが共通の資源を管理し、衝突を避けながらタスクを効率的に処理する、協調的なMARLの基本を学ぶのに非常に適しています。

倉庫配送タスクの設定概要

項目 詳細内容
環境 倉庫のグリッドマップ(ピックアップ地点 & ドロップオフ地点)
エージェント 2台以上のフォークリフトロボット
行動(アクション) 上・下・左・右への移動、待機、ピックアップ、ドロップオフ
目標 全注文の最短時間完了(総合報酬の最大化)

実装するコツ

この例題でMARLを学ぶ上で重要なポイントは以下の2点です。

1. 経路の競合と衝突回避 (Collision Avoidance)

ロボットは同じ通路や交差点を使用するため、衝突が発生する可能性があります。 学習目標は、単に最短経路を選ぶだけでなく、他のロボットの動きを予測し、衝突を避けるために一時的に待機したり、迂回したりする協調的な行動を学習することです。

2. タスクの割り当てと負荷分散 (Task Allocation)

複数の注文が発生した場合、どのロボットがどの注文をピックアップするのが最も効率的か( 誰がどこへ行くか )を決定する必要があります。 単一エージェントではこの決定は不要ですが、MARLでは、他のエージェントの現在の位置やタスク状況を考慮して、最適な割り当て戦略を学習することが、全体効率(総合報酬)を最大化する鍵となります。 環境コード

環境の実装

強化学習のコードはまず環境コードをつくることから始まります。

環境つくるコツ

コツはやはりあります。 著者が考える重要なコツをまとめます。

1. 観測空間(Observation)の「情報の絞り込み」

AIに何を見せるか(State)は、多すぎても少なすぎてもいけません。

  • 完全な情報の罠: 全ての座標や速度をそのまま渡すと、AIは情報の海で溺れます。「自分とターゲットの相対距離」や「壁までの距離」など、行動の判断に直結する特徴量に加工して渡す(特徴量エンジニアリング)のがコツです。
  • 部分観測性(POMDP)の考慮: 自分の背後が見えない設定なら、過去数ステップの情報をスタックして渡すことで、AIに「記憶」を持たせることができます。

2. 報酬関数(Reward)の「段階的設計」

AIは「ズル(報酬ハッキング)」の天才です。

  • 疎な報酬の回避: 「ゴールしたら+1」だけでは、偶然辿り着くまで何も学びません。ゴールに近づくごとに微小な報酬(シェイピング報酬)を与えます。
  • 生存ペナルティ: 1ステップごとに -0.01 などの微小なマイナスを与えると、「最短ルートでクリアしよう」という動機付けになります。
  • 正規化: 報酬の合計値が極端に大きく(例:100万)なったり小さくなったりしないよう、概ね -1.0 〜 1.0 の範囲に収まるようスケーリングするのが安定の秘訣です。

3. エピソードの「強制終了」と「リセット」

  • イムリミット: AIが無限に迷走しないよう、一定ステップ数(例:500歩)でエピソードを強制終了させます。
  • Doneフラグの扱い: 「壁に激突して終了」と「時間切れで終了」を区別してAIに伝える(TimeLimit.truncated)ことで、AIが「時間が来たら死ぬ」という誤解をするのを防げます。

4. シミュレーションの「軽量化」と「並列化」

強化学習は数百万回の試行が必要です。

  • 描画(Rendering)のオフ: 学習中はGUIを表示せず、計算のみを行う「Headlessモード」で回します。
  • Vectorized Environment: 1つではなく、同時に16個、32個の環境を並列で動かすことで、学習時間を劇的に短縮できます(Gymnasiumの SyncVectorEnv など)。

5. 難易度の「スケーリング(カリキュラム学習)」

いきなりフルセットの環境で学習させないのがコツです。

  • 最初はターゲットを目の前に置き、成功したら少しずつ遠ざける。
  • 最初は敵を動かさず、慣れてきたら動かし始める。 この「徐々に難しくする」仕組みをコードに組み込んでおくと、学習が停滞しにくくなります。

実装コード

特別なライブラリを使わないということを念頭にリンク先に作ってみました。

Shinichi0713/Reinforce-Learning-Study: this is the codes which is in accordance with reinforcement-learning

動作させるとこんな感じになります。 エージェントはランダムな動作なので、意思を持った動作は未だできていません。 今後、強化学習のモデル構築、学習を進めていきます。

結論

今回は環境コードの作成、環境実装のコツを説明しました。 学習は自動ですが、エージェントが経験学習する環境はノウハウそのものです。 今回の記事、是非ご参考下さい。

※環境一度作ってからの作り直しは、正直日常茶飯事です。強化学習を扱う場合、根気を持って進めて頂ければと思います。