5-10 FoodCollector
FoodCollectorの概要
「FoodCollector」は「エージェント」が「赤フード」
を避けながら「緑フード」を集めることを学ぶ学習環境です。
1エリアに4人のエージェントが存在し、敵対しています。エージェントは移動と攻撃ができ、他のエージェントに攻撃を当てると、相手のエージェントを4秒間行動を停止(凍結状態)にさせることができます。そして、「緑フード」取得時に報酬「+1.0」、「赤フード」取得時に報酬「-1.0」を受け取ります。
「GridSensor」を利用する学習環境のサンプルになります。

##
GridSensorについて
##
GridSensorの概要
「GridSensor」は、「レイキャスト」の持つデータ抽出による汎化性能と、「カメラセンサー」の持つCNNの画像処理能力を組み合わせたものです。
「カメラセンサー」が「幅✖️高さ✖️3」形式でカメラの映像情報を収集するのに対し、
「GridSensor」は「幅✖️高さ✖️チャンネル」形式で多種なオブジェクトの位置情報を収集し、CNNの画像処理能力で学習します。
「レイキャスト」や「カメラセンサー」には、以下のような制限事項があります。
レイキャストの制限事項
・エージェントの高さは、レイが観察すべきオブジェクトと同じである必要がある
・オブジェクトは、視線から隠されてしまう可能性がある。それらの知識が不可欠な場合は、LSTMなどで補う必要がある。
・レイの順序情報はモデルレベルで捨てられ、エージェントが学習しなければならないため、レイの数が増えると学習時間が長くなる
・レイの数が少なくなる、オブジェクトのサイズが小さくなるにつれて、オブジェクトを観察できなくなる
カメラセンサーの制限事項
・シーンのレンダリングが必要なため、学習時間が長くなる
・画面表示なしでエージェントを学習させることは不可能
・ゲーム内のオブジェクトのテクスチャを更新した場合、再学習が必要になる
・カメラセンサーで学習できるのは、RGBの3チャンネルのみ
これらの制限事項を回避するために考え出されたのが「GridSensor」になります。
GridSensorの学習データの確認
GridSensorで学習する学習データ「幅✖️高さ✖️チャンネル」の情報は、「GridSensor」の「ShowGizmo」をチェックすることで確認できます。
GridSensorの設定項目
GridSensor
の sensorName
は、そのセンサーを識別するための名前を指定するためのプロパティです。この名前は、エージェントが複数のセンサーを持っている場合に、それらを区別するために使用されます。たとえば、ML-Agentsのトレーニングログやデバッグ情報において、特定のセンサーの観察データにアクセスしたり、センサーごとに設定を変更する際に使用されます。
sensorName
の役割
- デバッグやトレーニングログ: センサーごとの観察データの確認やログの解析時に、どのセンサーがどのデータを生成しているかを区別するために役立ちます。
- 複数センサーの設定管理: 例えば、複数の
GridSensor
を使用してエージェントの異なる方向を観察する場合、それぞれのセンサーにユニークな名前を付けることで、個別に設定を変更できます。
設定例
// GridSensorの初期化時にセンサーネームを指定
var gridSensor = gameObject.AddComponent<GridSensorComponent3D>();
gridSensor.sensorName = "MyGridSensor";
gridSensor.cellSize = 0.5f;
gridSensor.gridSize = new Vector3Int(5, 1, 5);
このように sensorName
を設定することで、センサーが何のデータを収集しているのかを識別しやすくなり、トレーニングの際に役立ちます。
以下は、残りのGridSensorComponent3D
の各プロパティについての概要と解説になります。
1. SensorName (センサー名)
- 概要: センサーを識別するための名前を指定します。
- 解説: エージェントに複数のセンサーが設定されている場合、この名前でセンサーを識別します。名前はデバッグや学習データの整理に役立ちます。
2. CellScale (セルのスケール)
- 概要: グリッドの各セルの物理的な大きさを指定します。
- 解説: 各セルがワールド座標系上でどれくらいの範囲をカバーするかを決めます。大きい値を設定すると、広い範囲を低解像度で観察し、小さい値は狭い範囲を高解像度で観察します。エージェントの観察精度に影響します。
3. GridSize (グリッドサイズ)
- 概要: グリッドの大きさを3次元(X, Y, Z)で指定します。
- 解説: エージェントが認識する空間のサイズを決定します。例えば、
(5, 1, 5)
と設定すると、X軸方向に5、Z軸方向に5の範囲を持つ平面状のグリッドが作られます。これにより、エージェントはその範囲内で検出対象の情報を観察します。
4. AgentGameObject (エージェントのゲームオブジェクト)
- 概要: エージェントが自身の位置を基準に観察を行うためのゲームオブジェクトを指定します。
- 解説: 通常はエージェント自身のゲームオブジェクトを指定します。これにより、グリッドセンサーがエージェントの周囲をどのように観察するかが決まります。
5. RotateWithAgent (エージェントと共に回転)
- 概要: グリッドがエージェントの回転に合わせて回転するかどうかを決定します。
- 解説: このオプションを有効にすると、エージェントが回転した場合にグリッドもその向きに合わせて回転します。これにより、エージェントが常に自分の前方を中心に観察できるようになります。
- 概要: センサーで検出可能なオブジェクトのタグのリストを指定します。
- 解説: このリストに含まれるタグを持つオブジェクトだけがグリッドに記録されます。これにより、エージェントが重要なオブジェクトのみを観察するように制御できます。
7. ColliderMask (コライダーマスク)
- 概要: センサーが観察対象とするコライダーのレイヤーマスクを指定します。
- 解説: レイヤーマスクを使用して、特定のレイヤーに属するオブジェクトのみを検出するようにフィルタリングします。これにより、不要なオブジェクトの観察を避け、トレーニングの効率を高めます。
8. ObservationStacks (観察スタック)
- 概要: 複数フレームの観察データをエージェントに与えるためにスタックする観察フレームの数を指定します。
- 解説: 過去の観察結果を記憶させることで、時間的な文脈を持たせた学習が可能になります。スタック数を増やすと、エージェントは連続的な動作に対してより良い対応を学習しますが、データ量が増えるためメモリや処理コストも増加します。
9. CompressionType (圧縮タイプ)
- 概要: センサーの観察データを圧縮する方法を指定します(None、PNGなど)。
- 解説: 観察データのサイズを減らすために使用します。圧縮を使用するとデータサイズが減り、学習の速度が向上しますが、圧縮の種類によってはデータの品質が劣化する可能性もあります。
10. InitialColliderBufferSize (初期コライダーバッファサイズ)
- 概要: センサーで検出できるコライダーの初期バッファサイズを設定します。
- 解説: 検出できるオブジェクトの最大数を制御するために使用します。環境内に多数のオブジェクトがある場合、このサイズを適切に設定することで、効率的にメモリを使用できます。小さすぎると、一部のオブジェクトが検出されない場合があります。
11. MaxColliderBufferSize (最大コライダーバッファサイズ)
- 概要: コライダーを検出するためのバッファの最大サイズを設定します。
- 解説: バッファのサイズが大きいほど、多くのオブジェクトを検出できますが、その分メモリの消費量も増加します。最大サイズを超えるオブジェクトは無視されるため、環境に応じて適切な値を設定する必要があります。
これらの設定は、エージェントが環境をどのように観察し、どの範囲や対象物を検出するかに大きな影響を与える重要な要素です。それぞれのプロパティは、エージェントの学習精度やパフォーマンスに影響を与えるため、使用するタスクに応じて慎重に設定する必要があります。