[유나이트] 유니티의 AI와 머신 러닝 툴킷, 어떻게 사용해야 할까

게임뉴스 | 윤서호 기자 |


▲ 니콜라스 믈로 AI 리서치 디렉터

AI와 머신러닝은 최근 게임 개발자들 사이에서도 다방면으로 활용되고 있다. 일반적으로는 마치 플레이어가 조작하는 것처럼 적이나 NPC의 AI를 구축하는 방향으로 활용되지만, 그 외에도 AI를 활용해 워크플로우를 개선하는 등의 시도도 이어지고 있다.

특히 유니티에서는 비헤이비어 플래너, ML 에이전트 툴킷과 인퍼런스 엔진을 활용해 캐릭터의 행동 체계를 구축하는 작업에서 AI와 머신러닝을 활용하는 방법을 고안해왔다. 니콜라스 믈로 AI 리서치 디렉터, 빈센트-피에르 베르주 수석 ML 엔지니어, 만타스 푸이다 ML 엔지니어, 그리고 캐리 캐슬의 로빈 린드 닐슨 공동창업자는 유니티의 AI, ML 관련 기술과 이를 활용한 사례를 소개했다.




최근 몇 년간 AI, 머신러닝 개념이 각광받았지만 기초적인 AI 작업은 여전히 코드를 기반으로 이루어진다. 특히 게임 엔진에서 처리되는 AI는 비헤이비어 트리, 스테이트 머신, 유틸리티 AI를 활용하고 있다. 이러한 방식들은 기존의 명령형 프로그래밍과는 다른 리액티브 프로그래밍을 바탕으로 하고 있지만, AI를 활용한 문제해결이나 머신 러닝 등의 개념과는 약간 거리가 있다.

이를 보완하기 위해서 유니티에서는 AI 플래너와 ML 에이전트, 두 측면에서 접근했다 기존의 AI는 단순히 외부 조건에 반응하는 형태로 빌드업하고, 이를 더 정교하게 하기 위해 개발자가 컨디션을 세세하게 세팅하지 않도록 하는 방향으로 진행됐지만, 이 둘은 다른 방향으로 접근했다.

엔진 내 AI를 언급할 때 가장 기초가 되는 네비게이션을 예로 들면, 예전의 기초적인 AI 방식은 네비게이터 메시를 깔고 그 위에 스크립트를 얹은 뒤, 스크립트에 함수의 조건을 걸고 조건에 따라서 하나하나씩 호출하는 방식이었다. 이런 방식은 특정 구간을 어떻게 이동할 것이라는 방안은 제시하지만, 그 AI가 적용된 캐릭터가 의도한 것처럼 만족스럽게 구간을 돌아다닐 것이라는 의미가 되지는 않는다. 예를 들어서 '최단 거리로 이동하라'라고 했을 때 최단 거리에 대한 정보를 추가로 제공하고, 그 조건이 무엇인지 파악할 때 필요한 조건들도 다 세세하게 분류해야 하기 떄문이다.



▲ 네비게이션을 예로 들면, NavMesh를 쓰고 조건에 맞춰 호출하는 식으로만 구성하는 것으론 불충분하다

AI 플래너는 개발자가 어떤 조건을 사전에 제시해줘야 한다는 점은 동일하다. 그렇지만 어떤 상황일 때 어떻게 행동하라는 리액션을 하나하나 지시하지는 않는다. 골을 제시하고, 그 골의 조건과 행동에 소모되는 값을 주면 이를 내부에서 조건을 따진 뒤에, 해당 골을 위한 행동 체계를 만들어가는 식이다.

AI 플래너의 구조를 살펴보면 우선 엔진 내에서 서치하는 플래너, AI를 게임 내로 임베드하는 컨트롤러, 그리고 실제로 구동되는 게임의 세 측면에서 돌아간다. 엔진 내에서 플랜을 컨트롤러로 전송하면, 컨트롤러는 그 플랜에 따라서 AI를 게임 내에 임베드하고 해당 상황에 맞는 액션을 구현해내는 식이다. 그렇게 해서 생긴 결과를 스테이트 형태로 컨트롤러에 전송하고, 컨트롤러에서는 인스턴스를 플래너로 전송하는 식이다.




즉 AI를 살펴보기 위해서는 실제 게임에서 돌아가는 것보다는 엔진, 그리고 컨트롤러 사이에서 이루어지는 플랜과 인스턴스의 순환을 살펴볼 필요가 있다. 실제 게임은 단순히 그 두 곳에서 처리한 결과가 시각화되는 과정이기 때문이다. 그래서 플래너, 컨트롤러를 묶어서 플래닝 도메인이라고 지정하고, 여기에서 해결해야 할 문제들을 묘사하기 위해 플래닝 도메인 언어가 활용된다.




