強化学習、マルチエージェント強化学習、その他機械学習全般

機械学習関連のことをまとめていきます。強化学習関連が多いかもしれません

【keras】【深層強化学習】keras-rlを試してみる

背景

keras-rlとは

kerasを用いて、Deep Q Learningを実装したライブラリです。
比較的容易にDeep Q Learningを試すことができます。

install方法

pip install numpy
pip install tensorflow
pip install keras
pip install keras-rl

OpenAI Gym

強化学習ベンチマーク問題を集めたOSSです。

keras-rlの強化学習エージェントに解かせる問題は、 OpenAI Gymのインターフェースに準じて作成する必要があります。

OpenAI Gymでのインストール方法

pip install gym

cartpole問題とは

台車の上にポールがあって、
そのポールが倒れないように、うまく台車を制御する問題です。

エージェントはステップ毎に状態(詳しくは参考サイトを参照)と報酬を受け取り、学習します。

以下のサイトのcartpoleについての説明がわかりやすいです。
http://qiita.com/namakemono/items/9b75d1c0c98916b396ba

実験

ソースコード(DQN)

keras-rlのexmplesに格納されているサンプルプログラムに
多少コメントを加えたものです。

import numpy as np
import gym

from keras.models import Sequential
from keras.layers import Dense, Activation, Flatten
from keras.optimizers import Adam

from rl.agents.dqn import DQNAgent
from rl.policy import BoltzmannQPolicy
from rl.memory import SequentialMemory


ENV_NAME = 'CartPole-v0'

env = gym.make(ENV_NAME)
np.random.seed(123)
env.seed(123)
nb_actions = env.action_space.n # アクション数

# モデルの定義
model = Sequential()
model.add(Flatten(input_shape=(1,) + env.observation_space.shape))
model.add(Dense(16))
model.add(Activation('relu'))
model.add(Dense(16))
model.add(Activation('relu'))
model.add(Dense(16))
model.add(Activation('relu'))
model.add(Dense(nb_actions))
model.add(Activation('linear'))
print(model.summary())

memory = SequentialMemory(limit=50000, window_length=1) # experience reply で用いるmemory
policy = BoltzmannQPolicy() # 行動選択手法の定義
dqn = DQNAgent(model=model, nb_actions=nb_actions, memory=memory, nb_steps_warmup=10,
               target_model_update=1e-2, policy=policy)
dqn.compile(Adam(lr=1e-3), metrics=['mae'])

history = dqn.fit(env, nb_steps=50000, visualize=True, verbose=2) # 学習。ここでnb_stepsは全エピソードのステップ数の合計が50000(だと思う)

dqn.save_weights('dqn_{}_weights.h5f'.format(ENV_NAME), overwrite=True)

dqn.test(env, nb_episodes=5, visualize=True)

実験結果

上記のソースコードをただ実行すると、以下のような結果をプロットします。 うまく学習できているようです。

省略

Testing for 5 episodes ...
Episode 1: reward: 200.000, steps: 200
Episode 2: reward: 200.000, steps: 200
Episode 3: reward: 200.000, steps: 200
Episode 4: reward: 200.000, steps: 200
Episode 5: reward: 200.000, steps: 200

エピソード毎の報酬の変化の推移

エピソード毎の報酬の変化の推移をプロットしてみました。(参考程度) f:id:ttt242242:20170905060828p:plain

徐々に累計報酬は上昇しているように見えます。