Edited at

OpenAIGymを強化学習で攻略しまくろう![環境構築編]


はじめに

このシリーズでは、OpenAIGymという「強化学習のアルゴリズム開発のためのツールキット」を使って強化学習の実装をしていきます。


この記事では最初の環境構築と、簡単にゲームを実行してみます。


(要はOpenAIGymの環境構築とHelloWorld(?)記事です!)

流れとしては、


  1. OpenAIGymの環境構築

  2. 実際にいろんなゲームを実行してみよう!

ってなかんじで書いていきますよ!!


OpenAIGymとは

非営利団体であるOpenAIが提供してくれる、強化学習アルゴリズムの開発と評価のためのプラットフォームがOpenAIGymです。


OpenAIGymにはさまざまな強化学習の課題が収録されていて、テレビゲームや古典制御問題(倒立振子など)、ロボット制御などを扱えるシミュレータが用意されています。


前提環境


  • Ubuntu 18.04.2 LTS

  • Python3.6.7以降(3.6.7のみで動作確認済み)


1. OpenAIGymの環境構築

まずは、以下のコマンドを実行してください。

$ sudo apt install python3-tk

$ sudo apt install python3-pip
$ sudo pip3 install --upgrade pip
$ sudo pip3 install matplotlib

ちょっとだけ解説すると、

$ sudo apt install python3-tk

ではtkinterというローカルのGUIアプリを構築するためのツールキットをインストールします。


OpneAIGymではこのようにGUIの画面を表示してゲームを実行するので、tkinterが必要になります。


※ちなみにこれは後ほど説明するCartPoleというゲームです。


sample1.gif

次に、以下のコマンドを実行することでゲームの基本的な環境を入れることができます。

$ sudo pip3 install gym

また、いろんなゲームをプレイできるようにするには拡張機能も入れる必要があります。

ここでは、いろんなゲームを紹介したいので拡張機能も含めてインストールしていきます。

$ sudo apt install cmake

$ sudo apt install zlib1g-dev
$ sudo pip3 install gym[all]
$ sudo pip3 install gym-retro

ここまでで、とりあえず環境構築は完了しているはずです!


2. 実際にいろんなゲームを実行してみよう!

まず、どんなゲームが動かせるのか確認します。


check-gym_list.py

from gym import envs

envids = [print(spec.id) for spec in envs.registry.all()]


全部載せると膨大な行になってしまうので、以下に結果の一部のみ載せます。


このページにgymのすべての情報が載ってます。


また、サンプル動画のリストはこのページにも載っています・

Copy-v0

RepeatCopy-v0
ReversedAddition-v0
ReversedAddition3-v0
DuplicatedInput-v0
Reverse-v0



CubeCrash-v0
CubeCrashSparse-v0
CubeCrashScreenBecomesBlack-v0
MemorizeDigits-v0

では、実際にPython3で簡単なコードを書いてゲームを起動したりしてみます!


CartPole-v0

sample1.gif

CartPoleとは、日本語で言うと倒立振子です。


倒立振子とはカートの上に回転軸を固定したポールを立て、そのポールが倒れないようにカートを右・左へと細かく動かして、制御する課題です。


このゲームの公式ページはここで、githubはここです。

以下で、パラメータについて説明していきます。


OpenAIGymはOSS(オープンソースソフトウェア)なので基本はすべて公式のgithubにかかれています。


  • Actions(行動)

CartPoleでは0, 1の値で行動を決定します。

値(int)
行動

0
Push cart to the left(左)

1
Push cart to the right(右)


  • Observation(状態)

4つのパラメータをもとに現在の状態を取得できます。


実際に強化学習する際はこのパラメータを用いて報酬設定したりします。

Min
Max
内容

-2.4
2.4
Cart Position(カート位置)

-Inf
Inf
Cart Velocity(カート速度)

-41.8deg
41.8deg
Pole Angle(ポール角度)

-Inf
Inf
Pole Velocity At Tip(ポールの先端速度)

