OpenAI GymでゲームMsPacman(ミズ・パックマン)をやると初期に操作を受け付ない時間がある?

More than 1 year has passed since last update.

_Users_taki_atari-rl_run_py.png

問題と現時点の解決策

問題

OpenAIでゲームMsPacman(ミズ・パックマン)をやると、初期に操作を受け付けない時間がある。

現時点の解決策

エピソードフレーム番号258まで処理を行わず(以下処理参照)、それ以降に操作する。

(自分の環境でエピソードフレーム番号258番前後より前までは操作を受け付けるが、それより前に操作を入れても操作を受け付けない。
自分のソースにバグが有るのかもしれないし、こうやらないといけないのかもしれない。)

ep_frame_number = 0
while ep_frame_number < 258:
    observation, _, _, _ = gym_env.step(0)
    ep_frame_number = float(gym_env.ale.getEpisodeFrameNumber())

環境

Python 3.5.2 :: Anaconda 2.5.0 (x86_64)
macOS Sierra 10.12.1

経緯1:機械学習を使わずにどれぐらいのポイントが取れるか実施したらreward(得点)が取得できなかった。

OpenAIでMsPacmanをやろうと思い、まず機械学習を使わずにどれぐらいのポイントが取れるか確認したところ、初めの方のreward(得点)がすべて0になっている。
Pacmanは少しでも動けばポイントが得られるので、これはおかしい。
以下でactionとそれに対応するreward(得点)をcsv出力することで確認。
https://github.com/tflare/atari-rl

デバックしたところ、エピソードフレーム番号258番前後より前にactionを送っても
操作を受け付けていないことがわかった。
(エピソードフレーム番号の取得は以下参照)

エピソードフレーム番号の取得
gym_env = gym.make(game_name)
ep_frame_number = float(gym_env.ale.getEpisodeFrameNumber())

経緯2:他のソースに同様の処理がない

最初は初期に操作を受け付けていない期間があると思い、
他の人のコードで同様の箇所がないか確認を行った。
しかし、初期状態をランダムにするために"NOOP"を複数回やっている処理があるぐらいで
同様の処理(以下を5回実行)を行っても、操作を受け付けない状態が続いた。

gym_env = gym.make(game_name)
action = 0 # 0 : "NOOP"
gym_env.step(action)

経緯3:OpenAIの実行処理がランダムで行われるためstepを複数回呼び出しても安定しない

そこで"NOOP"の処理を80回程度実施したところ、うまく行くことがわかったが、
何回かやったところ、うまくいかない時があることがわかった。
(処理前に動いてしまう 0:"NOOP"の場合は初期で左の入力があるため、左に動く)

調べたところ、OpenAIではactionを受取、stepを実施する際に
ランダムな回数繰り返し実施する(以下コード参照)ため、
この回数によってエピソードフレーム番号258番前後に行ったり行かなかったりするため安定しなかったようだ。

OpenAIの処理を一部抜粋、加工
self.frameskip = (2, 5)

if isinstance(self.frameskip, int):
    num_steps = self.frameskip
else:
    num_steps = self.np_random.randint(self.frameskip[0], self.frameskip[1])
for _ in range(num_steps):
    reward += self.ale.act(action)

情報提供のお願い

現在は上記で行っているが、何か間違いがあるのではと考えています。
もし何か情報をお持ちでしたら、コメントを頂けるとありがたいです。