Unity_Lesson

全体のまとめ

UnityのML-Agents(Machine Learning Agents)は、ゲームやシミュレーション環境でAIエージェントをトレーニングするためのツールです。このツールは、強化学習(Reinforcement Learning, RL)とニューラルネットワーク(Neural Networks, NN)を組み合わせてエージェントの行動を学習させます。

1. 強化学習の基本概念

強化学習は、エージェントが環境との相互作用を通じて報酬を最大化する行動を学ぶための機械学習の一分野です。主な要素は以下の通りです:

2. ニューラルネットワークと方策学習

強化学習における方策は、ニューラルネットワークによってモデル化されることが多いです。ニューラルネットワークは、状態を入力として受け取り、行動を出力として返す関数として機能します。このネットワークは、トレーニングを通じて最適な方策を学習します。

3. Unity ML-Agentsにおける強化学習の流れ

UnityのML-Agentsでは、強化学習のプロセスは以下のように進行します:

  1. 環境の初期化:
    • エージェントの初期位置や環境の設定が行われます(OnEpisodeBegin()メソッドなど)。
  2. 観測の収集:
    • エージェントが現在の状態(環境の観測)を収集します(CollectObservations()メソッド)。これには位置、速度、センサー情報などが含まれます。
  3. 行動の選択:
    • エージェントはニューラルネットワークを使用して、収集した観測に基づいて行動を選択します(OnActionReceived()メソッド)。
  4. 行動の実行:
    • エージェントは選択した行動を実行し、環境に影響を与えます。
  5. 報酬の受け取り:
    • 環境はエージェントの行動に基づいて報酬を与えます。この報酬は、エージェントが目標に近づいたか、障害物に衝突したかなどに基づいて決定されます。
  6. 方策の更新:
    • エージェントは受け取った報酬に基づいて、ニューラルネットワークの重みを更新します。これにより、将来の行動が改善されます。
  7. エピソードの終了:
    • ある条件(例えば、目標地点に到達、制限時間切れ、落下など)でエピソードが終了し、次のエピソードが開始されます。

4. 学習プロセスと報酬信号

エージェントの学習は報酬信号を基に進行します。報酬が大きくなる行動を繰り返し、逆に報酬が少ない行動を避けるようにニューラルネットワークが調整されます。学習の過程でエージェントは、環境の状態をより良く観察し、効率的な行動を選択する能力を向上させます。

5. ML-Agentsにおける強化学習アルゴリズム

Unity ML-Agentsでは、一般的な強化学習アルゴリズムがサポートされています。最も一般的なのは、以下のアルゴリズムです:

まとめ

Unity ML-Agentsは、強化学習とニューラルネットワークを組み合わせることで、エージェントが複雑な環境での行動を学習することを可能にします。エージェントは、観測された状態を基に行動を選択し、環境から得られる報酬を最大化するように学習します。これにより、ゲームやシミュレーション環境でのAI開発が大幅に効率化されます。



エージェントスクリプトについて

エージェントスクリプトは、ML-Agentsの中心的なコンポーネントであり、このスクリプトで、エージェントが観測、行動、報酬を受け取り、どのように環境と相互作用するかを定義します。
Agentクラスを継承させたスクリプトを作成します。





エージェントスクリプトの例

以下は、簡単なエージェントスクリプトの例です。
このスクリプトでは、エージェントが特定の目標に到達したときに報酬を与える例です。

using UnityEngine;
using Unity.MLAgents;
using Unity.MLAgents.Sensors;
using Unity.MLAgents.Actuators;

public class MyAgent : Agent
{
    public Transform targetTransform;
    public float moveSpeed = 1f;

    // エピソードの開始時に呼び出されます
    public override void OnEpisodeBegin()
    {
        // エージェントとターゲットの位置をリセット
        transform.localPosition = new Vector3(Random.Range(-4f, 4f), 0, Random.Range(-4f, 4f));
        targetTransform.localPosition = new Vector3(Random.Range(-4f, 4f), 0, Random.Range(-4f, 4f));
    }

    // 観測を収集するために呼び出されます
    public override void CollectObservations(VectorSensor sensor)
    {
        // エージェントとターゲットの相対位置を観測
        sensor.AddObservation(targetTransform.localPosition - transform.localPosition);
    }

    // 行動を実行するために呼び出されます
    public override void OnActionReceived(ActionBuffers actions)
    {
        // 行動を取得
        float moveX = actions.ContinuousActions[0];
        float moveZ = actions.ContinuousActions[1];

        // エージェントを移動
        transform.localPosition += new Vector3(moveX, 0, moveZ) * moveSpeed * Time.deltaTime;

        // ターゲットに到達したら報酬を与える
        float distanceToTarget = Vector3.Distance(transform.localPosition, targetTransform.localPosition);
        if (distanceToTarget < 1.5f)
        {
            SetReward(1.0f);
            EndEpisode();
        }

        // 毎ステップ小さな負の報酬を与えることで、迅速な行動を促す
        AddReward(-0.001f);
    }

    // ヒューマンデバッグ用のヒント
    public override void Heuristic(in ActionBuffers actionsOut)
    {
        var continuousActions = actionsOut.ContinuousActions;
        continuousActions[0] = Input.GetAxis("Horizontal");
        continuousActions[1] = Input.GetAxis("Vertical");
    }
}





