見出し画像

Gym Retro入門 / エイリアンソルジャーではじめる強化学習

今回は、メガドライブのスーパーハードな超傑作アクションゲーム「エイリアンソルジャー」の強化学習に挑戦してみます。
以下、OpenAI Gymは知ってる前提で説明を進めます。

1. Gym Retro

画像1

Gym Retroは、ファミコン、ゲームボーイ、メガドライブなどのレトロゲームを、OpenAI Gymインターフェース対応の強化学習環境として使えるようにするライブラリです。本家のOpenAIから提供されています。

2. Gym Retroがサポートしているゲーム機

Gym Retroがサポートしているゲーム機は、次の通りです。

Atari
・Atari2600

NEC
・PCエンジン

任天堂
・ゲームボーイ/ゲームボーイカラー
・ゲームボーイアドバンス
・ファミコン
・スーパーファミコン

セガ
・ゲームギア
・メガドライブ
・マスターシステム

3. Gym Retroのインストール

Gym Retroをインストールするコマンドは、次の通りです。
Pythonはバージョン3.5以降が必要で、32ビットOSは非サポートです。

pip install gym-retro

4. 人間によるGym Retro環境の実行

人間によるGym Retro環境の実行を行うコマンドは、次の通りです。

python -m retro.examples.interactive --game Airstriker-Genesis --state Level1

--gameに環境ID、--stateに開始状態(1面、2面など)を指定します。
今回は環境IDに「Airstriker」、開始状態に「Level1」を指定しました。シューティングゲームが起動し、矢印キーとXキーで操作できます。

画像2

Airstriker、Fire、Dekadrive、Automaton、Lost Marblesなどの市販されていないゲームのROMはGym Retroに含まれているため、無料で利用できます。
エイリアンソルジャーなどの市販のゲームは含まれてないので、自分でROMを入手する必要があります。

5. ランダムエージェントによるGym Retro環境の実行

ランダムエージェントによるGym Retro環境の実行を行うコマンドは、次の通りです。

$ python -m retro.examples.random_agent --game Airstriker-Genesis --state Level1

6. コードによるGym Retro環境の実行

コードによるGym Retro環境の実行を行うには、次のように記述します。
retro.make()の引数としてgameとstateを指定します。

import retro

# 環境の生成
env = retro.make (game='Airstriker-Genesis', state='Level1')

# 環境のリセット
obs = env.reset()

# 1エピソードのループ
while True:
   # 1ステップの実行
   obs, rew, done, info = env.step(env.action_space.sample())

   # 環境の描画
   env.render()

   # エピソード完了時の処理
   if done:
       obs = env.reset()

7. 利用可能なGym Retro環境の一覧の取得

利用可能なGym Retro環境の一覧を取得するには、次のコードを実行します。
ゲームインテグレーションと呼ばれる、開始状態、報酬関数、完了条件といった情報が定義されているゲーム郡になります。

import retro

for game in retro.data.list_games():
   print(game, retro.data.list_states(game))

以下のように、対応しているゲームの環境名と開始状態が1000本ほど表示されます。
エイリアンソルジャーの場合は環境ID「AlienSoldier-Genesis」で、開始状態は「DefaultSettings.Level1」など17個ほど用意されています。

1942-Nes ['1Player.Level1']
1943-Nes ['Level1']
3NinjasKickBack-Genesis ['1Player.Colt.Level1']
8Eyes-Nes ['1Player.Arabia.Level1']
AaahhRealMonsters-Genesis ['Level1']
AbadoxTheDeadlyInnerWar-Nes ['Level1']
    :
AlienSoldier-Genesis ['DefaultSettings.Level1', 'DefaultSettings.Level10', 'DefaultSettings.Level11', 'DefaultSettings.Level12', 'DefaultSettings.Level13', 'DefaultSettings.Level14', 'DefaultSettings.Level15', 'DefaultSettings.Level16', 'DefaultSettings.Level17', 'DefaultSettings.Level18', 'DefaultSettings.Level19', 'DefaultSettings.Level2', 'DefaultSettings.Level20', 'DefaultSettings.Level21', 'DefaultSettings.Level22', 'DefaultSettings.Level23', 'DefaultSettings.Level24', 'DefaultSettings.Level25', 'DefaultSettings.Level3', 'DefaultSettings.Level4', 'DefaultSettings.Level5', 'DefaultSettings.Level6', 'DefaultSettings.Level7', 'DefaultSettings.Level8', 'DefaultSettings.Level9']
    :

8. ROMの入手

ROMはSteamで購入して入手します。

画像3

Steam:Alien Soldier

購入したらSteamアプリを起動し、ゲームアイコンを「右クリック→Property→LOCAL FILES→BROWSE LOCAL FILES...」でROMが保存されているフォルダを開き、ROMを取得します。
エイリアンソルジャーの場合は、AlienSoldier_Europe.SGDになります。

画像4

9. ROMのインポート

ROMをインポートするコマンドは次の通りです。
以下の./roms/はROMの格納先フォルダで、このフォルダを作ってROM(AlienSoldier_Europe.SGD)を入れておきます。

$ python -m retro.import ./roms/

成功すると次のように表示されます。

Importing 1 potential games...
Importing AlienSoldier-Genesis
Imported 1 games

10. ランダムエージェントによるAlienSoldier環境の実行

retro.make()のgameに'AlienSoldier-Genesis'、stateに'DefaultSettings.Level1'を指定して、実行します。

#!/usr/bin/env python
import retro

# 環境の生成
env = retro.make(game='AlienSoldier-Genesis', state='DefaultSettings.Level1')

# 環境のリセット
obs = env.reset()

# 1エピソードのループ
while True:
   # 1ステップの実行
   obs, rew, done, info = env.step(env.action_space.sample())

   # 環境の描画
   env.render()

   # エピソード完了時の処理
   if done:
       obs = env.reset()

画像5

11. AlienSoldier環境の学習

手始めに、Gym Retroに用意されている学習アルゴリズムを使って学習します。

Brute
Bruteは「Revisiting the Arcade Learning Environment」で紹介されている、単純で効果的な強化学習アルゴリズムです。ゲームでうまく機能する一連のボタン押下を構築することによって機能します。決定論的環境で動作します。
実行するコマンドは次の通りです。

python -m retro.examples.brute --game AlienSoldier-Genesis --state DefaultSettings.Level1

学習の様子は以下のように表示され、適度に学習したらControl-Cで終了します。best.bk2ファイルが生成されます。

new best reward 0 => 1063.0
new best reward 1063.0 => 1084.0
new best reward 1084.0 => 1210.0
new best reward 1210.0 => 1605.0
new best reward 1605.0 => 2711.0
    :

12. AlienSoldier環境の学習結果の再生

bk2ファイルファイルは、ゲームの開始状態と一連のボタン操作を保存するファイルです。動画よりもファイルサイズが小さく、訓練データとして利用することもできます。

以下のコードで、bk2ファイルを再生できます。

import retro

# βkファイルの読み込み
movie = retro.Movie('./best.bk2')
movie.step()

# 環境の生成
env = retro.make(
   game=movie.get_game(),
   state=None,
   use_restricted_actions=retro.Actions.ALL,
   players=movie.players,
)
env.initial_state = movie.get_state()
env.reset()

# 再生ループ
while movie.step():
   # キーの取得
   keys = []
   for p in range(movie.players):
       for i in range(env.num_buttons):
           keys.append(movie.get_key(i, p))

   # 1ステップ実行
   env.step(keys)

   # 環境の描画
   env.render()

以下のように、エージェントがプレイしている様子を見ることができます。

画像6


この記事が気に入ったらサポートをしてみませんか?