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 マルチボディシミュレータ、ロボティクス制御などの分野で検証済みのコードを確認できます。