본문 바로가기
Games/ML-Agents

[ML-Agents] ML-Agents 구성 요소 알아보기 - Agent Script

by NCTP 2024. 8. 14.

// 파이토치와 유니티 ML-Agents로 배우는 강화학습 책에 대한 공부 요약 글입니다.

 

개요

  ML-agents의 구성 요소를 간단하게 살펴보고, 그 중 Agent 스크립트의 구성요소에 대해 알아본다.

 

 

 

 

 


 

 

Agent Script - Max Step

  Max Step은 한 에피소드의 최대 스텝 수를 결정하는 값이다. Max Step이 5000으로 설정되어 있으면, 5000스텝이 지나야 한 에피소드가 종료된다.

 

  • 에피소드 (Episode) : 에이전트가 어떠한 환경 내에서 행동을 시작하고, 특정한 조건을 만족하거나 목표에 도달하여 행동이 끝날 때 까지의 여정 하나를 하나의 에피소드라고 부른다.

 

 

 

Agent Script 의 주요 함수 - Initialize

    public override void Initialize()
    {
        m_BallRb = ball.GetComponent<Rigidbody>();
        m_ResetParams = Academy.Instance.EnvironmentParameters;
        SetResetParameters();
    }

 

 

 Initialize 함수는 환경이 처음 실행될 때 한 번만 호출되는 초기화 함수이다. 각 오브젝트와 파라미터를 초기화한다. 일반적인 유니티 코드의 Start 또는 Awake의 개념과 비슷하다고 볼 수 있다.

 

 

 

Agent Script 의 주요 함수 - ColletObservations

    public override void CollectObservations(VectorSensor sensor)
    {
        if (useVecObs)
        {
            // 에이전트의 현재 회전 상태를 관측으로 추가
            sensor.AddObservation(gameObject.transform.rotation.z);
            sensor.AddObservation(gameObject.transform.rotation.x);
            // 공과 박스 사이의 상대 위치를 관측으로 추가
            sensor.AddObservation(ball.transform.position - gameObject.transform.position);
            // 공의 현재 속도를 관측으로 추가
            sensor.AddObservation(m_BallRb.velocity);
        }
    }

 

 

  CollectObservations 함수는 Unity의 ML-Agents Toolkit에서 에이전트의 관측을 수집하는 데 사용되는 중요한 메서드이다. 이 함수는 강화 학습 에이전트가 환경에서 학습하기 위해 필요한 정보를 수집하는 역할을 한다.

 

  위 스크립트를 확인해보면, 벡터 센서를 통해 관측하는 데이터는 총 8개이다. 

 

  • 게임 오브젝트(박스)의 x, z 회전량 : (2개)
  • 공과 박스의 상대 거리 좌표 (x,y,z) : (3개)
  • 공의 속도값 (x,y,z) : (3개)

 

Space Size가 8이라는 점에 주목

 

 

  이 때,  Behavior Parameters 컴포넌트의 Vector Observation - Space Size가 8인 이유가 바로 이것 때문이다. 우리가 벡터 관측하는 값들과 Space size를 동일한 값으로 설정해야 한다.

 

 

 

 

