状態と観察
状態と観察とは
エージェントの行動によって、変化する環境の要素を「状態」と呼びます。
「強化学習」では、エージェントは環境を観 察して「状態」を取得し、その「状態」に応じて「ポリシー」が「行動」を決定します。
「状態」と似たものを表す用語として「観察」があります。
「状態」が「環境の持つ情報」なのに対し、
特有のエージェントが利用できる「部分情報」を「観察」と呼びます。
「完全観察環境」ではエージェントは環境のすべての情報「状態」を取得でき、
「部分観察環境」ではエージェントは環境の部分的な情報「観察」のみを取得できます。
・部分観察環境:観察 ⊂ 状態
・完全観察環境:観察 = 状態
「Unity ML-Agents」の基本データ型(浮動小数配列)の「観察」は、「Behavior Parameters」の「Vector Observation」で設定します。 それ以外にも各種センサーを使って、画像やレイキャストなど別形式の情報を「観察」として使用できます。
下記各種センサーにかんして説明します
+ Vector Observations
+ Camera Sensor
+ Render Texture Sensor
+ Ray Perception Sensor
+ Buffer Sensor
+ Grid Sensor
+ Rigidbody Sensor
+ Match3 Sensor
・Vector Observation
「Vector Observation」では、問題解決に必要な情報(位置や速度)を格納した配列を「観察」として利用します。
・実装手順
①.Behavior Parametersの設定
BehaviorName:
Vector Observation → SpaceSize:
Vector Observation → Stacked Vector:
過去の観察を決定の判断基準に利用する場合は、「Stacked Vector」の値を増やします。スタック数が2の場合は、現フレームの観察だけでなく、1フレーム前の観察も「決定」の判断材料として使うことになります。
(過去の経験を使う/使わない。使うとしたらいくつ使うかの判断は、環境に応じて人間が決定します。)
②.CollectObservations()の実装
CollectObservations()をオーバーライドし、引数として渡される「VectorSensor」のAddObservation()で観察値を追加します。 AddObservation()は以下のようにデータ型別に用意されています
・ void AddObservation(float observation):float値の観察(サイズ1)
・ void AddObservation(int observation) 値の観察(サイズ1)
・ void AddObservation(bool observation)値の観察(サイズ1)
・ void AddObservation(Vector3 observation)値の観察(サイズ3)
・ void AddObservation(Vector2 observation)値の観察(サイズ2)
・ void AddObservation(Quarternion observation)値の観察(サイズ4)
・ void AddObservation(int observation,int range):one-hot表現の観察(離散値数)
// 観測を収集するた めに呼び出されます
public override void CollectObservations(VectorSensor sensor)
{
// エージェントとターゲットの相対位置を観測
sensor.AddObservation(targetTransform.localPosition - transform.localPosition);
}
・観察を設定する際のポイント
「観察」を設定する際、気を付けるポイントをいくつか紹介します。