![見出し画像](https://assets.st-note.com/production/uploads/images/31540422/rectangle_large_type_2_932c4a4805407bb38bd5a0d3d22fdea4.png?width=1200)
PFRL 入門
PyTorch向けの深層強化学習ライブラリ「PFRL」を試してみました。
1. PFRL
「PFRL」は、PyTorch向けの深層強化学習ライブラリです。
以下の強化学習アルゴリズムが提供されています。
・DQN (including DoubleDQN etc.)
・Categorical DQN
・Rainbow
・IQN
・DDPG
・A3C
・ACER
・PPO
・TRPO
・TD3
・SAC
情報リソースは次のとおり。
・クイックスタートガイド
・サンプル
・ドキュメント
2. インストール
「PFRL」をインストールするには、「Python 3.5.1以降」が必要です。「Anaconda」でインストールするコマンドは、次のとおりです。
$ conda create -n pfrl python=3.7
$ conda activate pfrl
$ pip install pfrl
3. ソースコードの作成
「OpenAI Gym」の環境「CartPole」を強化学習アルゴリズム「DoubleDQN」のエージェントで学習してテストします。
ソースコード「hello_pfrl.py」を作成して、以下のように編集します。
# パッケージのインポート
import pfrl
import torch
import torch.nn
import gym
import numpy
# 環境の生成
env = gym.make('CartPole-v0')
# Q関数の定義
obs_size = env.observation_space.low.size
n_actions = env.action_space.n
q_func = torch.nn.Sequential(
torch.nn.Linear(obs_size, 50),
torch.nn.ReLU(),
torch.nn.Linear(50, 50),
torch.nn.ReLU(),
torch.nn.Linear(50, n_actions),
pfrl.q_functions.DiscreteActionValueHead(),
)
# エージェントの生成
agent = pfrl.agents.DoubleDQN(
q_func, # Q関数
optimizer=torch.optim.Adam(q_func.parameters(), eps=1e-2), # オプティマイザ
replay_buffer=pfrl.replay_buffers.ReplayBuffer(capacity=10 ** 6), # リプレイバッファ
gamma=0.9, # 将来の報酬割引率
explorer=pfrl.explorers.ConstantEpsilonGreedy( # 探索(ε-greedy)
epsilon=0.3, random_action_func=env.action_space.sample),
replay_start_size=500, # リプレイ開始サイズ
update_interval=1, # 更新インターバル
target_update_interval=100, # ターゲット更新インターバル
phi=lambda x: x.astype(numpy.float32, copy=False), # 特徴抽出関数
gpu=-1, # GPUのデバイスID(-1:CPU)
)
# エージェントの学習
n_episodes = 300 # エピソード数
max_episode_len = 200 # 最大エピソード長
# エピソードの反復
for i in range(1, n_episodes + 1):
# 環境のリセット
obs = env.reset()
R = 0 # エピソード報酬
t = 0 # ステップ
# ステップの反復
while True:
# 環境の描画
# env.render()
# 行動の推論
action = agent.act(obs)
# 環境の1ステップ実行
obs, reward, done, _ = env.step(action)
R += reward
t += 1
reset = t == max_episode_len
agent.observe(obs, reward, done, reset)
# エピソード完了
if done or reset:
break
# ログ出力
if i % 10 == 0:
print('episode:', i, 'R:', R)
if i % 50 == 0:
print('statistics:', agent.get_statistics())
print('Finished.')
# エージェントのテスト
with agent.eval_mode():
# エピソードの反復
for i in range(10):
# 環境のリセット
obs = env.reset()
R = 0 # エピソード報酬
t = 0 # ステップ
# ステップの反復
while True:
# 環境の描画
env.render()
# 環境の1ステップ実行
action = agent.act(obs)
obs, r, done, _ = env.step(action)
R += r
t += 1
reset = t == 200
agent.observe(obs, r, done, reset)
# エピソード完了
if done or reset:
break
print('evaluation episode:', i, 'R:', R)
4. 学習とテストの実行
スクリプト「hello_pfrl.py」を実行。
$ python hello_pfrl.py
学習時は、以下のようなログが表示されます。
episode: 10 R: 31.0
episode: 20 R: 10.0
episode: 30 R: 11.0
episode: 40 R: 15.0
episode: 50 R: 9.0
statistics: [('average_q', 4.991711), ('average_loss', 0.1433834915049374), ('cumulative_steps', 1122), ('n_updates', 623), ('rlen', 1122)]
:
episode: 260 R: 200.0
episode: 270 R: 155.0
episode: 280 R: 200.0
episode: 290 R: 17.0
episode: 300 R: 200.0
statistics: [('average_q', 9.981709), ('average_loss', 0.05646402407175628), ('cumulative_steps', 33087), ('n_updates', 32588), ('rlen', 33087)]
Finished.
テスト時は、実行画面が表示され、以下のようなログが表示されます。
evaluation episode: 0 R: 200.0
evaluation episode: 1 R: 200.0
evaluation episode: 2 R: 200.0
evaluation episode: 3 R: 200.0
evaluation episode: 4 R: 200.0
evaluation episode: 5 R: 200.0
evaluation episode: 6 R: 200.0
evaluation episode: 7 R: 200.0
evaluation episode: 8 R: 198.0
evaluation episode: 9 R: 200.0
この記事が気に入ったらサポートをしてみませんか?