プログラムは、以下のようになります。  

説明はコメント文に書いてあります。


cartpole-v0-sample.py

import gym

env = gym.make("CartPole-v0") # GUI環境の開始(***)
observation = env.reset() # 環境の初期化

for episode in range(20):
observation = env.reset() # 環境の初期化
for _ in range(100):
env.render() # レンダリング(画面の描画)
action = env.action_space.sample() # 行動の決定
observation, reward, done, info = env.step(action) # 行動による次の状態の決定
print("=" * 10)
print("action=",action)
print("observation=",observation)
print("reward=",reward)
print("done=",done)
print("info=",info)

env.close() # GUI環境の終了


sample1.png


MountainCar-v0

sample2.gif

MountainCarは、右の山を登ることを目標とした課題です。


車自体の力だけではこの山を登ることはできません。


したがって、前後に揺れながら、勢いをつけてうまく山を登っていく必要があります。


このゲームの公式ページはここで、githubはここです。

以下で、パラメータについて説明していきます。


公式のgithubはこちらです。


  • Actions(行動)

MountainCarでは0, 1, 2の値で行動を決定します。

値(int)
行動

0
push left

1
no push

2
push right


  • Observation(状態)

2つのパラメータをもとに現在の状態を取得できます。


実際に強化学習する際はこのパラメータを用いて報酬設定したりします。

Min
Max
内容

-1.2
0.6
position(位置)

-0.07
0.07
velocity(速度)

プログラムは、以下のようになります。  

説明はコメント文に書いてあります。


先ほどと変わっているのは3行目の部分だけです。


mountaincar-v0-sample.py

import gym

env = gym.make("MountainCar-v0") # GUI環境の開始(***)
observation = env.reset() # 環境の初期化

for episode in range(20):
observation = env.reset() # 環境の初期化
for _ in range(100):
env.render() # レンダリング(画面の描画)
action = env.action_space.sample() # 行動の決定
observation, reward, done, info = env.step(action) # 行動による次の状態の決定
print("=" * 10)
print("action=",action)
print("observation=",observation)
print("reward=",reward)
print("done=",done)
print("info=",info)

env.close() # GUI環境の終了


sample2.png


MsPacman-v0

sample3.gif

MsPacmanは、あの有名なPacmanのゲームです。


敵にあたればゲームオーバー、餌をたくさん集めてスコアを稼いでいきます。


このゲームではより高いスコアを稼ぐことを目標としています。


このゲームの公式ページはここで、githubはここです。

以下にコードサンプルを載せます。


先ほどと変わっているのは3行目の部分だけです。


mspacman-v0-sample.py

import gym

env = gym.make("MsPacman-v0") # GUI環境の開始(***)
observation = env.reset() # 環境の初期化

for episode in range(20):
observation = env.reset() # 環境の初期化
for _ in range(100):
env.render() # レンダリング(画面の描画)
action = env.action_space.sample() # 行動の決定
observation, reward, done, info = env.step(action) # 行動による次の状態の決定
print("=" * 10)
print("action=",action)
print("observation=",observation)
print("reward=",reward)
print("done=",done)
print("info=",info)

env.close() # GUI環境の終了


sample3.png


Pendulum-v0

sample4.gif

Pendulumは、適切なトルクを与えて垂直に振り上げている状態をキープするという課題です。


このゲームの公式ページはここで、githubはここです。

以下で、パラメータについて説明していきます。


公式のgithubはこちらです。


  • Actions(行動)

Pendulumではトルクを任意に指定して行動を決定します。

Min
Max
行動

-2.0
2.0
トルク


  • Observation(状態)

3つのパラメータをもとに現在の状態を取得できます。


実際に強化学習する際はこのパラメータを用いて報酬設定したりします。

Min
Max
内容

-1.0
1.0
振り子が角度θのときのcosの値

-1.0
1.0
振り子が角度θのときのsinの値

-8.0
8.0
振り子が角度θのときの角速度


  • Reward(報酬)

