Gym Retro入門 / エイリアンソルジャーではじめる強化学習
今回は、メガドライブのスーパーハードな超傑作アクションゲーム「エイリアンソルジャー」の強化学習に挑戦してみます。
以下、OpenAI Gymは知ってる前提で説明を進めます。
1. Gym Retro
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キーで操作できます。
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で購入して入手します。
購入したらSteamアプリを起動し、ゲームアイコンを「右クリック→Property→LOCAL FILES→BROWSE LOCAL FILES...」でROMが保存されているフォルダを開き、ROMを取得します。
エイリアンソルジャーの場合は、AlienSoldier_Europe.SGDになります。
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()
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()
以下のように、エージェントがプレイしている様子を見ることができます。
この記事が気に入ったらサポートをしてみませんか?