Agent Script 의 주요 함수 - OnActionReceived

    public override void OnActionReceived(ActionBuffers actionBuffers)
    {
        var actionZ = 2f * Mathf.Clamp(actionBuffers.ContinuousActions[0], -1f, 1f);
        var actionX = 2f * Mathf.Clamp(actionBuffers.ContinuousActions[1], -1f, 1f);

        if ((gameObject.transform.rotation.z < 0.25f && actionZ > 0f) ||
            (gameObject.transform.rotation.z > -0.25f && actionZ < 0f))
        {
            gameObject.transform.Rotate(new Vector3(0, 0, 1), actionZ);
        }

        if ((gameObject.transform.rotation.x < 0.25f && actionX > 0f) ||
            (gameObject.transform.rotation.x > -0.25f && actionX < 0f))
        {
            gameObject.transform.Rotate(new Vector3(1, 0, 0), actionX);
        }
        if ((ball.transform.position.y - gameObject.transform.position.y) < -2f ||
            Mathf.Abs(ball.transform.position.x - gameObject.transform.position.x) > 3f ||
            Mathf.Abs(ball.transform.position.z - gameObject.transform.position.z) > 3f)
        {
            SetReward(-1f);
            EndEpisode();
        }
        else
        {
            SetReward(0.1f);
        }
    }

 

 

 

  OnActionReceived 함수는 에이전트가 환경과 상호작용할 때 행동(action)을 받아 처리하는 데 사용되는 중요한 메서드이다. 이 함수는 에이전트가 행동을 취할 때마다 호출되며, 이 행동에 따라 에이전트의 움직임이나 환경에 대한 다른 영향을 처리한다.

 

  알고리즘을 통해 결정된 행동에 따라 에이전트 제어, 보상 결정, 에피소드 종료 조건 설정 들을 담당한다. 에이전트의 행동을 actionbuffers에서 읽어오고, 그 행동을 환경에 반영한다.

 

  • 결정된 행동에 따른 에이전트 제어 : 예시 코드에서는, 인덱스 0의 행동을 통해 z축으로 박스를 회전시키고, 인덱스 1의 행동을 통해 x축으로 박스를 회전시키고 있다.
  • 보상 결정과 에피소드 종료 조건 : 공이 떨어져서 박스 윗면과의 y좌표 거리 차이가 -2작고 x,z 축 방향으로 상대거리가 3 이상 차이가 나는 경우, -1의 Reward를 받고 에피소드를 종료한다. 그렇지 않았다면, 0.1의 Reward를 받고 게임을 계속한다.

 

 

 

Agent Script 의 주요 함수 - OnEpisodeBegin

 

    public override void OnEpisodeBegin()
    {
        gameObject.transform.rotation = new Quaternion(0f, 0f, 0f, 0f);
        gameObject.transform.Rotate(new Vector3(1, 0, 0), Random.Range(-10f, 10f));
        gameObject.transform.Rotate(new Vector3(0, 0, 1), Random.Range(-10f, 10f));
        m_BallRb.velocity = new Vector3(0f, 0f, 0f);
        ball.transform.position = new Vector3(Random.Range(-1.5f, 1.5f), 4f, Random.Range(-1.5f, 1.5f))
            + gameObject.transform.position;
        //Reset the parameters when the Agent is reset.
        SetResetParameters();
    }

 

 

  OnEpisodeBegin 함수는 각 에피소드가 시작될 때마다 호출되는 메서드로, 에이전트와 환경의 상태를 초기화, 학습 주기를 제어하는 기능을 수행한다.

 

  새로운 에피소드가 시작되면 이 함수가 호출되어, 에이전트의 위치를 초기화하거나, 목표의 위치를 재설정하거나, 환경 내의 다른 요소들을 초기화하는 작업 등을 수행할 수 있다.

 

 

 

 

Agent Script 의 주요 함수 - Heuristic

 

    public override void Heuristic(in ActionBuffers actionsOut)
    {
        var continuousActionsOut = actionsOut.ContinuousActions;
        continuousActionsOut[0] = -Input.GetAxis("Horizontal");
        continuousActionsOut[1] = Input.GetAxis("Vertical");
    }

 

 

  Heuristic 함수는 학습된 정책 대신 사용자의 입력에 따라 에이전트를 제어하는 방법을 결정하는 메서드다. 

 

  Behavior Parameters 컴포넌트에서 Behavior Type을 Heuristic Only 모드로 설정했을 때, Heuristic 메서드에 정의된 규칙에 따라 사람이 입력을 줘서 직접 에이전트를 제어할 수 있다.

 

 

 

Decision Requester, Model Overrider

 

 

  • Decision Period : 에이전트가 새로운 행동을 결정하는 스텝의 간격
  • Take Actions Between Decisions : 행동 결정 사이의 간격동안 이전에 결정된 행동을 반복할지, 아니면 아무런 행동도 취하지 않을지 선택하는 설정.

 

 

 

댓글