強化学習でバランスゲームを攻略! ステップとエピソードとは?
こんにちは!
ぷもんです。
前回、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
まだ強化学習を少し始めたところですが
同じ機械学習でも教師あり学習、教師なし学習と結構違いますね!
さらに頑張って理解します!
参考にした記事はこちらです。
最後まで読んでいただきありがとうございました。
ぷもんでした!