여러분, 안녕하세요! 저는 CubeMD고, 오늘은 여러분들에게 제가 생츄어리 프로젝트에서 맡은 분야에 대해 이야기해보려고 합니다. 여러분들이 이야기를 들으려고 온 거지, AI 수업을 들으려고 온 건 아니니까, 세부 사항을 지나치게 파고드는 건 자제하면서 최대한 재밌게 진행해보도록 하겠습니다.
사실, 이 글을 진작에 썼어야 했다는 생각이 듭니다. 벌써 Enhearten Media와 6개월째 같이 작업하고 있으니까요. 저는 프로젝트에 자발적으로 참여했는데, 생츄어리의 아이디어가 마음에 들었을 뿐만 아니라, 제가 RTS 장르를 매우 좋아하기 때문이기도 합니다.
이것이 제가 다루고자 하는 내용들의 대략적인 요약입니다:
제가 누구인지, 또 무슨 일을 하는지
딥러닝과 강화 학습이 무엇인지
최종 목표
DOTS와 ML-Agents를 통한 최초 실험
다음 단계에 대한 요약
나 자신에 대하여
저는 고등학교 시절부터 비디오 게임이 어떤 식으로 작동하는지 배우기 시작했습니다. 그 때는 팀 포트리스 2, 레프트 포 데드 2, 킬링 플로어 2, 그리고 당연하게도, 마인크래프트 같은 게임들을 위해 모딩된 서버를 운영하고는 했죠. 제가 슈프림 커맨더를 접하게 된 건 2007년이었고, 비록 제 실력이 다 죽어가는 거북이만도 못하긴 했지만, 저는 모든 캠페인을 몇 번이고 반복해서 클리어할 정도로 게임에 애정을 쏟았습니다. 슈프림 커맨더는 이후로도 제 마음 한 구석에 소중한 추억으로 남았습니다... 제가 13년 뒤에 게임을 다시 발견해낼 때까지요.
제가 진지하게 게임 개발에 뛰어들까 고민해보기 시작한 건 2018년부터였습니다. 제가 처음으로 접한 게임 엔진은 언리얼이었지만, 이후에 유니티로 갈아탔죠. 제 특기는 게임 엔진, 특히 유니티로 강화 학습 환경을 디자인하는 것입니다. 저는 베타 단계부터 ML-Agents 툴킷을 사용해왔고, 게임 엔진과 파이썬 사이의 정보 교환, 평행화 학습, 그리고 알고리즘 그 자체에 대해 오랫동안 배웠습니다.
저는 강화 학습을 다양한 비디오 게임에 적용하는 실험을 해보았고, 에이전트가 월드와 상호작용하는 방식이 강화 학습에 중요하지만, 자주 과소평가된다는 사실을 깨달았습니다. 저는 커스텀 센서, 행동과 보상 시스템을 만들었고, 에이전트들이 제가 원하는 대로 행동할 수 있도록 대략적인 의사결정 시스템을 구상하기도 했죠.
AI와 학습
고전적 AI
AI에 대한 직관적인 접근은 대략 3단계로 요약될 수 있습니다:
당신이 해결하려고 하는 문제를 나름 잘 수행하는 사람을 찾으세요
그 사람의 (문제에 연관된) 지식과 행동을 압축해서 규칙 기반의 시스템으로 만드세요
이 규칙 기반의 시스템을 당신이 원하는 언어와 도구를 사용해서 프로그램으로 적용하세요
이 접근법은 비디오 게임의 역사에서 오랫동안 다양한 분야에 사용되어왔고, 그렇기 때문에 ‘고전적’ AI라고 불립니다. 제 동료 Uveso 가 그런 시스템을 맡아 작업하고, 이미 어느 정도는 완성시킨 상태죠. 이런 접근법에 관심이 좀 더 있으시다면 그의 개발자 로그를 읽어보시는 걸 추천합니다.
이 방식에는 굉장히 중요한 이점이 많습니다:
당신이 원하는 대로 작동합니다 – 규칙 기반 시스템은 단순하고, 디버그하기에도 간편하죠.
빠르게 작동합니다 – 논리를 작업하는 것에는 시간이 걸리지만, 규칙 자체는 즉각적으로 추가하고 적용하는 것이 가능합니다.
검증된 방식입니다 – 적용하는 것이 쉽지는 않지만, 다른 사람들의 수많은 경험들로부터 도움을 받을 수 있습니다.
학습 기반 AI
반면에, 학습 기반의 접근법은 앞서 말한 모든 이점을 포기하게 됩니다:
AI가 어떤 행동을 하는지 알 수 없거나, 정확하게 모릅니다.
설치와 훈련에 시간이 소요됩니다. 그 이전까지는, 제대로 작동하지 않습니다.
굉장히 새로운 기법입니다. 게임을 위한 코드나 관련 정보는 희귀하죠.
그렇다면, 왜 굳이 이걸 무릅쓰면서 학습 기반 AI를 사용하려는 걸까요?
딥러닝
또는, 신경 네트워크라고도 불리는 이 단어는, 지난 8년에 걸쳐서 수많은 논쟁과 이야깃거리의 화제로 떠올랐습니다. 두 문단만으로 이 단어의 의미를 설명하는 게 쉽지는 않으니, 난해하더라도 이해해주세요.
아래에 보이는 것은 몇 개의 변수를 기반으로 해 아파트의 가격을 추정해내는 신경 네트워크를 나타낸 모습입니다:
무언가 입력으로 들어가고, 무언가 결과로 산출됩니다.
초기에, 특정한 입력으로 산출되는 결과는 완전히 잘못될 것입니다.
이 그림은 아키텍쳐를 나타내고 있습니다 – 입력된 정보가 지나가 결과로 산출되는 길 말이죠.
훈련 과정에서, 우리는 네트워크에 여러 정보를 입력하고 그것이 어떤 결과를 산출하는지 지켜봅니다. 그 다음에 실제 답안과 비교해보면서 그게 얼마나 틀리게 나왔는지 확인하게 되죠. 미적분법과 역전파를 사용해서, 우리는 최대한 오류를 줄일 수 있는 방법으로 훈련 가능한 변수를 업데이트합니다. 알려진 모든 예시에 대해 이것을 몇 차례 반복하게 되죠.
그 외의 나머지는 그저 세부 사항입니다(중요하긴 하지만, 보조적이죠). 각각의 레이어가 일정한 변환을 거치고, 훈련을 통해 우리는 우리가 예상하는 결과를 산출해내는 변환을 찾게 됩니다. 이 접근법을 제가 배우게 된 것은 Alfredo Canziani를 통해서였습니다. 이 변환이 어떻게 일어나는지에 대해, 아래의 영상이 굉장히 훌륭한 예시를 보여주고 있으니 한 번 참고해보세요. (13:55 - 16:00)
이 네트워크들을 훈련시키는 것의 열쇠는 가능한 한 많은 예시들을 제시하는 것입니다. 신경 네트워크가 괄호를 채워 넣거나 답을 써넣는 식으로 학습한다고 보면 되는 것이죠. 만약 네트워크가 특정 품종의 개를 훈련 과정 중에 한 번도 보지 못했다면, 그 변수에 대해서 올바른 결과를 산출해내기를 바라는 수밖에 없습니다. 만약 어마어마하게 큰 네트워크에 인터넷에 있는 모든 사진들을 보여준다면, 잘 교육 받은 사람이 그렇듯이, 맹점이 극히 적어질 겁니다.
즉, 신경 네트워크는 예시를 통해 질문에 대한 답을 대략적으로 추론해내는 법을 배우게 됩니다, 이것을 비디오 게임에서 활용하는 AI를 만들어내기 위해서는, AI가 그 상황에서 어떻게 행동할 수 있는가에 대한 거의 모든 상황을 예시로 가져다가, 앞서 설명한 알고리즘을 통해 그것을 훈련시켜야만 합니다. 여기서, 그 대안으로 강화 학습이 등장하게 되죠.
강화 학습
우리는 환경의 상호작용에 대한 우리의 지식을 통해 에이전트에게 직접적으로 무엇을 해야 할지 명령하는 것을 피할 수 있습니다. 대략적인 보상을 제시해주고 에이전트의 목표가 에피소드가 끝나기 전까지 그것을 최대한 많이 수집해야 하는 것이라고(패배나 승리 때문에) 말해주는 식으로요. 이것을 하는 이유는, 모든 상황에서 더 ‘나은’ 행동이 존재하는 암시를 가지고 행동하는 시스템을 만들어내기 위해서입니다.
이 시스템이 있다면, 무수히 많은 예시를 수집하는 대신, 에이전트가 직접 게임을 플레이하고 최종적인 보상에 기반해 어떤 상황에서 어떻게 행동해야 더 나은 보상을 따낼 수 있는지 스스로 알아내게 할 수 있습니다.
좀 더 정확하게 말하자면, 훈련 중에, 시스템의 목표는 강화 학습 기반의 알고리즘을 사용해서 에이전트의 현재 상태를 이용하여 가능한 가장 높은 예상(평균) 미래 보상을 가져오는 행동을 생성하는 설정을 찾는 것입니다.
가장 간단한 설정은 특정 상황에서 특정 행동을 취했고, 이후에도 그 설정을 따랐을 때 평균적으로 얼마나 많은 보상을 받는지 기록하는 테이블을 만드는 것입니다. 이 테이블은 Q(품질quality)테이블이라고 불리게 되죠. 그리고 원하는 행동을 찾아내기 위해서는, 그것의 현재 상태에서 가장 큰 숫자와 연관된 행동을 찾아내기만 하면 됩니다.
강화 학습은 꽤 오래된 영역이고, 유틸리티 AI, 파블로프의 행동주의 학습이론, 그 외에도 다양한 분야에 연관되어 있습니다.
하지만 우리가 모든 상황-행동을 전부 돌려보고 싶지 않다거나, 상황-행동이 너무 많이 반복해서 PC에는커녕 우주를 다 뒤져봐도 넣을 자리가 없다면 어떻게 해야 할까요?
강화 딥러닝
그렇다면 신경 네트워크를 사용해 품질을 추론해내면 됩니다! 테이블에 일일이 상황-행동을 저장하는 대신, 신경 네트워크를 훈련시켜 우리가 원하는 대략적인 결과를 추론해낼 수 있도록 하는 것이죠. 즉, 강화 딥러닝의 영역은 두 기법을 조합해 강화 학습의 영역에서 값을 추론해낼 수 있도록 신경 네트워크를 사용하는 것이라고 할 수 있습니다.
물론, 실제는 글보다 더 복잡합니다. 강화 딥러닝은 여러 불안정성과 수학적인 재앙을 불러일으키니까요. 그럼에도, 강화 딥러닝은 사람이 일일이 만든 행동에 의존하지 않고 직접 문제를 해결하는 법을 찾아내는 시스템(보상이 일치한다면)을 만들어낼 수 있습니다. 강화 딥러닝은 또한 보간법을 가능하게 합니다 – AI가 비슷하지만 완전히 동일하지 않은 상황에서도 비슷하게 행동할 수 있게 해준다는 의미죠.
제가 위에 써놓은 설명들은 딥러닝과 AI 학습이라는 복잡한 주제를 제 이해만으로 최대한 간추려서 서술한 것이라는 걸 이해해주셨으면 합니다. 세계 최고의 천재들 중 몇몇이 이 주제를 연구하느라 평생을 보냈고, 최소한의 지식으로 최대한의 결과를 낼 수 있는 프로그램들을 개발해왔으니까요. 제가 서술한 것들은 관점에 따라서 달라질 수 있고, 수십년에 걸쳐 지금까지도 끊임없이 발전과 연구가 진행되고 있는 분야이기도 합니다.
그래서, 우리가 실제로 원하는 것은 무엇일까?
RTS 게임은 어렵습니다. AI에게도 마찬가지고요. 고전적인 AI에게 하드코딩으로 행동을 주입하는 것 자체는 가능하지만, 수백가지의 유닛, 자원, 전장에서 지휘해야 하는 수천개의 유닛, 그 밖에도 고려해야 하는 수많은 변수를 다 넣는다면 점점 어려워집니다.
그에 더해, 고전적 AI로는 개발자 측에서 최선의 행동을 미리 알고 있다고 생각하고 코딩을 해넣는 수밖에 없습니다. 전략 게임에서 플레이어들이 온갖 종류의 컨트롤과 전술을 마스터하고 그 와중에서도 상대의 전략에서 허를 찌르기 위해 연구하며 보내는 수천 시간을 생각해보면, 거의 오만하다고 할 수 있죠. 물론 그냥 AI가 초인적인 성능을 내게 만드는 것도 매력적이지만, 게임의 AI는 근본적으로 상대할 때의 재미를 위해 존재합니다. 재미 얘기가 나온 김에, 매 게임마다 똑같은 전략이 나오지 않도록 시작할 때 다른 전략을 선택할 수도 있어야 하죠.
게다가, 우리가 만들고 있는 게임은 문명 시리즈와 같이 AI가 먼저 나서기를 기다리며 수를 읽어내는 턴 기반의 게임이 아닙니다. 생츄어리와 같은 RTS에서는 앞서 서술한 모든 것들이 최소한의 사양을 잡아먹으면서도 실시간으로, 가능하다면 비동기성으로 작동해야 하죠.
흥미로운 게임플레이는 유연성을 요구해야 하고, 이것만으로도 우리가 규칙을 모조리 만들어내는 대신 AI에게 무엇을 하면 좋을지 가르치는 것이 충분히 매력적으로 다가옵니다. 그것을 달성하기 위해서, AI는 수천번의 게임을 직접 플레이해보고 바닥부터 성장해야 하죠. 인간의 게임플레이로부터 나온 데이터를 재활용하는 것도 가능하지만, 결국 성장하기 위해서는 직접 환경과 상호작용하며 배워야 하니까요. 이런 상황에서, 고전적 AI는 에이전트의 상대로 아주 유용합니다.
인식과 행동의 시스템을 사용해서, 서로 다른 목표를 달성하기 위한 에이전트를 만들어내는 것도 가능합니다. 단순히 상대로만 활용되는 대신, AI는 플레이어가 적과 싸우는 동안에 기지나 생산을 관리하도록 훈련될 수도 있습니다. 다행히도, 생츄어리 수준의 모딩 지원이라면 어려운 일이 아니고요.
정리하자면, 우리의 목표는 환경을 효율적으로 인식하고 상호작용할 수 있는 시스템을 만들어내는 것입니다. 그 다음에, 인간 플레이어의 상대나 그 밖의 다양한 용도로 활용될 수 있는 에이전트를 훈련시키는 것이고요. 오늘날, 일반적인 PC조차도 과거와 비교하면 실로 경이로운 양의 연산이 가능해졌고, 이 힘을 사용해 이전에는 보지 못했던 방식으로 게임을 즐기는 것이 가능해졌습니다. 학습 기반의 인공지능은 생츄어리와 같은 광대하고, 복잡한 게임에서 크게 활약할 수 있을 겁니다.
이미 완료한 것
우리의 최우선 목표 중 하나는 성능이고, ML-Agents가 생츄어리와 같은 규모의 전투를 감당할 수 있는지 알아내기 위해서, 우리는 우선적으로 단순한 게임을 통해 실험적인 DOTS 적용을 시험해보았습니다.
한계까지 성능을 시험할 수 있도록, 모든 에이전트는 개별적으로 조작되었습니다. 목표는 최대한 오래 살아남고 투사체를 피하면서 파랑 구슬을 모으는 것이었죠. 팀은 두 개로 나뉘었는데, 각각 다른 설정을 사용했습니다.
목표 자체는 단순히 성능 시험이긴 했지만, 에이전트들은 일종의 무리 행동이 가능하도록 단순한 하드웨어에서 2시간 정도 훈련받았습니다.
이 단순하고, 비정규적인 방식조차 프로토타입 인지 시스템에 의해 병목 현상을 겪는 중에서도 수천개의 에이전트들을 감당해낼 수 있었죠.
그 외의 완료된 작업들
제가 가장 최근에 맡은 일은 에이전트들이 결정을 내리는 방식과 연관이 깊었습니다. 일반적으로, 에이전트들은 특정 빈도에 맞춰 결정을 내리게 됩니다. 그러니, 0.1초마다 에이전트가 원하는 행동을 선택하고 환경이 그에 맞춰 반응하는 상황이라고 가정해 봅시다.
이 시스템은 실제 존재하는 무언가를 지속적으로 제어할 때에는 잘 작동하지만, 게임에서는 같은 질문을 계속 반복하느라 소중한 CPU의 연산 능력을 낭비하게 되죠. 이 현상은 특히 RTS 게임처럼, 특정 지역에 유닛이 도달하거나 건설이 완료될 때까지 기다려야 하는 상황일 경우 더 두드러지게 나타날 겁니다.
이 문제를 해결하느라 제가 여름 대부분을 쏟아부었고, 만약 이 분야에 관심이 많으시다면, 미디엄의 이 글을 한번 읽어보시는 걸 추천합니다.
짧게 줄이자면, 저는 유니티로 구글의 그 유명한 작은 공룡 게임을 옮겨다 재창조했고, 에이전트들에게 서로 다른 고정된 결정 빈도를 가지게 한 뒤 훈련시키는 방식으로 문제를 해결했습니다. 한 가지 유형의 에이전트도 이 작업을 수행하기 전에 지연을 출력할 수 있었습니다. 그것은 훨씬 더 낮은 결정 빈도와 더 안정적인 훈련을 가능하게 했죠.
비록 이것이 에이전트들이 환경과 상호작용하는 것처럼 모든 문제를 해결하지는 못하지만, 결정의 빈도가 줄어들었기에 더 많은 자유도와 함께, 더 좋은 최적화가 가능하게 했습니다. 이 작업 덕분에 관련 주제에 관한 여러 글들을 찾아보았고, 이제는 더 성능을 짜낼 수 있는 몇 가지 비장의 수를 준비해둔 상태입니다.
다음에 할 일
에이전트를 훈련시키기 위해서, 우리는 진짜 게임플레이처럼 작동하는 환경이 필요합니다. 생츄어리의 개발이 진행되면서, 저는 실험 환경 대신 진짜 게임에서 테스트를 하는 방향으로 점점 선회하는 중이고요. 에이전트를 훈련시키기 위해서 필요한 조건은 다음과 같습니다:
환경을 인식할 수 있어야 합니다. 유닛, 자원, 지형 등등에 대한 정보가 포함됩니다.
환경 속에서 행동을 취할 수 있어야 합니다. 유닛들을 선택하고 명령을 내릴 수 있어야 한다는 의미죠.
행동에 따라 보상을 받을 수 있어야 합니다. 꼭 승패와 연관되어야 하는 것은 아니고, 에이전트의 행동을 만들어나가기 위해 쓰이는 것입니다.
게임을 재시작할 수 있어야 합니다. 에이전트가 받는 것은 일종의 유격훈련과도 같습니다 – 실제 상황을 맞이하기 전에 끊임없이 연습 또 연습을 거듭하는 것이죠.
물론, 이런 조건들은 도타 2의 OpenAI fice나 스타크래프트 2의 딥마인드 알파스타 등을 염두에 두고 이야기하는 것입니다. 두 프로젝트 모두, 대부분의 시간을 결정, 인식, 그리고 행동 시스템을 개발하는 데 쏟았으니까요.
지각 시스템은 학습된 결정을 내리려면 필요한 모든 정보를 포착할 수 있어야 함으로 복잡해야 하지만, 저는 기사나 논문에 나온 것보다 더 단순한 컨트롤러를 에이전트들이 활용할 수 있다고 믿습니다. 여기서 컨트롤러는 일종의 가상 마우스로, 에이전트들이 이를 통해 인간과 비슷한 방식으로 유닛을 선택하고 명령을 내릴 수 있게 해주는 것입니다. 또한 AI가 인간을 상대로 할 때의 ‘불공정함’ 중 하나로 자주 언급되는, 동시에 모든 걸 조작할 수 있게 해주는 현상도 해결할 수 있겠지만, 이건 현재 제 주 관심사는 아닙니다. 맵핵이나 자원 증가같은 치트를 쓰지 않는 이상, 충분히 공정한 싸움이라고 생각하거든요.
이런 컨트롤러는 우리가 쉽게 리플레이 데이터를 활용해 에이전트를 ‘워밍업’ 시키는 것 또한 가능하게 해줍니다. 실제 플레이어의 행동을 그대로 따라하도록 한 뒤 훈련에 투입시키면 되니까요. 연구자들에 따르면, 이런 식으로 오직 리플레이 데아터와 충분한 양의 시간만으로도 경쟁 가능한 에이전트들을 훈련시킬 수 있었다고 합니다.
이런 모델들을 훈련시키는 데 필요한 연산의 양은 어마어마하지만, 이 회사들이 초인적인 성능을 목표로 잡고 최선을 다했다는 사실을 유념해주시기 바랍니다. 우리의 목표는 사전훈련과 다른 기법들을 통해 상대하기에 재밌고, 공개 멀티플레이어에서도 든든한 아군이 될 수 있는 AI를 만들어내는 것이니까요.
제가 생츄어리 프로젝트에 참요할 수 있도록 허락해준 Enhearten Media에게 감사드리고, 제가 이 글에서 한 약속을 지킬 수 있기를 바라며, 마지막으로 긴 글에도 불구하고 여기까지 읽어주신 여러분들에게 감사드립니다.