OpenAI Gymの仕様を掴む①(CartPole_前編)|実装で理解する深層強化学習の研究トレンド #1

f:id:lib-arts:20190516231541p:plain

上記シリーズでDeep Q-Networkについて概要を把握できたので、より新しい話題も取り扱えればということで新しいシリーズをスタートさせます。内容としては、実装の内容を交えながら深層強化学習のトレンドを理解していくものとできればと思います。
#1では強化学習アルゴリズムの開発にあたってのToolkitであるOpenAI Gymの仕様を読み解いていければと思います。
以下、目次になります。

1. OpenAI Gymの概要とインストール
2. CartPole問題におけるenvironmentsの仕様の概要の把握
3. まとめ


1. OpenAI Gymの概要とインストール
強化学習アルゴリズムの開発にあたってまず把握しておくと良いのがOpenAI Gymです。アルゴリズムの開発にあたってまず必要なのが実際に取り組む問題やゲームの実装になります。が、これをゼロから開発するというのは実際のゲームのコアロジックを開発することと同様で、コストがそれなりにかかります。OpenAI Gymはそれを回避するためにenvironmentsというライブラリにゲームの環境の実装を行うことで、アルゴリズムの開発者が強化学習部分の開発のみに集中できるようにしてくれています。

f:id:lib-arts:20190517142647p:plain
上記が公式ドキュメント(https://gym.openai.com/docs/)のキャプチャになりますが、以下簡単に要約&補足を行います。『Gymは強化学習アルゴリズムの開発や比較を行うプラットフォームで、Atariのゲームなどの)検証用の問題を集めたライブラリ。environmentsというゲームを実施する環境を提供し、アルゴリズムの開発者がagent側の学習のみに意識を向けられるようにするための機能を提供してくれる』と捉えておくと良いです。
以前の強化学習フォローアップシリーズでまとめたように、強化学習は観測した状況に対してのエージェントの決断に関しての問題設定であり(MDP)、環境(environments)は提供されたものを使用し、エージェントの学習のみに開発者が注意を向けられるようにしてくれています。

具体的なenvironmentsの仕様などについては2節で扱うとして、1節ではOpenAI Gymのインストールについてまとめます。

f:id:lib-arts:20190517144245p:plain
インストールについては上記公式ドキュメントにもあるように、"pip install gym"を実行することでインストールすることができます。
ちなみにこちらの機能だけだとCartPoleなどのベースの問題についてのみしか入らないため、たとえばAtariのゲームについても同様にインストールしたい場合は"pip install gym[atari]"のように実行してやることでインストールすることが可能です。
分けている意図として容量の問題もあると思うので、当シリーズでは必要になったタイミングで個別の問題に関してのインストールを行う形とできればと思います。一旦"pip install gym"を実行したという前提の下で話を進めていきます。


2. CartPole問題におけるenvironmentsの仕様の概要の把握
2節では公式ドキュメント(https://gym.openai.com/docs/)のトップページに例として用いられている"CartPole-v0"environmentを題材に解説を行なっていきます。CartPoleは棒(Pole)を倒立させ続けるようにCartを動かしてバランスを取る問題です。説明が並ぶと逆にわかりづらいので、まず下記のサンプルコードを動かすところから話を始めます。下記はドキュメントのコードを元に解説用に少々改変を行ったものです。

import gym
env = gym.make('CartPole-v0')
for i in range(10):
    observation = env.reset()
    for t in range(1000):
        #env.render()
        observation, reward, done, info = env.step(env.action_space.sample())
        if done:
            print("Episode{} finished after {} timesteps".format(i, t+1))
            break
env.close()

上記を動かすことで10回のCartPoleの動作実験を行うことができます。ここでenv.render()をコメントアウトしている理由としては、アニメーションが実行されると動作が重くなってしまうため何度も実行するには適当でないためです。env.render()を有効にすることで、アニメーションを確認することができますので動かしたいときは有効にしてみてください。
コードの実行結果は下記になります。

f:id:lib-arts:20190517153658p:plain

上記を実行することで、10回の実行結果においてそれぞれ何ステップ(ステップは単位時間だと考えれば良いです)倒立していたかを確認することができます。今回はアクションとしてはランダムに動かしているのですが、ランダムに動かす形だと15~20ステップに大体平均の値が来そうだということが推測できます。

上記で全体の動作確認はできましたので、実装の中身について読み込んでいきます。まず把握すると良いのが"env.step"です。

f:id:lib-arts:20190517155455p:plain
"env.step"は上記を1サイクル回すことで、1ステップ先の状況を得ることを意味しています。ここで"env.step"に引数として与えているのがエージェント(agent)の行動(action)になります。今回の例ではまだ行動自体はランダムですが、この行動を強化学習によって最適化していくことが大枠における目的に繋がってきます。
学習に話を進める前に"env.step"の仕様を確認する方が良いと思われるので、先に戻り値であるobservation,reward,done,infoの4つの値について解説します。

f:id:lib-arts:20190517155514p:plain
それぞれ仕様を確認すると上記のようになっています。上記を確認することで、observationが盤面(situation)の情報、rewardが報酬の情報を持っていることがわかります。

f:id:lib-arts:20190517160016p:plain

CartPole v0 · openai/gym Wiki · GitHub
上記を確認することで、CartPoleにおけるObservationの仕様を把握することができます。


3. まとめ
#1ではOpenAI Gymの概要とインストール、CartPole-v0を元にしたサンプルコードの動作確認を行いました。
大体の概要がつかめて来たのでCartPole-v0を題材にした詳細のコードの把握に関しては#2でまとめられればと思います。