【入門強化学習】とりあえず動かしてみる強化学習
はじめに
こちらの記事はQiitaで投稿した「【入門強化学習】とりあえず動かしてみる強化学習」の再投稿になります。
強化学習ついて、なんとなくのイメージしかなかったため、とりあえず実際に動かしてみました。 今回は、OpenAI Gymというツール上で強化学習アルゴリズムを動かしています。
とりあえず動かしてみるだけなので、強化学習アルゴリズムの詳しい説明はしていません。
対象読者
- 強化学習を実際に動かしてみたい
強化学習とは
強化学習とは、ある環境下で試行錯誤しながら報酬を最大化するための行動を学習していく仕組みです。 ディープラーニングの登場によりできることが増え、有名なAlphaGoでも強化学習が使われています。
OpenAI Gymとは
OpenAI Gymは、強化学習アルゴリズムを開発/比較するためのツールとなります。 棒立てや車での山登り、スペースインベーダーなど様々な環境で強化学習アルゴリズムを試すことが出来ます。
参考:Gymで使える環境一覧
動かしてみる
とりあえず、gymを動かしてみます。 ここでは棒立ての環境で動かします。
アクション(棒が立っている場所を左右どちらに動かすか)はランダムに決定します。
1import gym
2
3# 環境の生成
4env = gym.make('CartPole-v0')
5
6for i_episode in range(20):
7 # 環境を初期化してobsersavationを取得
8 observation = env.reset()
9 for t in range(100):
10 env.render()
11 print(observation)
12 # アクションの決定(ランダム)
13 action = env.action_space.sample()
14 # アクション後のデータを取得
15 observation, reward, done, info = env.step(action)
16 if done:
17 print("Episode finished after {} timesteps".format(t+1))
18 break
19env.close()
アクションをランダムに決定しているので、すぐに倒れてしまいます。
強化学習で動かす
次に、強化学習アルゴリズムを使って、アクションを選択するようにします。 今回は、DQN(Deep Q-Learning)というアルゴリズムを使って学習させます。
使用するライブラリ
強化学習ライブラリにはkeras-rlを使います。 ただし、tensorflow 2から統合されたKerasを使っている場合は、keras-rl2を使う必要があることに注意してください。
今回使うライブラリのバージョンは下記の通りになります。
1keras-rl2==1.0.4
2tensorflow==2.3.0
DQNで学習
それでは実際にDQNを用いて学習させていきます。
棒立てが終了するまでが1エピソードに、棒を立てている場所を左右どちらかに動かす1アクションが1ステップに相当します。 ここでは50000ステップまで学習させます。
1import gym
2from tensorflow.keras.models import Sequential
3from tensorflow.keras.layers import Dense, Activation, Flatten
4from tensorflow.keras.optimizers import Adam
5from rl.agents.dqn import DQNAgent
6from rl.policy import BoltzmannQPolicy
7from rl.memory import SequentialMemory
8
9# 環境の生成
10env = gym.make('CartPole-v0')
11nb_actions = env.action_space.n
12
13# モデルの定義
14model = Sequential()
15model.add(Flatten(input_shape=(1,) + env.observation_space.shape))
16model.add(Dense(16))
17model.add(Activation('relu'))
18model.add(Dense(16))
19model.add(Activation('relu'))
20model.add(Dense(16))
21model.add(Activation('relu'))
22model.add(Dense(nb_actions))
23model.add(Activation('linear'))
24
25# エージェントの設定
26memory = SequentialMemory(limit=50000, window_length=1)
27policy = BoltzmannQPolicy()
28dqn = DQNAgent(model=model, nb_actions=nb_actions, memory=memory, nb_steps_warmup=10,
29 target_model_update=1e-2, policy=policy)
30dqn.compile(Adam(lr=1e-3), metrics=['mae'])
31
32# 学習
33dqn.fit(env, nb_steps=50000, visualize=True, verbose=2)
34
35# モデルをテスト
36dqn.test(env, nb_episodes=5, visualize=True)
64エピソード学習後...
216エピソード学習後...
学習済みモデルでテスト
50000ステップ学習させた結果、以下のように安定して棒を立てられるようになりました。
kaggleのコンペ
機械学習コンペのプラットフォームであるkaggleでも、強化学習で学習させたモデル同士を戦わせて競い合うコンペがありました。
こちらのコンペは、Connect Fourと呼ばれる4目並べにおいて、学習させたエージェント同士を戦わせてレートを決め、順位を決める形式になっております。 自分が作ったエージェントを戦わせるのが結構面白いので、ぜひ挑戦してみてください。
kaggle内にもConnect Xのコンペを通して、ゲームAIと強化学習を学べるレクチャーもあるため、こちらから挑戦するのもいいと思います。 Learn Intro to Game AI and Reinforcement Learning Tutorials | Kaggle
まとめ
- とりあえず強化学習のアルゴリズムを動かすことができた
- 他の環境でも試してみたい
今後はしっかり中身のアルゴリズムを理解したいと思います。
参照
- OpenAI
- Gym
- openai/gym
- wau/keras-rl2
- 強化学習システムの設計指針
- Connect X | Kaggle
- Learn Intro to Game AI and Reinforcement Learning Tutorials | Kaggle