유니티 ML-Agents AI 훈련, 보상 설계, 그리고 학습 과정 완벽 가이드

단순히 정해진 패턴을 반복하는 게임 AI는 이제 구시대의 유물입니다. 유니티 ML-Agents는 머신러닝의 핵심 기술인 **강화 학습(Reinforcement Learning)**을 활용하여, 에이전트(Agent)가 환경과 상호작용하며 스스로 최적의 행동을 찾아내도록 학습시킵니다. 마치 코치가 선수에게 훈련을 시키듯, 보상과 페널티를 통해 인공지능의 성능을 끌어올리는 과정입니다.

이 가이드는 ML-Agents의 핵심 원리부터 시작해, 에이전트가 목표물을 찾아가는 간단한 AI를 직접 훈련시키는 코드를 심도 있게 다루고, 실제 학습을 진행하는 과정까지 상세히 안내합니다.


1. ML-Agents의 핵심 개념 심층 분석

효과적인 AI를 만들기 위해서는 ML-Agents의 각 구성 요소가 어떤 역할을 하는지 정확히 이해해야 합니다.

  • 에이전트 (Agent): 학습의 주체입니다. Agent 클래스를 상속받아 에이전트의 행동 규칙을 정의합니다. 에이전트는 환경에서 얻은 정보를 관찰하고(CollectObservations), 학습된 모델의 지시에 따라 행동하며(OnActionReceived), 성공과 실패에 따라 보상을 받습니다(SetReward).
  • 행동 파라미터 (Behavior Parameters): 에이전트의 ‘두뇌’ 역할을 하는 설정입니다.
    • 관찰 공간 (Vector Observation Space): 에이전트가 환경으로부터 얻는 수치 데이터의 종류와 개수를 정의합니다. 예를 들어, 자신의 위치(x, z), 목표물의 위치(x, z), 속도(x, z) 등입니다.
    • 행동 공간 (Action Space): 에이전트가 내릴 수 있는 행동의 종류를 정의합니다. Continuous는 속도, 회전력처럼 연속적인 값을, Discrete는 점프, 공격처럼 정해진 행동을 의미합니다.
  • 보상 시스템 (Reward System): 에이전트가 학습할 방향을 제시하는 가장 중요한 요소입니다. 목표에 도달하면 긍정적인 보상(예: +1.0f), 실패하면 부정적인 보상(예: -0.5f)을 줌으로써 에이전트가 어떤 행동이 옳은지 스스로 깨닫게 합니다.

2. 목표물 추적 에이전트 코드 (SeekerAgent.cs)

에이전트가 무작위로 생성된 목표물을 찾아가면 보상을 받는 시나리오를 구현합니다.

C#

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

public class SeekerAgent : Agent
{
    [Header("에이전트 설정")]
    public float moveSpeed = 10f;
    public Transform target;
    public Transform ground;

    private Rigidbody rb;

    public override void Initialize()
    {
        rb = GetComponent<Rigidbody>();
    }

    // 에피소드가 시작될 때마다 호출 (환경 초기화)
    public override void OnEpisodeBegin()
    {
        // 에이전트의 속도 및 회전 상태를 초기화합니다.
        rb.velocity = Vector3.zero;
        rb.angularVelocity = Vector3.zero;

        // 에이전트와 목표물의 위치를 무작위로 재설정합니다.
        transform.localPosition = new Vector3(Random.Range(-9f, 9f), 0.5f, Random.Range(-9f, 9f));
        target.localPosition = new Vector3(Random.Range(-9f, 9f), 0.5f, Random.Range(-9f, 9f));
    }

    // 에이전트가 환경을 관찰하는 함수 (시각/수치 데이터 수집)
    public override void CollectObservations(VectorSensor sensor)
    {
        // 에이전트가 목표물을 향해 나아가도록 돕기 위한 핵심 정보입니다.
        sensor.AddObservation(transform.localPosition); // 에이전트의 현재 위치
        sensor.AddObservation(target.localPosition);   // 목표물의 현재 위치
        sensor.AddObservation(rb.velocity.x);          // 에이전트의 X축 속도
        sensor.AddObservation(rb.velocity.z);          // 에이전트의 Z축 속도
    }

    // 에이전트가 학습된 행동을 실행하는 함수
    public override void OnActionReceived(ActionBuffers actions)
    {
        // 연속 행동 버퍼로부터 이동 방향을 받아옵니다.
        float moveX = actions.ContinuousActions[0];
        float moveZ = actions.ContinuousActions[1];
        
        // 행동 값을 기반으로 물리적인 힘을 가합니다.
        Vector3 movement = new Vector3(moveX, 0f, moveZ) * moveSpeed;
        rb.AddForce(movement, ForceMode.VelocityChange);

        // 시간 패널티: 시간이 지날수록 부정적인 보상을 줍니다.
        SetReward(-1f / MaxStep);
    }
    
    // 개발자가 직접 키보드로 조작하여 AI의 행동을 테스트하는 함수
    public override void Heuristic(in ActionBuffers actionsOut)
    {
        var continuousActionsOut = actionsOut.ContinuousActions;
        continuousActionsOut[0] = Input.GetAxis("Horizontal");
        continuousActionsOut[1] = Input.GetAxis("Vertical");
    }

    // 목표물이나 벽과 충돌했을 때 보상을 처리하는 함수
    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Target"))
        {
            SetReward(+10.0f); // 목표물에 도달하면 높은 긍정적 보상
            EndEpisode();      // 에피소드 종료
        }
        else if (collision.gameObject.CompareTag("Wall"))
        {
            SetReward(-5.0f);  // 벽에 부딪히면 큰 부정적 보상
            EndEpisode();
        }
    }
}

3. 유니티 설정 및 훈련 실행 가이드

  1. 환경 오브젝트 생성: 바닥(Ground), 벽(Wall)을 만들고 태그를 지정합니다. 에이전트 오브젝트는 Rigidbody, SeekerAgent.cs 스크립트, Behavior Parameters 컴포넌트를 부착합니다.
  2. 행동 파라미터 설정: Behavior Parameters 컴포넌트의 Vector Observation Space를 4(위치X,Z, 속도X,Z)로, Continuous Actions를 2(이동X,Z)로 설정합니다.
  3. 파이썬 트레이너 설정: config.yaml 파일은 에이전트의 학습 방식을 정의합니다. mlagents-learn 명령어를 실행할 때 이 파일을 지정하여 학습률, 배치 사이즈, 보상 방식 등을 제어할 수 있습니다.
  4. 훈련 시작: 터미널에서 다음 명령어를 입력합니다.Bashmlagents-learn <config 파일 경로>/config.yaml --run-id="my_first_seeker" 이 명령어는 파이썬 트레이너를 시작하고, 유니티와 연결할 준비를 마칩니다.
  5. 학습 모니터링: 훈련이 진행되는 동안, 별도의 터미널에서 tensorboard --logdir=results 명령어를 입력하면 학습의 진행 상황을 웹브라우저에서 실시간 그래프로 확인할 수 있습니다. 보상이 안정적으로 상승하는지, 에이전트가 제대로 학습하고 있는지 파악하는 데 필수적인 도구입니다.

이 가이드는 AI 에이전트가 스스로 환경을 탐색하고 목표를 달성하는 과정을 완벽하게 보여줍니다. 이 기본 원리를 바탕으로 캐릭터가 미로를 탈출하거나, 적을 추적하는 등 더욱 복잡하고 흥미로운 AI를 만들어보세요.

댓글 남기기