以下の式で与えられているものがデフォルトの報酬となっています。

-(theta^2 + 0.1*theta_dt^2 + 0.001*action^2)

以下にコードサンプルを載せます。


pendulum-v0-sample.py

import gym

env = gym.make("Pendulum-v0") # GUI環境の開始(***)
observation = env.reset() # 環境の初期化

for episode in range(20):
observation = env.reset() # 環境の初期化
for _ in range(100):
env.render() # レンダリング(画面の描画)
action = env.action_space.sample() # 行動の決定
observation, reward, done, info = env.step(action) # 行動による次の状態の決定
print("=" * 10)
print("action=",action)
print("observation=",observation)
print("reward=",reward)
print("done=",done)
print("info=",info)

env.close() # GUI環境の終了


sample4.png


BipedalWalkerHardcore-v2

sample7.gif

BipedalWalkerHardcoreは、各関節のトルク・速度を調節してうまく障害物を避けて歩けるようになる課題です。


このゲームの公式ページはここで、githubはここです。

以下にコードサンプルを載せます。


bipedalwalkerhardcore-v2-sample.py

import gym

env = gym.make("BipedalWalkerHardcore-v2") # GUI環境の開始(***)
observation = env.reset() # 環境の初期化

for episode in range(20):
observation = env.reset() # 環境の初期化
for _ in range(100):
env.render() # レンダリング(画面の描画)
action = env.action_space.sample() # 行動の決定
observation, reward, done, info = env.step(action) # 行動による次の状態の決定
print("=" * 10)
print("action=",action)
print("observation=",observation)
print("reward=",reward)
print("done=",done)
print("info=",info)

env.close() # GUI環境の終了


sample7.png


CarRacing-v0

sample8.gif

CarRacingは、各関節のトルク・速度を調節してうまく障害物を避けて歩けるようになる課題です。


このゲームの公式ページはここで、githubはここです。

以下にコードサンプルを載せます。


carracing-v0-sample.py

import gym

env = gym.make("CarRacing-v0") # GUI環境の開始(***)
observation = env.reset() # 環境の初期化

for episode in range(20):
observation = env.reset() # 環境の初期化
for _ in range(100):
env.render() # レンダリング(画面の描画)
action = env.action_space.sample() # 行動の決定
observation, reward, done, info = env.step(action) # 行動による次の状態の決定
print("=" * 10)
print("action=",action)
print("observation=",observation)
print("reward=",reward)
print("done=",done)
print("info=",info)

env.close() # GUI環境の終了


sample8.png


Breakout-ram-v0

sample11.gif

Breakoutとは、日本語で言うとブロック崩しです。


ルールは言うまでもないかもしれないですが、ボールを反射させてブロックを壊し、スコアを「稼いでいくゲームです。


このゲームの公式ページはここで、githubはここです。

以下にコードサンプルを載せます。


breakout-ram-v0-sample.py

import gym

env = gym.make("Breakout-ram-v0") # GUI環境の開始(***)
observation = env.reset() # 環境の初期化

for episode in range(20):
observation = env.reset() # 環境の初期化
for _ in range(100):
env.render() # レンダリング(画面の描画)
action = env.action_space.sample() # 行動の決定
observation, reward, done, info = env.step(action) # 行動による次の状態の決定
print("=" * 10)
print("action=",action)
print("observation=",observation)
print("reward=",reward)
print("done=",done)
print("info=",info)

env.close() # GUI環境の終了


sample11.png


まとめ

今回は、OpenAIGymを強化学習で攻略しまくるための環境構築を行いました。


試せるゲームはこの他にもたくさんあって、例えばソニックのゲームなんかも400円くらい払えばプログラムから実行できるようになり、強化学習の開発に使うことができます。

今後は、強化学習の理論(Q学習、マルコフ決定過程、DQNなど)や強化学習の実装に関する記事を書いていきますので、よろしくお願いします!!!

あ、よければtwitterもフォローよろしくお願いします!


参考文献