이번 강연에서는 플래닝 도메인 언어 가운데에 특성에 기반한 플래닝 도메인 언어를 예로 들었다. 포식자와 음식이라는 각각 다른 특성을 가진 개체가 있다면, 그 개체를 구분해주는 특성들을 우선 정리한다. 예를 들어 포식자가 음식을 먹게 하기 위한 파라미터는 로케이션 차, 굶주림 정도 등으로 구분이 되어있다. 이때 음식과 포식자가 서로 같은 로케이션에 위치해있으면, 그 특성 수치값이 변경이 되도록 전제조건을 부여했다. 그리고 그 결과 음식 오브젝트는 사라지고, 포식자의 굶주림 수치는 줄어든다.

이와 같은 단순한 로직도 조건반사적인 반응이 아니라, 포식자라는 에이전트가 효율적으로 행동하도록 설계할 때는 좀 더 복잡해진다. '어떤 것이 효율적인가?'라고 정의를 내려야 하고, 그 정의에 사용되는 기준들을 일일히 지정해줘야 하기 때문이다. 더군다나 그 개체의 특성이 다양해지면, 훨씬 더 그 과정이 복잡해진다. AI 플래너에서는 각각의 개별적인 특성에, 로케이션을 기반으로 해서 목표를 이루기 위해 가장 효율적인 과정이 어떤 것인지 체크해나가는 식으로 처리했다.









▲ 특성이 많아져도, 로케이션을 기준점으로 잡고 AI 플래너가 구성된다

현재는 단순한 AI를 구축하는 것뿐만 아니라, 머신 러닝을 토대로 계속 발전하는 AI도 화두가 되고 있다. 그렇다면 유니티에서 머신 러닝을 위한 ML Agent 툴킷은 어떻게 활용되고 있을까?

ML에이전트로 AI를 트레이닝하고 게임에 구현하는 데에는 크게 세 가지 단계를 거치게 된다. 게임을 셋업하고, 에이전트를 트레이닝하며, 이를 게임에 임배딩하는 단계로 구성되어있다.

먼저 게임 셋업 단계다. 게임 셋업에서는 먼저 유니티 Scene을 만들면서 시작된다. 이에 유니티 스크립트를 전체적으로 관리하게 되는 아카데미를 생성하게 되며, 그 안에 각각의 에이전트의 행동을 조정하게 되는 브레인이 포함된다. 브레인은 에이전트가 어떤 행동을 할지 옵저베이션을 통해 결정하고 통제한다. 예를 들어, 플랫폼 위의 공의 경우 에이전트가 하나씩 12개로, 행동하는 실제 캐릭터인 에이전트가 하나의 브레인에 연결되게 된다. 브레인은 이런 상황에서는 어떻게 할지, 무엇이 등장했을 때는 어떤 행동을 보여야 할지를 결정하는 역할을 한다.

브레인은 External, Internal, Player, 그리고 Heuristic의 네가지 모드로 나누어진다. External 브레인의 경우 아카데미에서 External 커뮤니케이터로 수집되어 파이썬(Python) API를 통해 선택한 라이브러리에 전달된다. Internal 브레인은 훈련된 모델을 만들어 게임에 실현하게 되며, Player은 플레이어의 입력을 통해 행동을 결정하고 Heuristic 브레인은 직접 코딩한 동작을 기반으로 행동을 결정한다.




이 개념을 접근할 때 유니티에서는 코드가 아닌, 티칭이라는 개념에서 접근했다. 그리고 그 대상이 무엇인지도 다시 정립해했다. 그런 관점에서 봤을 때 티칭의 대상은 개발자들이 흔히 말하는 에이전트가 된다. 에이전트의 행동을 보면 옵저베이션을 모으고, 그것을 토대로 미리 짜인 비헤이비어에 의해 액션을 한다.

그 옵저베이션에 해당하는 것은 위치정보, 속도, 회전 등 여러 가지가 있다. 이러한 정보가 모이고, 사람으로 치면 뇌에 해당하는 폴리시에 정보가 전달되면 그에 따라 액션이 지정되는 식이다. 그로 인해서 발생하는 결과가 옵저베이션으로 수집되고, 폴리시로 전달되고, 액션이 일어나는 일련의 순환 과정이 계속 발생한다. 폴리시와 에이전트는 유니티 머신러닝 에이전츠 툴킷에 오픈소스로 공개가 되어있다.



▲ 인체가 자극-전달-반응의 순환으로 학습하는 것과 유사한 구조다

이러한 일련의 순환 과정을 단순히 반복하는 것만으로 머신 러닝이 발생하지 않는다. 마치 사람이 생각 없이, 어떤 체계적인 트레이닝 없이 무언가를 반복한다고 해서 그것에 숙달되거나 하지 않는 것처럼 말이다. AI분야에서는 머신 러닝을 위한 학습 방식을 크게 강화 학습과 모방 학습 두 가지로 나눈다.

