見出し画像

強化学習でバランスゲームを攻略! ステップとエピソードとは?

こんにちは!

ぷもんです。


前回、OpenAI Gymの強化学習はANACONDA NAVIGATOR→Jupyter Notebookでもできるのか?というnoteで
OpenAI GymがANACONDA NAVIGATOR→Jupyter Notebookで操作できそうだとわかったので
今回から本格的に強化学習をやっていきます。


今回はこちらのCartPole Balancingのコードを勉強します。

import gym
import numpy as np

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

goal_average_steps = 195
max_number_of_steps = 200
num_consecutive_iterations = 100
num_episodes = 5000
last_time_steps = np.zeros(num_consecutive_iterations)

for episode in range(num_episodes):
   
   observation = env.reset()

   episode_reward = 0
   for t in range(max_number_of_steps):
       
       env.render()

       action = np.random.choice([0, 1])

       observation, reward, done, info = env.step(action)
       episode_reward += reward

       if done:
           print('%d Episode finished after %f time steps / mean %f' % (episode, t + 1,
               last_time_steps.mean()))
           last_time_steps = np.hstack((last_time_steps[1:], [episode_reward]))
           break

   if (last_time_steps.mean() >= goal_average_steps): # 直近の100エピソードが195以上であれば成功
       print('Episode %d train agent successfuly!' % episode)
       break

長い...笑。


これを実行するとこんな感じで
カートの上に乗ったポールを左右に動かしてバランスとる画面が動き始めます。

静止画なのでうまくバランスが取れているように見えますが
ポールの画面の後ろの実行結果が
「622Episode finish after 28.000000 time steps / mean 20.910000」
となっていることからわかるように
30秒いかないぐらいで倒れて
やり直しを何回も繰り返していてうまく行っていません。


実行はできたけど
具体的に何をしてるのかコードからわかるようになりたいので
ここからは細かく分けて1つずつ読み解いていきます。


まずは、今回使うOpenAI Gymとnumpyをインポートします。

import gym
import numpy as np

インストールできていない場合はエラーが出ると思うので
次のコードでインストールしてからやってみてください

pip install gym
pip install numpy

プログラミングを始めたばかりの方は
インストールとインポートって何が違うねんと思う方も多いと思います。

個人的には
インストール→ゲームのダウンロード
インポート→起動
と考えるとわかりやすいのかなと思いました。

例えば、パソコンやスマホでゲームをやりたいとき
まずはApp Storeでやりたいゲームを選んでダウンロードします。
ダウンロードできたらそれを起動して遊びます。
次からはアンインストールしない限りは
すぐに起動して遊べますよね!

そんなイメージで考えるといいのではないかなと思いました。


環境を作成します。

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

環境は今回の場合
カートの上に乗ったポールのバランスを取るゲームのことです。


続いて細かい設定に入っていきますが

ステップとエピソードという言葉を理解しておく必要があります。
ステップはポールが倒れるまでの時間で
エピソードはポールが倒れると1回になります。
1回目は10秒耐えて、2回目は20秒耐えた場合
1エピソードでは10ステップ、2エピソードでは20ステップ
になります。

今回はCartPole Balancingなのでこのような意味になりますが
他の環境では内容が変わるので
意味も少し変わるのに注意が必要です。


goal_average_steps = 195
max_number_of_steps = 200
num_consecutive_iterations = 100
num_episodes = 5000
last_time_steps = np.zeros(num_consecutive_iterations)

今回の場合
195ステップ連続でポールが倒れないことを目指す
最大ステップ数は200
評価の範囲のエピソード数は100
エピソードは5000回まで
という意味になります。

つまり、5000エピソードを実行して
100エピソードの平均が195ステップになるとクリアで
200ステップ以上にはならないようにする
という意味になります。


last_time_steps = np.zeros(num_consecutive_iterations)

はイマイチ理解できなかったのですが
クリアできたかどうか確かめるために
100エピソードの値を保存しておく仕組みなのかなと思いました。

もう少し調べてみます...。


まだ全体の半分くらいですが
結構長くなったので続きは次回以降にします。

残りはこれくらい↓。

for episode in range(num_episodes):
   
   observation = env.reset()

   episode_reward = 0
   for t in range(max_number_of_steps):
       
       env.render()

       action = np.random.choice([0, 1])

       observation, reward, done, info = env.step(action)
       episode_reward += reward

       if done:
           print('%d Episode finished after %f time steps / mean %f' % (episode, t + 1,
               last_time_steps.mean()))
           last_time_steps = np.hstack((last_time_steps[1:], [episode_reward]))
           break

   if (last_time_steps.mean() >= goal_average_steps): # 直近の100エピソードが195以上であれば成功
       print('Episode %d train agent successfuly!' % episode)
       break


まだ強化学習を少し始めたところですが
同じ機械学習でも教師あり学習、教師なし学習と結構違いますね!

さらに頑張って理解します!


参考にした記事はこちらです。


最後まで読んでいただきありがとうございました。

ぷもんでした!

noteを日々投稿してます! もしいいなと思ってもらえたら サポートしてもらえるとありがたいです。 VRやパソコンの設備投資に使わせていただきます。 ご意見、質問等ありましたらコメントください。 #ぷもん でつぶやいてもらえると励みになります。 一緒に頑張りましょう!