OpenAI gym形式で強化学習のための環境を作る

2020年05月08日

はじめに

修士2年の横山です。

我々の研究室では強化学習を用いたロボットの自律走行に関する研究が結構行われております。強化学習とは、ある行動に対してその行動がどのくらいよかったのかを報酬として与え、その報酬が多くもらえるように行動を学習していくというものです。

そんな強化学習ですが、かなりの試行回数・時間をかけて学習を行う必要があるので、シミュレータ環境が必須といえます。我々の研究室では偉大なる大先輩が開発したFabot2dというシミュレータを活用しています。一般的に強化学習を試したり勉強する時はOpenAI Gymというシミュレータ環境を使うことが多いと思います。 また、強化学習のフレームワークとしてkeras-rlstable-baselinesなどがあります。これらのフレームワークはOpenAI Gym形式のシミュレータ環境であれば自作のシミュレータ環境でも動かすことができ、効率的に様々なアルゴリズムを試すことができます。

そこで今回は我々の活用しているFabot2dをOpenAI Gym形式に少しだけ直してみました。その時に培ったOpenAI Gym形式のシミュレータ環境作成についてのメモを書いておきます。

シミュレータ環境の作成

OpenAI Gym形式のシミュレータ環境では以下の3つのメソッドを加えたクラスの作成が必要となってきます。

  • reset(self):状態を初期化する関数を作成します。observation(状態)を 返り値とします。
  • step(self, action):ここでは行動を入力として、一つステップを進める関数を作成します。返り値はobservation(状態), reward(報酬), done(終了判定), info(これは使ってないのでよくわからない)が必要となります。
  • render(self, mode="human"):現在の環境の状態を描画・可視化する関数。引数のmodeは任意の文字列であんまし使ってないのでよくわかりません。使わない場合はpassにでもしておきましょう。

そして以下の2つの変数の用意も必要となります。

  • self.action_space:実際の行動の数を設定。
  • self.observation_space:状態空間の定義。状態における最小値と最大値をここで定義します。

以上の3つのメソッドと2つの変数を用いれば、無事にOpenAI Gym形式のシミュレータ完成です。以下にメモ程度のサンプルコードを書いておきます。

import gym

class Simulator(gym.Env):
    def __init__(self):
         # アクションの数の設定
         # (ex)ACTION_NUM=3
         self.action_space = gym.spaces.Discrete(ACTION_NUM) 

         # 状態空間の設定 
         # (ex)状態が3つの時で、それぞれの状態が正規化されている場合、LOW=[0,0,0]、HIGH=[1,1,1]
         self.observation_space = gym.spaces.Box(low=LOW, high=HIGH)

    def reset(self):
          # シミュレータの初期化処理
         return observation

    def step(self):
          # ステップを進める処理
         return observation, reward, done, {} #infoの部分は使わなかったので{}を返却

    def render(self):
          # シミュレータ環境の描画処理

終わりに

今回はOpenAI Gym形式のシミュレータ環境作成について書きました。とてもざっくりしているので詳細はgithubや以下の参考文献からご確認ください。それでは。ブッコロな

参考文献