강화 학습은 에이전트가 환경에 대해서 어떤 정보를 볼 수 있고, 어떻게 판단할지를 정해서 훈련된다. 에이전트는 특정행동을 했을 때 보상이 주어지며, 보상이 없더라도 성공과 실패에 따른 긍정적인, 부정적인 반응을 보여주면 된다. 컴포넌트를 정하고 수백만 번의 시뮬레이션을 통해 진행되며 에이전트는 각 턴마다 액션에 대한 확률을 결정하게 된다. 시뮬레이션을 통해 얻은 경험을 통해 에이전트는 액션에 대한 확률 매핑인 폴리싱을 수정하게 된다. 에이전트는 보상 또는 긍정적인 결과를 최대한으로 하기 위해 액션 확률을 수정하게 되면서 트레이닝된다.

모방 학습은 직접 플레이어가 어떻게 행동할지를 가르쳐 주는 방식으로 진행된다. 플레이어가 직접 조종해 가르칠 행동을 보여주는 티쳐 브레인과 학습을 배우는 스튜던트 브레인으로 나누어져 있으며, 플레이어의 행동을 보고, 액션을 따라 하는 단순한 구조로 되어있다.




ML 에이전트 툴킷에서는 이 두 가지를 혼합해서 적용했다. 즉 에이전트가 경험을 하거나, 플레이어의 행동을 보고 따라하는 것을 통해서 배울 수 있도록 한 것이다. 그외에도 여러 알고리즘, 메소드, 예제를 샘플을 통해서 확인할 수 있도록 했다.

이와 같은 예제를 분석하고 따로 적용해서 만든 사례가 캐리캐슬에서 만든 '소스 오브 매드니스'다. '소스 오브 매드니스'는 로그라이트 액션 게임으로, 동일한 개체라고 해도 매번 만날 때마다 다른 패턴으로 플레이어를 괴롭히는 몬스터들을 구현해낸 것이 특징이다.




이를 구현하기 위해서 캐리캐슬에서는 머신 러닝 에이전트의 예제를 보고, 심플한 것에서부터 차근차근히 접근해나갔다. 최초에는 공 모양의 오브젝트를 주고, 충돌에 따라서 반응을 한다는 것부터 시작했다. 그 반응에 대해서 점차 알고리즘과 조건을 붙여나갔다. 그리고 AI 플래너의 예시처럼 로케이션에 기반, 각 특성에 따라서 가장 효율적인 움직임을 보이게끔 로직을 구축했다.

가장 효율적인 움직임이라고 인식하는 기준 설정은 강화 학습을 도입해서 해결했다. 어떤 환경에서 어느 정도로 신체 부위에 힘이 가해졌을 때, 플레이어와 충돌이 일어나서 데미지를 입히는지 등을 산출하고, 그에 따른 보상은 시각화해서 보여지지는 않지만 게임 내에서는 처리가 되게끔 한 것이다. 이렇게 정해진 뒤 시뮬레이션이 계속 진행되면서, 상황에 따라서 플레이어가 상대하기 까다로운 패턴을 구사하는 몬스터를 구현할 수 있게 됐다.


'소스 오브 매드니스'는 소규모로 개발된 작품인 만큼, 규모가 큰 작품에서 이러한 툴이 제대로 작동할지 의문이 들 수도 있다. 뿐만 아니라 구동하는 플랫폼이 달라져도 퍼포먼스가 동일하게 이루어지는지 여부는 개발자들이 항상 신경을 쓰는 부분이다.

이를 해결하기 위해서 유니티에서는 지난 3월부터 ML 에이전트도 유니티 인퍼런스 엔진을 활용할 수 있도록 업그레이드했다. 유니티 인퍼런스 엔진은 유니티 랩스에서 개발한 제품으로, IL2CPP, 버스트 컴파일러, 컴퓨트 셰이더와 같이 유니티 크로스 플랫폼 기술에 기반을 두고 있다. 해당 업그레이드를 통해서 유니티가 지원하는 모든 플랫폼에서 유니티 ML 에이전트 툴킷으로 제작한 신경망 모델을 동일하게 실행 가능해졌다. 또한 CPU, GPU 부하가 기존 대비 비약적으로 줄어들어서 더욱 방대한 신경망 모델을 적용할 수 있게 됐다.



▲ 유니티 인퍼런스 엔진 덕에 모든 플랫폼에서 머신러닝, AI 관련 기능을 동일한 퍼포먼스로 활용 가능해졌다

댓글

새로고침
새로고침

기사 목록

1 2 3 4 5