Terrarium

いわゆる掃き溜めの ありふれた有象無象

OpenAI Gym を動かしてみた

OpenAI Gym

OpenAI Gymとは,公式サイトにも"A toolkit for developing and comparing reinforcement learning algorithms.“とあるように,主に強化学習を開発,比較検討するのに使える環境が集まったサイトです.

gym.openai.com

まずは,チュートリアルを進めてみます.以下のサイトが公式のドキュメントになっています.

https://gym.openai.com/docs

上のサイトに従っていけばできますが,一応作業履歴ということでここに書いておきます. こちらのバージョンはPython3.5,anaconda3-4.0.0環境を使っています.

1. OpenGym AIのインストー

pip install gym が一番簡単でした.

2. 環境を動かしてみる

import gym

env = gym.make('CartPole-v0')

for episode in range(20):
    observation = env.reset()
    for t in range(100):
        env.render()
        print(observation)
        action = env.action_space.sample()
        observation, reward, done, info = env.step(action)
        if done:
            print("finished after {} timestamps".format(t+1))
            break

を実行すると,倒立振子が出てきて,20エピソード分実行され,描画されます.

3. Q学習で強化学習してみる

ここからは上のページにない内容ですが,せっかくなので強化学習を試してみます.

https://gym.openai.com/algorithms/alg_0eUHoAktRVWWM7ZoDBWQ9w

上に,どなたかが実装してくださったQ学習のコードが載っています. これをコピペして,Python3用に一部修正し(xrangeやprint)実行します. (私の環境ではenv.monitorがうまく動かなかったので(きちんと調査してはいませんが)env.monitor周りはコメントアウトして,その代わりに毎ループでenv.render()を実行しました.これにより倒立振子が学習されている様子を知ることができます)

うまく動くと,徐々にうまくなっていくことが確認できます.

4. 少し変更

先ほどコピペしたコードを,次を目標に一部変更します.

  • 毎回の学習の様子をみる必要はないので,何回かに1回のみにする
  • 学習の結果をみるテストメソッドを追加する(学習は行われず,greedyに行われる)

これを追加したコードが次になります.

gist.github.com

まとめ

気づいた点をまとめておきます.

  • CartPole-v0は200フレームで強制的にdoneになる(うまくいっても行かなくても)
    • それ以上経ってからはactionの指示が効かない
  • 連続空間でもQ学習は有効であることがわかった
    • 連続空間では状態数が多くなりがちなので,離散化が粗すぎても細かすぎても適していないイメージだったが,すんなりと学習できた(学習タスクにもよると考えられる)

今回はせっかくQ学習までやったので,次回は流行りのDQNを試してみたいと思います(と書いていますが実はもう試してあるのでそれをまとめる時間があれば…)

それと

今後,自身がどんなことをやっているきたかの日記としての活用を考えていて,新規性のないやってみたレポートが増えそうな気がしています. 新規性がありそうなものはQiitaにもアップしたいと思っています(がそんなに新規性のある記事がポンポン浮かぶわけでもない)