見出し画像

Unityではじめる強化学習入門 / Pythonインターフェイス

1. Unity ML-AgentsのPythonインターフェイス

「Unity ML-Agents」のPythonインターフェイスには、通常の「Unity ML-Agents」の学習で利用するPythonスクリプト「mlagents-learn」の他に、Unity環境と直接やり取りできる低レベルなPython API「mlagents.envs」があります。

2. mlagents.envs

「mlagents.envs」を利用することによって、独自の学習用Pythonスクリプトを作成することができます。主なクラスは次の3つです。

.UnityEnvironment
.BrainInfo
.BrainParameters

3. UnityEnvironment

「UnityEnvironment」は、Unity環境とPython間のメインインターフェイスです。

Unity環境とPython間で通信するには、「Academy - Broadcast Hub - Control」でチェックが付いている「Brain」を使用している「Agetn」が存在する必要があります。

◎環境の生成
環境を生成するには、UnityEnvironmentを使います。「file_name」に「None」を指定することで、「mlagents-learn」と同様に「Unityエディタ」と直接通信することができます。

UnityEnvironment(file_name=None, worker_id=0, seed=1)
   file_name: 環境バイナリの名前(envと同じディレクトリに配置)。
   worker_id: 環境との通信に使用するポート番号
   seed: 乱数シード
   戻り値: UnityEnvironmentオブジェクト

◎環境の情報出力
環境の情報出力を行うには、print(str(env))を使います。
出力例は次の通りです。

Unity Academy name: MyAcademy
       Number of Brains: 1
       Number of Training Brains : 1
       Reset Parameters :

Unity brain name: MyBrain
       Number of Visual Observations (per agent): 0
       Vector Observation space size (per agent): 1
       Number of stacked Vector Observation: 1
       Vector Action space type: discrete
       Vector Action space size (per agent): [1]
       Vector Action descriptions:

◎環境のリセット
「環境」をリセットするには、、env.reset()を使います。

env.reset(train_model=True, config=None)
   train_model: trueで学習モード、falseで推論モード
   config: リセットパラメータの辞書
   戻り値: キー「Brain名」と値「BrainInfo」の辞書

◎環境の1ステップ実行
環境の1ステップ実行を行うには、env.step()を使います。

env.step(action, memory=None, text_action=None)
   action: 行動
   memory: メモリー(次ステップで取得するオプション入力)
   text_action: テキスト行動(単一文字列のオプション入力)
   戻り値: キー「Brain名」と値「BrainInfo」の辞書

「Academy - Broadcast Hub - Control」でチェックが付いている「Brain」が複数ある場合は、キー「Brain名」で値「行動」の辞書で指定する必要があります。

action = {'brain1':[1.0, 2.0], 'brain2':[3.0,4.0]}

◎環境のクローズ
環境のクローズを行うには、env.close()を使います。

env.close()

4. BrainInfo

「BrainInfo」は、観察や報酬など、BrainとBrainを利用しているAgentの情報を保持するクラスです。主なプロパティは次の通りです。

・visual_observations: ビジュアル観察の情報
・vector_observations: ベクトル観察の情報
・text_observations: テキスト観察の情報
・memories: 前ステップで送信されたメモリの情報
・rewards: 報酬のリスト
・local_done: エピソード完了のリスト
・max_reached: 最大ステップ数到達のリスト
・agents: AgentのIDのリスト
・previous_actions: 前ステップの行動

5. BrainParameters

「BrainParameters」は、「BrainInfo」のデータ要素の説明情報を保持するクラスです。「Brain」の名前や、「BrainInfo」の観察の配列の長さなどを提供します。

6. Unity ML-Agentsの学習サイクルをコードで記述

「mlagents.env」を使って「Unity ML-Agents」の学習サイクルをコードで記述すると次のようになります。

from mlagents.envs import UnityEnvironment
import numpy as np

# パラメータ
ENV_NAME = None # 環境ファイル名
TRAIN_MODE = True # 訓練モード
NUM_EPISODES = 10 # 学習するエピソード数
MAX_STEPS = 10 # 1エピソードの最大ステップ数

# 環境の生成
env = UnityEnvironment(file_name=ENV_NAME)

# Brain情報の取得
brain_name = env.brain_names[0]
brain_info = env.brains[brain_name]
action_size = brain_info.vector_action_space_size[0]

# 学習ループ
for episode in range(NUM_EPISODES):
   # 環境のリセット
   brain_info = env.reset(train_mode=TRAIN_MODE)[brain_name]

   # 1エピソードのループ
   for step in range(MAX_STEPS):
       print('episode:', episode, 'step:', step)

       # 行動の取得
       action = np.random.randn(1, action_size)

       # 1ステップの実行
       brain_info = env.step(action)[brain_name]

       # エピソード完了時の処理
       if brain_info.local_done[0]:
           break

# 環境のクローズ
env.close()


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