機械学習(特に強化学習)が好きな人のノート

機械学習関連のことをまとめていきます。強化学習関連が多いかもしれません

【Open AI gym、強化学習】Pendulumの紹介

問題の概要

Pendulumは、 単振り子の問題になります。
以下の振り子に適切な力を加え、
振り子を立たせることが目的となる問題です。

f:id:ttt242242:20190505103333p:plain

出典:Leaderboard · openai/gym Wiki · GitHub

制御値、観測、報酬等について

制御値(行動)

制御値は、左方向に力を加えるか、右方向に力を加えるかになります。
-2から2までの間での連続値になります。

以下のコードで確認してみます。

print(env.action_space.high) # 最大値
# => [2.]
print(env.action_space.low)  # 最小値
# => [-2.]
print(env.action_space.sample())  # 行動をランダムで決定
# => [0.58357645]

観測

観測値は、以下のようになります。

観測情報 最小値 最大値
$sin(\theta)$ -1.0 1.0
$cos(\theta)$ -1.0 1.0
$\dot{\theta}$ -8.0 8.0

確認してみます。

print(env.observation_space.high) # 最大の観測情報の生成
# => [1. 1. 8.]
print(env.observation_space.low)  # 最小の観測情報の生成
# => [-1. -1. -8.]
print(env.observation_space.sample()) # ランダムで観測情報を決定
# =>[-0.12482558  0.783546    7.41860417]

報酬

報酬は以下のように与えられます。 $$ \begin{eqnarray} r = -(\theta^2 + 0.1 \cdot \dot{\theta}+0.001 \cdot a) \end{eqnarray} $$ $a$は行動になります。
振り子が立っていて静止している時が最適な状態なので、
その時に$r=0$ となります。
($\theta=0, \dot{\theta}=0, a=0$)

エピソードの終了判定

このゲームは非エピソード型のゲームになるので、終了判定はありません。
と、documentには書いてあるのですが、200ステップで強制終了する・・・
何故かはわかりません。調査中です。

ちょっと動かしてみる

実際に動かしてみます。
stepメソッドを使って1ステップづつ振り子を操作していきます。
stepメソッドの戻り値は操作した結果 (観測情報, 報酬, エピソードの終了判定) が返却されます。

サンプルコードを実行するために
gymをインストールする必要があります。

pip install gym

サンプルコード

ひたすらランダムで行動選択を行ってみます。
以下、サンプルコードになります。

import gym 
env = gym.make("Pendulum-v0")
env.reset()

is_finish = False   # 終了判定

nb_step = 1
while(1):
    env.render()
    random_action = env.action_space.sample()   # ランダムで行動を選択。0, 1, 2のどれか
    obs, reward, is_finish, _ = env.step(action=random_action)  
    print("nb_step:{}, action:{}, obs:{}, reward:{}, is_finish:{}".format(nb_step, random_action, obs, reward, is_finish))
    nb_step += 1
    if is_finish == True:   # 終了したら、whileを抜ける
        break

実行結果

終了するまで実行します。

nb_stepがステップ数、actionが行動、obsが観測情報、rewardが報酬、is_finishがゲームの終了判定を表しています。

<省略>
nb_step:195, action:[0.95820318], obs:[-0.98664834 -0.16286517  1.93433814], reward:-9.79362251951132, is_finish:False
nb_step:196, action:[-0.03816477], obs:[-0.96793588 -0.2511974   1.80646455], reward:-9.242644441989826, is_finish:False
nb_step:197, action:[-1.09034149], obs:[-0.94712486 -0.32086524  1.45451528], reward:-8.666190209907835, is_finish:False
nb_step:198, action:[-0.98257407], obs:[-0.92867691 -0.37088973  1.06648024], reward:-8.136469087926985, is_finish:False
nb_step:199, action:[-1.76788336], obs:[-0.91865917 -0.39505105  0.52313043], reward:-7.7434402096148025, is_finish:False
nb_step:200, action:[-0.2623335], obs:[-0.91491541 -0.40364564  0.18749212], reward:-7.510227269074242, is_finish:True

参考文献

github.com

github.com