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

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

連載の経緯については#1に記しました。

#3ではAtariのゲームについて取り扱うにあたって、卓球ゲームのPongについて取り扱いました。

#4ではその他のAtariのゲームについてということで、SpaceInvadersやBreakoutについて取り扱います。
以下、目次になります。

1. 前回の復習&補足
2. SpaceInvadersゲームの実行と仕様の確認
3. Breakoutゲームの実行と仕様の確認
4. まとめ


1. 前回の復習&補足
#3ではAtariのゲームの具体例として、Pong-v0について取り扱いました。

f:id:lib-arts:20190517200641p:plain
Pongを理解するにあたって、Observation SpaceがBox(210, 160, 3)という画像、Action SpaceがDiscrete(6)というコントローラからの入力を意味しているということを把握するのが第一歩になります。

f:id:lib-arts:20190517211413p:plain
また上記のように、ACTION_MEANINGの仕様があり、単純な1コマンドの入力だけでなくコマンドの同時入力についてもゲームによっては可能になっています。Pongでは6種類のコマンドでしたが、コマンドの同時入力も考慮することで最大で18種類のコマンドに関して取り扱いが可能になっています。
とにかく、Atariのゲームにおけるエージェント(agent)の行動(action)は、コントローラーからの値の入力だと把握しておけば良いです。
上記で簡単な復習ができたので、2節3節では上記を踏まえてそれぞれSpaceInvadersとBreakoutについて取り扱っていきます。方針としては基本的な流れとして、(1)Observation SpaceとAction Spaceの把握、(2)サンプルコードの実行、(3)コマンド実行の確認、(4)報酬とスコアの管理について把握、という4つのプロセスを実行する形で行っていきます。

 

. SpaceInvadersゲームの実行と仕様の確認
1節で前回の復習を兼ねて仕様把握にあたっての方針を形式化しました。汎用的に様々なenvironmentsに対して適用できそうなので、2節ではそちらを踏襲していきます。
(ⅰ)Observation SpaceとAction Spaceの把握
Observation SpaceとAction Spaceの把握に関しては基本的に下記の一覧を確認すれば大体のイメージの把握を行うことができます。

Table of environments · openai/gym Wiki · GitHub

f:id:lib-arts:20190518132124p:plain
SpaceInvadersに関しては上記のようにまとまっています。#3で扱ったPongと同様ですが、これは同じゲーム機のソフトだからという認識で良いかと思われます。

(ⅱ)サンプルコードの実行
サンプルコードは下記になります。本質的な意味でのPongとの違いはgym.make部分のみとなっています。(コード自体は二重のfor文が冗長だったので書き換えました)

import gym
env = gym.make('SpaceInvaders-v0')
observation = env.reset()
for t in range(1000):
    env.render()
    observation, reward, done, info = env.step(env.action_space.sample())
env.close()

上記を実行することで1000ステップのゲームの実行を行います。上記を実行するとアニメーションで実行されますが、画像を出力したい際は下記のコードを実行することで出力することができます。

import matplotlib.pyplot as plt
plt.imshow(observation)
plt.show()

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

f:id:lib-arts:20190518132154p:plain
サンプルコードの実行を通してゲームのイメージがつかめたので、次にコマンドを確認していきます。

(ⅲ)コマンド実行の確認
下記のコードにおいてenv.stepの引数を変えながら実行を行ってみます。

import gym
env = gym.make('SpaceInvaders-v0')
observation = env.reset()
for t in range(1000):
    #env.render()
    observation, reward, done, info = env.step(3)
    if t%10==0:
        plt.imshow(observation)
        plt.show()
env.close()

色々と実行してみた結果としては、動かす緑の飛行船は2と4を押した時に右に進みました。ACTION_MEANINGとコードが違うようで、この辺は大元のソースのバグが疑われます。(とはいえコマンドの対応が違うだけであれば強化学習を用いて学習するプロセスにおいては問題なさそうです。)

(ⅳ)報酬とスコアの管理について把握

import gym
env = gym.make('SpaceInvaders-v0')
observation = env.reset()
for t in range(1000):
    #env.render()
    observation, reward, done, info = env.step(env.action_space.sample())
    if reward>0:
        print("STEP_"+str(t)+" Reward:"+str(reward))
        plt.imshow(observation)
        plt.show()
env.close()

上記のコードを動かすことで大体のイメージがつかめるかと思います。

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

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

f:id:lib-arts:20190518134743p:plain
実行結果は上記のようになります。上記を確認することで、敵を撃退するごとに報酬が発生し、左上の緑のスコアに値が入っていることがわかります。

ここまでの話でSpaceInvadersの話は一通り把握できたと思いますので、次の3節ではBreakoutゲームについて取り扱います。

 

3. Breakoutゲームの実行と仕様の確認
2節と同様の進め方でBreakoutゲームについて仕様の把握を行っていきます。
(ⅰ)Observation SpaceとAction Spaceの把握

f:id:lib-arts:20190518135819p:plain
BreakoutにおけるObservation SpaceはこれもPongやSpaceInvadersと同様にBox(210, 160, 3)となっています。Action Spaceはやや異なりDiscrete(4)となっています。

(ⅱ)サンプルコードの実行

import gym
env = gym.make('Breakout-v0')
observation = env.reset()
for t in range(1000):
    env.render()
    observation, reward, done, info = env.step(env.action_space.sample())
env.close()

上記コードを実行することで、アニメーションを確認することができます。また下記を実行することで、最終状況の可視化も可能です。

import matplotlib.pyplot as plt
plt.imshow(observation)
plt.show()

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

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

(ⅳ)報酬とスコアの管理について把握

import gym
env = gym.make('Breakout-v0')
observation = env.reset()
for t in range(1000):
     #env.render()
     action = env.action_space.sample()
     observation, reward, done, info = env.step(action)
     if reward>0:
          plt.imshow(observation)
          plt.show()
          print("STEP_"+str(t)+" Reward:"+str(reward))
env.close()

上記のコードを実行することで、報酬が発生した際の報酬と盤面について把握できます。実行結果は下記になります。(ランダムで動かすだけではなかなか報酬が発生しないので、何度か実行しないと結果が出ないかもしれません)

f:id:lib-arts:20190518141032p:plain
上記を確認することで壁を崩すと報酬が発生するようになっているというのがわかりました。


4. まとめ
#4では#3に引き続きOpenAIで実装されているAtariのゲームの仕様についてまとめました。
概要は理解できましたが、得られる観測(Observation)が画像のみで、こういった観測に関して従来は特徴量抽出が大変でしたが、ここにDeepLearningを適用することである程度汎用的な特徴抽出が可能になったというのは非常に興味深い話だと思います。
Atariについては大体理解できたので、#5ではCarRacing-v0を題材にBox2Dについて確認していければと思います。