見出し画像

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.

テスト時は、実行画面が表示され、以下のようなログが表示されます。

画像1

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


この記事が気に入ったらサポートをしてみませんか?