단순히 정해진 패턴을 반복하는 게임 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. 유니티 설정 및 훈련 실행 가이드
- 환경 오브젝트 생성: 바닥(
Ground
), 벽(Wall
)을 만들고 태그를 지정합니다. 에이전트 오브젝트는Rigidbody
,SeekerAgent.cs
스크립트,Behavior Parameters
컴포넌트를 부착합니다. - 행동 파라미터 설정:
Behavior Parameters
컴포넌트의Vector Observation Space
를 4(위치X,Z, 속도X,Z)로,Continuous Actions
를 2(이동X,Z)로 설정합니다. - 파이썬 트레이너 설정:
config.yaml
파일은 에이전트의 학습 방식을 정의합니다.mlagents-learn
명령어를 실행할 때 이 파일을 지정하여 학습률, 배치 사이즈, 보상 방식 등을 제어할 수 있습니다. - 훈련 시작: 터미널에서 다음 명령어를 입력합니다.Bash
mlagents-learn <config 파일 경로>/config.yaml --run-id="my_first_seeker"
이 명령어는 파이썬 트레이너를 시작하고, 유니티와 연결할 준비를 마칩니다. - 학습 모니터링: 훈련이 진행되는 동안, 별도의 터미널에서
tensorboard --logdir=results
명령어를 입력하면 학습의 진행 상황을 웹브라우저에서 실시간 그래프로 확인할 수 있습니다. 보상이 안정적으로 상승하는지, 에이전트가 제대로 학습하고 있는지 파악하는 데 필수적인 도구입니다.
이 가이드는 AI 에이전트가 스스로 환경을 탐색하고 목표를 달성하는 과정을 완벽하게 보여줍니다. 이 기본 원리를 바탕으로 캐릭터가 미로를 탈출하거나, 적을 추적하는 등 더욱 복잡하고 흥미로운 AI를 만들어보세요.