見出し画像

Stable Baselines入門 / Stable Baselinesの概要

1. Stable Baselinesとは

Stable Baselines」は「OpenAI Baselines」をベースにした、強化学習アルゴリズムの実装セットの改良版です。

OpenAI Baselines」は、OpenAIが提供する強化学習アルゴリズムの実装セットです。これら学習アルゴリズムは正しく機能し、非常に役立つものでした。しかしこれをベースにカスタマイズして使う場合には、「コメントの欠如」「共通のコードスタイルなし」「多数重複」なソースコードのため、かなりの格闘が必要になりました。

そこで、「OpenAI Baselines」をフォークし、大規模なリファクタリングを行い使いやすくしたものが、「Stable Baselines」になります。

2. Stable Baselinesの特徴

「Stable Baselines」の「OpenAI Baselines」と比べた時の特徴は、次の通りです。

・全アルゴリズムの統一構造
・統一コードスタイル(PEP8準拠)
・文書化された関数とクラス
・より多くのテストとより多くのコードカバレッジ

3. Stable Baselinesの強化学習アルゴリズム

「Stable Baselines」は「OpenAI Baselines」と同様に、強化学習アルゴリズムとしてA2C、PPO、TRPO、DQN、ACKTR、ACERおよびDDPGをサポートします。

画像1

・Name:強化学習アルゴリズム名
・Refactored:リファクタリング済みかどうか
・Recurrent:リカレント(過去の記憶)な学習が可能かどうか
・Box:状態空間・行動空間としてBoxを利用可能かどうか。
・Discrete:状態空間・行動空間としてDiscreteを利用可能かどうか。
・Multi Processing:マルチプロセッシングで並列に学習できるかどうか

BoxとDiscreteは状態空間・行動空間の型です。
・Boxは範囲[low、high]の連続値。Float型の多次元配列。【例】[0.6, 0.2, 0.3]
・Discreteは範囲[0、n-1]の離散値。Int型の1次元配列。【例】[3]

4. Stable Baselinesのシステムパッケージのインストール

はじめに「Stable Baselines」の動作に必要なシステムパッケージをインストールします。

【macOS】

brew install cmake openmpi

【Ubuntu】

sudo apt-get update && sudo apt-get install cmake libopenmpi-dev python3-dev zlib1g-dev

5. Stable Baselinesのインストール

「Stable Baselines」にはPython 3.5以降がが必要です。Anacondaの仮想環境を作成し、stable-baselinesパッケージをインストールします。

pip install stable-baselines
pip install tensorflow==1.14.0
pip install pyqt5
pip install box2d box2d-kengz
pip install imageio

6. Sable Baselinesの学習

「Stable Baselines」では、PPOエージェントによる学習を、次のように簡潔に記述できます。「エージェント」(学習アルゴリズム)は、train()、predict()、save()、load()といった共通メソッドを利用できます。

import gym
from stable_baselines.bench import Monitor
from stable_baselines.common.policies import MlpPolicy
from stable_baselines.common.vec_env import DummyVecEnv
from stable_baselines import PPO2

# 環境の生成
env = gym.make('CartPole-v1')
env = DummyVecEnv([lambda: env])

# モデルの生成
model = PPO2(MlpPolicy, env, verbose=1)

# モデルの学習
model.learn(total_timesteps=10000)

# テスト
state = env.reset()
for i in range(200):
    env.render()
    action, _ = model.predict(state)
    state, reward, done, info = env.step(action)

◎ベクトル化環境
PPO2のように複数環境で訓練するアルゴリズムは、環境を「ベクトル化環境」に変換してから利用する必要があり、シングルプロセスで十分な場合はDummyVecEnvを使います。

・DummyVecEnv:シングルプロセスのベクトル化環境ラッパー
・SubprocVecEnv:マルチプロセスのベクトル化環境ラッパー

◎ポリシーネットワーク
エージェントの生成には、ポリシーと環境が必要です。Stable Baselinesでは以下のポリシーが用意されています。

