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

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

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

#1ではサンプルコードの実行とObservationまでを取り扱いましたので、#2ではアルゴリズムに簡単な手を入れながらCartPole問題の実装を読み解いていければと思います。
以下、目次になります。

1. #1の復習&補足
2. アルゴリズムを修正しながら把握するCartPoleの実装の詳細
3. まとめ


1. #1の復習&補足
#1では下記のようにCartPoleの実行を行いました。

f:id:lib-arts:20190517153658p:plain
上記はCartPole問題を10回実施し、それぞれエージェント(agent)がランダムに行動(action)を行った結果、何ステップ先までPoleが倒れなかったかを出力しています。ランダムの行動だと大体中央値が15~20あたりにきそうだというのが上記の結果からぼんやりと読み取れます。

f:id:lib-arts:20190517155514p:plain
また、上記はOpenAI Gymの実装であるenvironmentsの仕様になります。
とはいえドキュメントには具体的な問題に関しての記載がないので、下記のリポジトリWikiを確認することで具体的な仕様を確認することができます。

CartPole v0 · openai/gym Wiki · GitHub
どれも重要な情報かつ、最初のイメージを掴むにあたって全体の情報がある方が良いので、Environment以下の説明を以下にそのままキャプチャを貼ります。

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

f:id:lib-arts:20190517181948p:plain
上記を確認することで、CartPoleのenvironmentの仕様を把握することができます。まず、Observationに関してですが、Poleが倒れるか倒れないかにあたって特に重要なのが2のPole Angleです。右に傾いているか左に傾いているかの情報を保持しています。次にenv.stepに引数として渡すActionsですが、0が"Push cart to the left"ということでCartを左に押す動作、1が"Push cart to the right"ということでCartを右に押す動作のことを表しています。これらについて理解しておくだけで、傾きの逆に動くというアルゴリズムでもそれなりにいけそうというのも直感的にわかります。
次にRewardについては、全てのステップにおいて1を得ると書かれています。すなわちPoleが倒れないでいればいるほど報酬が得られるという仕組みになっています。最後にEpisode Terminationですが、(1)Poleの角度が±12°を超えた場合、(2)Poleの位置が±2.4を超えた場合、(3)Episodeの長さが200を超えた場合の三点がまとめられています。ランダム行動をしていた際のステップの中央値が大体15~20ほどのようなので、それがどのくらい長くなるかというのがここでの懸案事項です。

上記で#1の復習に加え、CartPoleの仕様に関しては一通り把握できたと思うので、2節ではこれを踏まえてアルゴリズムを簡単にカスタマイズすることでどのくらいの継続時間になるのかについて確認できればと思います。


2. アルゴリズムを修正しながら把握するCartPoleの実装の詳細
1節での前回の復習と補足を通してCartPole問題に関する大枠についてはわかったと思うので、2節ではそれを踏まえて実験を行いながら仕様について把握していければと思います。まずは下記を実行してみてください。

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

実行結果は下記のようになり中央値は大体40~45あたりにきそうだというのがこれを見て推測できます。

f:id:lib-arts:20190517182829p:plain
この結果より言えることとしては、傾きの情報を用いてCartの動作を変えるだけでもPoleが立っている時間を伸ばすことができるということです。この話には強化学習は出てきていませんが、このような行動方針を経験から学習することが強化学習の目的である以上、先にある程度直感的に考察しておくことには意味があると思います。

さて、CartPole問題については大体上記で把握できたかと思いますが、今後OpenAI Gymを他の問題でも使いこなしていくにあたって単純な問題でもう少し考察しておく方が望ましいので上記よりもアルゴリズムをよくする方法について試行錯誤してみましょう。

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

f:id:lib-arts:20190517191906p:plain
終了時に近いタイミングでのObservationを上記にキャプチャしてみましたが、ここから読み取れる傾向としては、まず角度の条件がオーバーすることで終了しているというのが読み取れます。

gym/cartpole.py at master · openai/gym · GitHub
終了時の条件に関しては上記に実装があります。

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

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

f:id:lib-arts:20190517192019p:plain
上記より角度に関しては0.2094...あたりが終了条件になっているというのがわかります。
角度の逆に動いているはずなのになぜ40ステップ程度で終了条件になってしまっているのかについてですが、速度に注目することでこれがわかります。倒れる前の数ステップにおいて、速度が極大(絶対値が1.5近くに)なるという現象が起きています。このことにより、逆方向に動かしても間に合わない状況になっていることが考察できます。これを踏まえた上で、下記のようにアルゴリズムを書き直してみました。

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

実行結果は下記のようになります。

f:id:lib-arts:20190517193022p:plain
追加した処理としては速度の絶対値が0.7を超えた際に逆向きに動くという補正を入れています。これを確認することで、速度の絶対値に着目して補正をかけるだけで大幅なアルゴリズムの改善が可能になっているとわかります。


3. まとめ
#2ではCartPoleにおけるenvironmentの詳細の読解とアルゴリズムの試行錯誤を通して考察を行いました。
#1、#2でCartPole問題については一通り把握できたので、#3以降ではOpenAI Gymのその他のEnvironmentsについて確認していければと思います。