PFRL を用いた深層強化学習の開発実践:PyTorch と CartPole 環境によるエージェント構築ガイド

PFRL フレームワーク概要

PFRL は、強力な勾配計算機能を持つ PyTorch を基盤としたオープンソースのディープラーニング強化学習ツールキットです。開発者に対して直感的な API と多様なアルゴリズム実装を提供し、強化学習モデルの設計・評価プロセスを効率化します。技術的な制約が少なく、研究から実運用まで幅広く対応可能な設計となっています。

主な特徴としては以下のようなものが挙げられます:

  • 多彩な学習手法の実装:DQN、PPO、SAC、A3C など、現在主流となっているアプローチが含まれています。
  • ハードウェアアクセラレーション:GPU や TPU への自動対応により、高速なトレーニングを実現します。
  • モジュール性の高い設計:構成要素を組み合わせやすく、カスタム環境への適用が可能です。
  • 充実した資料群:詳細なドキュメントおよび利用事例が整備されています。

環境構築とセットアップ

PFRL を利用するには、基本的には pip パッケージマネージャによる導入が推奨されます。必要なバージョン要件を満たすことを前提に、以下の手順に従って進めてください。

標準インストール(推奨)

pip install pfrl

ソースコードからのビルド

最新の機能を開発者向けに利用したい場合や、特定の修正を加える場合は GitHub リポジトリから取得します。

git clone https://github.com/pfnet/pfrl
cd pfrl
python setup.py install

なお、本プロジェクトでは Python 3.8 以降の利用を想定しており、必要な追加パッケージはリポジトリ内に定義された設定ファイルに記載されています。

最初のエージェント実装:倒立棒バランス問題

ここからは、最も基本的な検証タスクである CartPole タスクを用いて、学習済みエージェントを作成するフローを追います。この例では Double DQN アルゴリズムを採用します。

ライブラリの読み込み

まず、必須となるモジュールをインポートします。NumPy 等の数値演算ライブラリも使用します。

import gym
import numpy as np
import torch
import torch.nn.functional as F
from pfrl import agents
from pfrl.agents import DoubleDQN
from pfrl.explorers import LinearDecayEpsilonGreedy
from pfrl.replay_buffers import ReplayBuffer

シミュレーション環境の生成

OpenAI Gym から対象のタスクを読み込みます。CartPole-v1 は、車の上に立つ棒の角度と速度などを観測し、左右への操作で平衡を保つタスクです。

simulation_env = gym.make('CartPole-v1')
print(f'状態空間サイズ:{simulation_env.observation_space.shape[0]}')
print(f'動作空間カテゴリ数:{simulation_env.action_space.n}')

価値関数(Q 関数)の定義

入力状態を受け取り、各動作の期待累積報酬を出力するネットワークを定義します。ここでは全結合レイヤーを 3 段構成に変更しました。

class ValueNetwork(torch.nn.Module):
    def __init__(self, state_dim, num_actions):
        super().__init__()
        self.fc1 = torch.nn.Linear(state_dim, 128)
        self.fc2 = torch.nn.Linear(128, 128)
        self.fc3 = torch.nn.Linear(128, num_actions)

    def forward(self, input_state):
        h = F.relu(self.fc1(input_state))
        h = F.relu(self.fc2(h))
        return self.fc3(h)

# 状態次元と動作数の初期化
dim_state = simulation_env.observation_space.shape[0]
count_action = simulation_env.action_space.n
q_network = ValueNetwork(dim_state, count_action)

学習制御の設定

オプティマイザ、割引率、探索戦略、経験再生メモリなどのパラメータを設定してエージェントインスタンスを生成します。

# オプティマイザ設定
lr_scheduler = torch.optim.Adam(q_network.parameters(), lr=1e-3)

# 割引因子
gamma_value = 0.99

# ε-グリーディ探索(線形減衰)
explore_strategy = LinearDecayEpsilonGreedy(
    total_steps=10**6,
    start_epsilon=1.0,
    end_epsilon=0.01,
    decay_steps=500000
)

# 経験バッファ
memory_pool = ReplayBuffer(capacity=10**6)

# 観測変換関数
feature_extractor = lambda obs: np.asarray(obs, dtype=np.float32)

# ドブル DQN エージェントの作成
learner_agent = DoubleDQN(
    q_func=q_network,
    optimizer=lr_scheduler,
    replay_buffer=memory_pool,
    gamma=gamma_value,
    explorer=explore_strategy,
    replay_start_size=1000,
    target_update_interval=100,
    phi=feature_extractor,
    gpu=-1,
)

トレーニングループの実行

指定されたエピソード数分だけ試行し、学習させます。中間結果の確認も含まれます。

target_episodes = 500
step_threshold = 500

for step_counter in range(1, target_episodes + 1):
    state = simulation_env.reset()
    episode_reward_sum = 0
    
    while True:
        # 行動の選択
        action_select = learner_agent.step(state)
        
        # 環境への適用
        next_state, reward_val, done_status, info = simulation_env.step(action_select)
        
        episode_reward_sum += reward_val
        step_counter_local += 1
        
        # メモリに登録
        learner_agent.observe(next_state, reward_val, done_status, 
                              step_counter_local == step_threshold)
        
        # エピソード終了判定
        if done_status or step_counter_local == step_threshold:
            state = simulation_env.reset()
            print(f'Episode {step_counter}: Total Reward = {episode_reward_sum}')
            break

モデルの永続化

学習が完了したパラメータをファイルシステムに保存すれば、以後必要に応じてロード可能です。

# 保存処理
learner_agent.save('/tmp/trained_model_dir/')

# 復元処理(コメントアウトを外して使用)
# learner_agent.load('/tmp/trained_model_dir/')

高度な機能と拡張性

PFRL は単なる学習ループ以上の機能を備えています。複雑なタスクに対応するための各種コンポーネントが存在します。

アルゴリズム群の提供

パッケージディレクトリ内には多数の事前実装済みエージェントが格納されています。代表的なものに以下があります:

  • オフポリシー学習:DQN, Categorical DQN, A2C, PPO
  • 連続動作空間用:DDPG, TD3, SAC
  • actor-critic 系:TRPO, ACER

実験支援ユーティリティ

一般的な実験フローを簡略化するクラスも用意されています:

  • pfrl.experiments:訓練パイプラインの高レベルインターフェース
  • pfrl.wrappers:画像前処理やステータス正規化を行うラッパー
  • pfrl.replay_buffers:Prioritized Replay や SegTree などの特殊構造

サンプルケース集

具体的な適用例は公式リポジトリ内の Examples ディレクトリに含まれており、Atari ゲーム、MuJoCo マルチボディシミュレータ、ロボティクス制御などの分野で検証済みのコードを確認できます。

タグ: pf r l,pytorch deep reinforcement learning double dqn openai gym neural network

5月19日 12:14 投稿