マイノート

いろいろ勉強したことをまとめていきます

MENU

【keras】keras-rlでcartpole問題

目的

  • keras-rlを試したい

背景

keras-rlとは

kerasを用いて、deep q networkが実装されているossです。

ただ、ここ最近は更新されていないようです。

install方法

pip install h5py
pip install keras-rl
注意点

kerasの2.0に対応していないようです!
なので、kerasのバージョン1.2.0をインストールして使ってみます。

pip install keras==1.2.0

OpenAI Gym

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

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

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

pip install gym

cartpoleとは

名前の通り、cartに上にpoleがあって、
poleが倒れないように、うまくcartをコントロールする問題です。

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

以下のサイトが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

徐々に累計報酬は上昇しているように見えます。
ただ、もちろん試行錯誤しながら、学習しているので、突然報酬が減少したりもしてます。
これは、探査を行ったためだと考えられます。