実際の処理の流れ

  1. ゲーム開始、ついでにエピソード開始
    • ゲームが開始されると、Unityシーンがロードされ、AwakeやStartなどが実行されたのち、エージェントとターゲットの初期位置が設定されます。ここでエージェントの初期状態が決まります。(OnEpisodeBegin)(ちなみにStartの方が先に呼ばれる)
  2. ステップ開始
    • ML-Agents環境が次のステップに進む準備をします。具体的には、次のフレームの処理を行う準備が整います。このタイミングで物理エンジンの更新や、シーンの状態の変化が行われることがあります。
  3. CollectObservations呼び出し(観測収集)
    • エージェントが環境の状態を観測するために、CollectObservations メソッドが呼び出されます。ここで収集される観測データは、エージェントの次の行動決定に使われます。
  4. OnActionReceived呼び出し(行動決定)
    • OnActionReceived メソッドが呼び出され、エージェントが決定した行動が環境に適用されます。この段階で、エージェントの行動によって環境が変化し、エージェントの位置や状態が更新されます。
  5. エピソード終了
    • エピソードが終了する条件が満たされると、EndEpisode メソッドが呼び出されます。この時点で、エピソードの成績や報酬が計算され、エージェントと環境の状態がリセットされます。
  6. 次のエピソード開始
    • 新しいエピソードが開始されると、再び OnEpisodeBegin が呼び出され、エージェントとターゲットの位置がリセットされ、新しいエピソードの準備が整います。これにより、環境が初期状態に戻り、新しい学習サイクルが始まります。



環境の更新がされるタイミング:

環境の更新はエージェントの行動が適用される際や、エピソードが終了する際に行われます。

AIにおける「環境」とは





エージェントスクリプトの詳細

エージェントスクリプトは、ML-Agentsの中心的なコンポーネントであり、このスクリプトで、エージェントが観測、行動、報酬を受け取り、どのように環境と相互作用するかを定義します。
Agentクラスを継承するスクリプトを作成します。

エージェントスクリプトの構成要素

  1. OnEpisodeBegin メソッド:
    • 目的: エピソードの開始時にエージェントの状態をリセットします。これにより、各エピソードが一貫して同じ条件から開始されます。
    • 使い方: 通常、エージェントやターゲットの位置をリセットしたり、エピソードに関する初期設定を行います。
    • コード例:
      public override void OnEpisodeBegin()
      {
          transform.localPosition = new Vector3(Random.Range(-4f, 4f), 0, Random.Range(-4f, 4f));
          targetTransform.localPosition = new Vector3(Random.Range(-4f, 4f), 0, Random.Range(-4f, 4f));
      }
      
  2. CollectObservations メソッド:
    • 目的: 環境の状態をエージェントに提供するために、観測データを収集します。これにより、エージェントは現在の状況を理解し、適切な行動を選択できます。
    • 使い方: 環境からの状態や特徴をセンサーを使って収集し、VectorSensorオブジェクトに追加します。
    • コード例:
      public override void CollectObservations(VectorSensor sensor)
      {
          sensor.AddObservation(targetTransform.localPosition - transform.localPosition);
      }
      
    • 説明: ここでは、エージェントとターゲット間の距離ベクトルを観測データとして追加しています。
  3. OnActionReceived メソッド:
    • 目的: エージェントが選択したアクションを実行し、報酬を設定します。エージェントの行動が環境にどのような影響を与えたかに応じて報酬を調整します。
    • 使い方: 行動に基づいてエージェントの位置を変更し、ターゲットへの距離を計算して報酬を設定します。
    • コード例:
      public override void OnActionReceived(ActionBuffers actions)
      {
          float moveX = actions.ContinuousActions[0];
          float moveZ = actions.ContinuousActions[1];
      
          transform.localPosition += new Vector3(moveX, 0, moveZ) * moveSpeed * Time.deltaTime;
      
          float distanceToTarget = Vector3.Distance(transform.localPosition, targetTransform.localPosition);
          if (distanceToTarget < 1.5f)
          {
              SetReward(1.0f);
              EndEpisode();
          }
      
          AddReward(-0.001f);
      }
      
    • 説明: ContinuousActionsから移動方向を取得し、エージェントの位置を更新します。ターゲットに近づくと高い報酬を与え、エピソードを終了します。毎ステップで小さな負の報酬を与えます。
  4. Heuristic メソッド:
    • 目的: 人間がエージェントの操作を試すための補助機能を提供します。デバッグや手動操作の際に役立ちます。
    • 使い方: キーボードやコントローラーの入力をエージェントのアクションとして変換します。
    • コード例:
      public override void Heuristic(in ActionBuffers actionsOut)
      {
          var continuousActions = actionsOut.ContinuousActions;
          continuousActions[0] = Input.GetAxis("Horizontal");
          continuousActions[1] = Input.GetAxis("Vertical");
      } 
      



エピソードとステップの違い



CollectObservationsOnActionReceived の呼び出しタイミング



ContinuousActions

ContinuousActionsについて



今回は使用していないが

DiscreteActions

詳細

これにより、エージェントは定義されたアクションセットから選択し、環境に応じた行動を取ることができます。

ContinuousActionsとDiscreteActionsについて





AddRewardSetReward の使い分け






ML-Agentsでの「ステップ数」の設定は、エージェントが環境内で行動を決定するためのサイクル回数に関わります。
具体的には、以下のような設定が関係します。

1. Max Step Count (最大ステップ数)

2. Academy Step Interval (アカデミー・ステップ間隔)

3. Time Horizon (タイムホライズン)

Time Horizonについて

4. Environment Reset

ステップ数の管理方法

これらの設定を適切に調整することで、エージェントの学習プロセスを最適化し、効果的なトレーニングを実現できます。