・MlpPolicy:MLPを使用して、Actor-Criticを実装するポリシー
・MlpLstmPolicy:MLPとLSTMを使用して、Actor-Criticを実装するポリシー
・MlpLnLstmPolicy:MLPとlayer normalized LSTMを使用して、Actor-Criticを実装するポリシー
・CnnPolicy:CNNを使用して、Actor-Criticを実装するポリシー
・CnnLstmPolicy:CNNとLSTMを使用して、Actor-Cliticを実装するポリシー
・CnnLnLstmPolicy:CNNとlayer normalized LSTMを使用して、Actor-Criticを実装するポリシー

「CnnPolicies」はイメージ用で、「MlpPolicies」はそれ以外(ロボット関節など)用です。ポリシーをカスタマイズするには、パラメータ「policy_kwargs」を使います。より細かく制御する必要がある場合は、Custom Polikcyを生成することもできます。

実行すると次の画面とログが表示されます。

画像2

--------------------------------------
| approxkl           | 8.6919084e-05 |
| clipfrac           | 0.0           |
| explained_variance | -0.000483     |
| fps                | 443           |
| n_updates          | 1             |
| policy_entropy     | 0.6930789     |
| policy_loss        | -0.0024873326 |
| serial_timesteps   | 128           |
| time_elapsed       | 3.1e-06       |
| total_timesteps    | 128           |
| value_loss         | 54.57497      |
--------------------------------------
    :
---------------------------------------
| approxkl           | 2.5313466e-06  |
| clipfrac           | 0.0            |
| explained_variance | 0.0169         |
| fps                | 2044           |
| n_updates          | 78             |
| policy_entropy     | 0.585216       |
| policy_loss        | -0.00025959627 |
| serial_timesteps   | 9984           |
| time_elapsed       | 5.24           |
| total_timesteps    | 9984           |
| value_loss         | 68.08393       |
---------------------------------------

7. 平均報酬と平均エピソード長の表示

上記コードでも学習時のログがでますが、肝心の「平均報酬」(ep_reward_mean)と「平均エピソード長」(ep_len_mean)が表示されません。
「Monitor」を追加することで、表示されるようになります。

import gym
import os
from stable_baselines.bench import Monitor
from stable_baselines.common.policies import MlpPolicy
from stable_baselines.common.vec_env import DummyVecEnv
from stable_baselines import PPO2

# ログフォルダの生成
log_dir = './logs/'
os.makedirs(log_dir, exist_ok=True)

# 環境の生成
env = gym.make('CartPole-v1')
env = Monitor(env, log_dir, allow_early_resets=True)
env = DummyVecEnv([lambda: env])

# モデルの生成
model = PPO2(MlpPolicy, env, verbose=1)

# モデルの学習
model.learn(total_timesteps=10000)

# テスト
state = env.reset()
for i in range(200):
   env.render()
   action, _ = model.predict(state)
   state, reward, done, info = env.step(action)

ログは次の通りです。

--------------------------------------
| approxkl           | 0.00010607178 |
| clipfrac           | 0.0           |
| ep_len_mean        | 25.2          |
| ep_reward_mean     | 25.2          |
| explained_variance | -0.00763      |
| fps                | 438           |
| n_updates          | 1             |
| policy_entropy     | 0.6930357     |
| policy_loss        | -0.0031061308 |
| serial_timesteps   | 128           |
| time_elapsed       | 1.91e-06      |
| total_timesteps    | 128           |
| value_loss         | 42.66241      |
--------------------------------------
    :
---------------------------------------
| approxkl           | 3.9626757e-05  |
| clipfrac           | 0.0            |
| ep_len_mean        | 85.8           |
| ep_reward_mean     | 85.8           |
| explained_variance | 0.0234         |
| fps                | 1798           |
| n_updates          | 78             |
| policy_entropy     | 0.5740223      |
| policy_loss        | -0.00036769366 |
| serial_timesteps   | 9984           |
| time_elapsed       | 5.23           |
| total_timesteps    | 9984           |
| value_loss         | 68.69821       |
---------------------------------------


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