Posts Issued on February 27, 2025

Pongと強化学習 (85)

posted by sakurai on February 27, 2025 #955

環境構築であるmake_envについて質問してみます。


こちらのmake_env関数は、指定された環境IDを用いてOpenAI Gymの環境を生成し、その環境に様々なラッパー(wrappers)を適用することで強化学習の訓練を最適化するための設定を施します。この関数は特に、複数の環境を並列で動作させる際に役立ち、各環境のインスタンスを簡単に設定できるようにしています。各ステップを詳細に説明します。

関数の構造

  • 引数:

    • env_id: 環境のID(例: 'PongNoFrameskip-v4')。
    • seed: 環境の乱数シード。
    • idx: 環境のインデックス(通常は複数環境を同時に立ち上げる際に使用)。
    • capture_video: ビデオをキャプチャするかどうかのブール値。
    • run_name: ビデオファイルの保存先ディレクトリ名。
  • 内部関数 thunk: 実際に環境を設定するクロージャ関数。これを使う理由は、環境の生成を遅延させ、実際に必要な時に初めて生成させるためです(これをファクトリ関数とも呼びます)。

環境の生成と設定

  1. 基本の環境生成:

    • gym.make(env_id): 指定されたIDを持つ基本のGym環境を生成します。
    • render_mode="rgb_array": 環境がビデオをRGB配列としてレンダリングするように設定します(ビデオキャプチャが必要な場合)。
  2. ビデオの記録:

    • gym.wrappers.RecordVideo(env, f"videos/{run_name}"): エージェントのエピソードをビデオとして記録します。これはデバッグや学習の進捗を視覚的に確認するのに役立ちます。
  3. 統計の記録:

    • gym.wrappers.RecordEpisodeStatistics(env): エピソードごとの統計情報(報酬合計など)を記録します。
  4. 環境の修正:

    • NoopResetEnv(env, noop_max=30): エピソード開始時に最大30ステップの何もしない(No-Operation)アクションをランダムに実行して、環境の開始状態を多様化します。
    • MaxAndSkipEnv(env, skip=4): 4フレームごとにアクションを実行し、その間のフレームをスキップします。これにより、計算量を減らし、エージェントの反応速度を向上させます。
    • EpisodicLifeEnv(env): エージェントが一度失敗するとエピソードを終了させるのではなく、新しい「生命」で再開します。
  5. アクションの自動実行:

    • FireResetEnv(env): "FIRE" アクションが存在する場合、エピソード開始時に自動的にFIREアクションを実行し、ゲームを開始します。
  6. 報酬のクリッピングと観測の前処理:

    • ClipReward:Env(env): 報酬を[-1, 1]の範囲にクリッピングします。これにより学習プロセスを安定させます。
    • gym.wrappers.ResizeObservation(env, (84, 84)): 観測を84x84サイズにリサイズします。
    • gym.wrappers.GrayScaleObservation(env): 観測をグレースケールに変換します。
    • gym.wrappers.FrameStack(env, 4): 最新の4フレームの観測をスタックし、時系列的な情報をエージェントが利用できるようにします。
  7. アクションスペースのシード設定:

    • env.action_space.seed(seed): アクションスペースにシードを設定して、環境の再現性を保証します。

この関数は、特にディープラーニングベースの強化学習タスクで頻繁に使用され、エージェントのトレーニングプロセスを効率化し、そのパフォーマンスを向上させるための様々な技術が組み込まれています。


左矢前のブログ 次のブログ右矢