2018년 3월 26~29일에 열린 GTC 2018(GPU Technology Conference 2018)에선 머신 러닝 기반의 인공 지능(AI) 관련 세션이 많았습니다. 그 중 가장 많았던 것이 자율 주행이나, 머신 러닝 기반 AI를 게임에 적용하려는 세션도 일부 있었는데요. 딥마인드의 AI 연구 환경으로서의 스타크래프트 2(StarCraft II as an Environment for Artificial Intelligence Research)가 관심을 끌었습니다.
딥마인드에서 스타크래프트 2를 플레이하는 AI 프로젝트의 프로그래머인 Timo Ewalds. 블리자드의 리드 엔지니어인 Chris Lee가 강연.
딥마인드(DeepMind)는 구글의 AI 개발 기업으로 데미스 하사비스(Demis Hassabis)가 세웠습니다. 이 분은 13세에 세계 체스 랭킹 2위를 차지하고, 피터 몰리뉴(Peter Molyneux)의 수제자로 17세에 '테마 파크'의 공동 디자이너 겸 리드 프로그래머를 맡은 화려한 경력을 갖고 있습니다. 나중에 Republic : The Revolution를 개발했다가 게임 개발에선 은퇴, 이후 2010년에 AI 기업인 딥마인드를 설립했습니다. 2014년에 구글이 인수한 후엔 바둑의 AI인 알파고를 만들어 이세돌과 커제에게 승리를 거뒀습니다. 그리고 딥마인드는 스타크래프트 2: 자유의 날개를 다음 목표로 삼았습니다.
게임의 규칙을 모르는 AI
딥마인드의 AI 개발 배경과 스타크래프트 2용 AI 개발 프로젝트가 생겨나기까지의 과정부터 봅시다. 우선 딥마인드의 목적은 '지능이란 무엇인가'를 탐구하기 위해서라네요. 현재 주력하고 있는 건 강화 학습(Reinforcement Learning)이란 주제입니다.
지능은 '환경을 인식하고 행동을 선택'하는 존재로 이를 AI 에이전트라고 부릅니다. 그리고 'AI 에이전트의 행동'을 막연하게 AI라고 부릅니다. 강화 학습은 'AI 에이전트가 특정 환경에서 행동하는 것을 관찰해 피드백을 반복해 학습을 수행'하는 것을 가리킵니다.
하사비스가 게임 개발자 출신이다보니 딥마인드의 AI는 게임을 대상으로 한 경우가 많습니다. 딥마인드가 업계에서 처음으로 화제가 됐던 건 2015년에 아타리의 고전 게임기인 아타리 2600에 탑재된 게임 49를 AI가 플레이하여, 23개 타이틀에서 AI가 사람의 최고 기록을 넘어섰음을 밝혔을 때입니다.
딥마인드가 연구/개발하는 AI는 게임을 스스로 공략해가며 규칙을 만듭니다. 게임 프로그램의 어떠한 값도 제공되지 않습니다. 게임 설명서를 보거나 튜토리얼을 하지 않고 바로 게임에 들어가는 플레이어처럼, 화면에 표시되는 데이터만 가지고 바로 플레이합니다.
이런 AI는 게임의 기본 규칙조차 모르기에 바로 게임 오버를 맞이합니다. 스페이스 인베이더라면 '적의 총알에 닿지 않도록 피하면서 적을 격추'한다는 슈팅 게임의 기본적인 정보조차 모르니까 무작위로 움직이고 총알을 쏠 뿐입니다. 여기에서 중요한 건 게임 오버했을 때 이전 게임보다 점수가 높으면 '좋은 플레이를 했다'고 평가하는 것입니다. 이를 통해 같은 게임을 반복 플레이하면서 학습을 해나갑니다.
AI의 머신 러닝은 '연속된 게임 화면 이미지'와 '게임 조작에 해당되는 레버/버튼 입력', '기존 플레이와 비교 평가'를 가지고 수행됩니다. 이를 반복해서 머신 러닝하면 '게임 화면의 연속된 이미지에서 변화하는 데이터'와 '게임 플레이의 입력 데이터'를 가지고 '좋은 평가를 했다고 판단되는 학습 데이터'를 추출해낼 수 있게 됩니다. '게임 화면의 연속된 이미지 변화'와 '게임 플레이 입력 전환 데이터'는 상관이 없는 것처럼 보이지만, 이를 머신 러닝에서 고차원 데이터로 변환해 분석하면 '능숙한 플레이'와의 상관 관계를 도출해 냅니다.
시간이 흐르면서 바뀌는 임의대로 상하 이동하는 디지털 값의 변화인 음성 파형을 푸리에 변환해, 주파수 영역의 고차원 데이터로 변환하면 저음부와 고음부의 히스토그램을 추출할 수 있고, 해당 음성의 특성을 분석하는데 사용 가능합니다. 이는 딥 러닝으로 대표되는 머신 러닝과 유사합니다.
딥마인드는 아타리의 고전 게임을 이용해 실험한 후에 AI의 구조를 일반화하기 위해 더욱 어려운 게임에 도전합니다. 그 다음 도전 대상은 3D 게임으로, 여기에선 레이싱 게임인 TORCS(The Open Racing Car Simulator)의 타임 어택과, 둠과 비슷한 그래픽의 입체 미로에서 아이템을 먹으면서 탈출하는 1인칭 게임을 대상으로 비슷한 실험을 수행했습니다. 즉, 게임의 규칙은 전혀 알려주지 않고 게임 영상만 AI에 입력하며, 게임 조작이 가능하게 만든 후에 게임이 끝났을 때 평가하는 과정을 반복해 강화 학습을 수행한 것입니다.
TORCS
입체 미로의 탈출
결과를 보면 인간과 거의 비슷하거나 약간 떨어지는 수준까지 AI가 성장했음을 알 수 있습니다.
사람과 경쟁하는 AI로 발전
이들 실험에서 경험을 쌓은 딥마인드는 지금까지의 '싱글 플레이 게임'에서 '사람과 경쟁하는 게임'으로 무대를 올며가게 됩니다. 그 첫 무대가 바둑, 즉 알파고입니다.
바둑, 장기, 체스의 AI는 최고의 수를 두기 위해 평가를 수행해 다음 한 수를 결정합니다. 평가 함수에서 가장 간단한 건 '게임의 정석을 맞추면서도 무의미한 수를 배제하고, 자신과 상대에게 좋은 수의 후보군을 낸 다음, 자신에게 가장 유리한 것을 최고의 수로 판단'하는 알고리즘입니다. 이러한 평가 함수 기반의 AI는 바둑, 장기, 체스 등의 게임 규칙에 따라 프로그램을 짭니다. 지극히 당연한 것이죠. 그러나 딥마인드가 바둑을 위해 개발한 알파고는 바둑의 규칙을 전혀 모르는 AI며, 학습 방법 역시 아타리의 고전 게임용 AI와 같습니다.
바둑이란 게임은 세로 19줄, 가로 19줄의 직선이 교차하면서 생긴 점에 흰 돌과 검은 돌을 1개씩 교대로 놓는데, 이렇게 '한 수씩 진행하는 기보 데이터'를 19x19픽셀의 흑백 이미지 데이터로 만들어 알파고에 학습시켰습니다. 알파고는 한 판의 대국이 시작되고 승부가 지어질 때까지 '흰색 픽셀과 검은색 픽셀로 이루어진 19x19 픽셀의 이미지가 변해가는 사건'을 인식하고, 그 변화에 따라 '승리로 향하는 특징'을 학습했습니다. 바꿔 말하면 알파고는 바둑의 규칙 자체를 이해하지 않았습니다.
아타리의 고전 게임을 공략했을 때 사용한 AI와 다른 점은 알파고가 머신 러닝을 수행할 때 방대한 양의 정상급 바둑 국수끼리의 기보를 회선 신경망(Convolutional Neural Network, CNN)에 입력해 '기초 지식'으로 삼은 후, 기초 지식을 갖춘 AI끼리 서로 대국을 두게 했다는 것입니다. 그 결과 우승한 게임을 '좋은 기보'로 학습 결과에 추가해 배워 나갔습니다. 그리고 어떤 일이 생겼는지는 모두들 잘 알고 있지요. 이세돌 9단과의 경기를 4승 1패로 승리.
알파고의 결과에 만족한 딥마인드는 2017년에 알파고의 구조를 일반화해, 바둑과 비슷한 종류의 보드 게임을 위한 범용 AI인 알파제로 https://arxiv.org/abs/1712.01815 를 만들었습니다. 알파제로는 24시간의 머신 러닝만으로 기존의 최강 장기 AI였던 elmo, 체스 AI인 Stockfish와 100번 승부해 모두 이겼습니다.
딥마인드가 스타크래프트 2에 도전한 이유
바둑, 장기, 체스는 서로 경쟁하는 게임이지만, 보드의 모든 정보가 공개돼 있어 게임 상황에 관련된 데이터는 누구나 평등하게 알 수 있습니다. 그래서 딥마인드는 '상대가 나의 모든 상황을 파악하지 못하며, 나도 상대의 모든 상황을 파악하지 못하는' 지금까지와 좀 다른 환경에 맞춰 경쟁형 AI 개발에 진행하기로 했습니다. 그래서 선택한 것이 전 세계적으로 지명도가 높은 실시간 전략 시뮬레이션 게임인 스타크래프트 2입니다.
스타크래프트 2는 '상대의 상황을 모르기에 상대의 반응을 예측할 필요가 있다'는 점에서 지금까지의 게임과 크게 다르며, 이 외에도 아래의 5가지 요소가 있습니다.
1. 전투 유닛이 자유롭게 움직이며 공격 수단도 다양하고, 전투 유닛마다 다른 행동을 보입니다. 착수 위치가 정해진 바둑, 장기, 체스에는 없는 요소입니다.
2. 독특한 경재 활동이 이루어집니다. 자원을 모아 건물을 만들고 여기에서 유닛을 생산해야 합니다. 시설과 유닛을 어떤 규모로 언제 만들지가 중요합니다.
3. 게임이 실시간으로 진행됩니다. 바둑, 장기, 체스는 자신의 턴이 끝날 때까지 적이 기다려주지만(물론 시간 제한은 있음), 스타크래프트 2는 자신이 아무것도 하지 않는 동안에도 상대가 무언가를 할 수 있습니다.
4. 앞을 내다보고 전략을 정해야 합니다. 단기적으로는 자원을 수집하고, 그 자원으로 건물을 만들고, 그 건물에서 유닛을 생산한다는 목표를 세우지만, 결국은 적을 몰살해야 합니다. 이 궁극적인 목표를 위해 세세한 행동을 쌓아 나가야 하니 바둑, 장기, 체스와는 상당히 다른 전략 설계가 필요합니다.
5. 능력이 다른 종족끼리 싸웁니다. 바둑, 장기, 체스는 '상대방이나 나나 같은 능력'을 갖고 있지만, 스타크래프트 2는 서로 구성과 성능이 다른 종족을 선택해야 합니다. 평균적인 테란, 소수정예의 프로토스, 인해전술의 저그까지 3종족이 있으니, 어떤 종족을 쓰느냐에 따라 전술이 달라집니다.
이런 스타크패르 2를 공략할 AI를 개발하면서, 딥마인드는 스타크래프트 2가 가진 게임 역학을 분해하고 이해하는 과정을 우선 실시했습니다. 구체적으로는 게임의 전개 과정을 자원 확보, 시설 건축, 유닛 생산, 적과 대치의 4가지로 나눠, AI가 자원 확보, 시설 건설, 정찰, 영토 확장 중 무엇을 결정할지를 정리하도록 했습니다.
스타크패르트 2에서 시야가 확보되지 않은 영역은 검은 안개가 껴 있으며, 아군 유닛이 그곳에 도달해야 시야가 열립니다. 그리고 적 유닛이 시야가 확보된 곳에 침입하면 바로 파악이 가능하지요. 이 조건은 적도 마찬가지입니다. 자신에게 보이는 건 아군이 탐험된 장소 뿐이며, 적이 어디에 있는지를 알 수 없기에 적의 기지가 어디에 있는지, 적이 공격을 하는지를 파악하는데 있어 정찰이 아주 중요합니다. 또 영토의 확대는 아군의 시설을 건설해 나가는 것과 같습니다. 정찰과 관련이 깊으며, 적진을 향해 영토를 넓히는 전략과/적진에서 먼 곳에 시설을 건설하는 전략으로 나눌 수 있습니다.
AI 개발을 위해 SC2 API를 사용
문제는 AI를 만드는 방법입니다. 스타크패르트 2는 화면에 유닛과 건물 외에 각종 숫자가 표시됩니다. 게임이 펼쳐지는 지역을 보여주는 미니맵, 행동을 결정하는 아이콘, 자원 상태 표시가 있지요.
또 메인 화면의 건물과 유닛은 애니메이션 효과가 있습니다. 유닛이 화면이 좌우로 움직일때는 측면을 바라보고 이동하며, 상하로 움직일 때는 위아래를 보고 움직입니다. 이게 '같은 유닛이 다르게 움직이는 것'이라고 해석하려면 AI를 개발하기 전에 '화면에 표시된 개체를 인식하고 해석'하는 과정이 필요합니다. 이를 아타리의 고전 게임에서 했던대로 '연속된 이미지'를 입력해 처리하고 머신 러닝 기반의 AI를 수행하기란 현재의 컴퓨터 연산 능력으론 부족합니다.
사람은 이러한 처리와 전술 업데이트를 실시간으로 해냅니다. 스타크래프트 2 프로게이머인 Losira 황강호 선수가 게임을 플레이하는 영상인데, 단축키를 쉬지 않고 입력하고 있음을 알 수 있습니다.
딥마인드는 결국 블리자드 엔터테인먼트와 협력해, 스타크래프트 2의 움직임에 사용하는 SC2 API를 써서, '현재 진행중인 스타크패르트 2의 게임 상황(아군/적군의 정보)'을 이끌어내 컴퓨터 비전 처리의 부담을 줄이기로 했습니다. SC2 API는 스타크래프트 2의 애플리케이션으로 AI 개발을 위해 공개된 애플리케이션 개발 API입니다. 소프트웨어 스택은 위에 나온대로입니다.
이쯤 되면 아타리의 고전 게임을 공략할 때처럼 '이미지의 연속된 입력 정보로 판단한다'는 개념에서 상당히 벗어났다고 보여지나, 따지고 보면 알파제로도 실제 보드게임의 이미지를 보고 판단하는 것이 아니라 어디에 착수를 했는지를 따로 입력합니다. 그러니 스타크래프트 2도 정보 입력은 API로 처리한다고 치면 형평성이 어긋나진 않습니다.
소프트웨어 스택의 가장 아래는 스타크래프트 2 애플리케이션 본체입니다. 그 위의 s2client-proto는 스타크래프트 2의 제어 명령을 쓰는 네이티브 인터페이스입니다. 여기에서 순차 제어 프로토콜(스타크래프트 2를 제어하는 명령 코드를 실행 순서되로 정렬)을 스타크래프트 2 애플리케이션에 전송하거나 게임 진행 정보를 문의해 답변을 수신합니다.
s2client-proto의 S2client-api(C ++)나 PySC2 (Python)은 C++나 파이썬에서 스타크래프트 2와 상호 작용하는 인터페이스 API입니다. s2client-proto와 각 언어에 존재하는 함수 호출의 차이를 흡수하는 레이어라고 보면 됩니다. 딥마인드는 파이썬에서 SC2 API를 쓰는 PySC2를 오픈 소스로 공개했습니다. 덕분에 딥마인드 외에 다른 AI 연구자들도 PySC2를 사용해 스타크래프트 2 게임 AI를 개발할 수 있습니다. 링크는 https://github.com/deepmind/pysc2
최상층의 Command Center C ++ https://github.com/davechurchill/commandcenter 는 Memorial University of Newfoundland의 조교로, 에버퀘스트부터 오버워치까지 다양한 게임 AI를 연구하는 David Churchill http://www.cs.mun.ca/~dchurchill/ 가 개발한 C++ 기반 스타크래프트 2용 AI 개발 라이브러리입니다. 전투 유닉의 선택, 건물 건설 등 스타크래프트 2 게임을 진행하는데 필요한 전술 작업을 매크로 라이브러리로 구축했습니다. AI 개발에서 미들웨어라 볼 수 있습니다. David Churchill 는 다양한 게임을 다상으로 여러 라이브러리를 제공하고 있으며, 이런 라이브러리를 이용해 AI 관련 애플리케이션을 개발하는 사람이라면 쓰기 쉬운 툴입니다.
이 SC2 API를 써서 프로그램적으로 스타크래프트 2를 조작하는 과정과 사람이 조작하는 것의 차이를 보여주는 동영상입니다. 사람은 화면을 보고 키보드와 마우스로 조작하지만, AI는 손이나 손가락이 없으니 SC2 API 함수를 사용해 게임을 조작합니다. 그리고 SC2 API를 사용하면 Rendered, Feature Layer, Raw의 3가지 데이터를 얻을 수 있습니다.
Rendered는 실제 게임 화면을 가리키나, 화면 전체는 아니고 스타크래프트 2의 화면 구성 요소 중 특정한 것을 가리킵니다. 메인 화면이나 미니 맵, 명령 목록 등 '사람이 집중해서 보는 게임 화면에 가까운 부분을 잘라내는' 거라 보면 됩니다. 이렇게 획득하는 이미지의 해상도 자체는 자유롭게 설정 가능합니다. 사람에게는 전혀 쓸모가 없지만, 메인화면 전체를 128x128의 저해상도로 처리하는 것도 가능합니다. SC2 API가 AI 개발을 위해서 만든 게 아니라 여러 앱 개발에 쓸 수 있기에 이렇게 다양한 설정이 가능한 듯 합니다. 다만 현재의 머신 러닝에선 추상화한 저해상도 이미지가 학습에 적합한 경우도 있으니 유용한 기능으로 보입니다.
Feature Layer는 Rendered와 마찬가지로 게임 화면을 각 요소별로 잘라낸 것이나, 유닛의 종류/밀도/체력, 적과 아군의 유닛 분포 같은 정보를 써모그래프나 히트맵처럼 색을 입혀 추상화한 이미지입니다.
머신 러닝에서 학습이나 컴퓨터 비전 인식에 유용한 이미지로 게임의 정보를 얻는 셈입니다.
Raw는 게임 상황의 데이터를 그대로 '숫자 덩어리'로 만들어 구조체 데이터로 취급하는 것입니다. 이걸 사용하면 카메라(시점) 조작이나 마우스로 유닛을 선택하는 것과 상관 없이, 모든 게임 조작을 게임 세계의 좌표계를 통해 유닛이나 건물에 명령을 내릴 수 있습니다. 이것은 알고리즘을 따르는 프로그램 AI에 유용한 기능입니다. 물론 게임 플레이어의 입장에서 API를 호출하는 것이니 시야가 밝혀지지 않은 곳에 존재하는 적의 유닛 정보는 가져오지 못합니다. 허나 어떤 유닛의 API 호출도 가능해 AI를 공평하게 만들거나, 혹은 사기를 치는 것도 가능합니다.
스타크래프트 2의 게임 AI는 인간에 패배
딥마인드는 SC2 API의 이들 기능을 활용해 스타크래프트 2를 플레이하는 AI를 부분적으로 개발했습니다. 그 구조는 아타리의 고전 게임을 공략하는 AI나 알파 제로와 같습니다. '임의의 게임 조작과 그 결과 나타나는 연속적인 게임 이미지'를 통한 머신 러닝이지요. 그러나 스타크래프트 2의 경우 '연속된 게임 이미지'가 아니라 SC2 API를 통해 획득한 '게임 화면 요소를 해석한 이미지'가 됩니다. 대체로 위 동영상과 같은 식인데, 여기에선 Feature Layer의 이미지를 열거했으나 게임 AI에 실제로 이 이미지가 들어간다는 의미는 아닙니다.
딥마인드가 개발한 스타크래프트 2의 게임 AI의 일부에서 2개의 구조를 해석한 이미지입니다. (a) Atari-net은 게임의 메인 화면(Screen)와 게임의 미니맵(Minimap), 상태 정보(Nin-spatial feature)를 한 화면에 배치하고 운영하는 이미지를 입력해 나가는 것입니다. 스타크래프트 2의 게임 화면을 SC2 API가 컴퓨터 친화적인 요소로 분해해 이를 하나의 화면에 다시 배치하고 정리한 것을 머신 러닝에서 학습시키는 이미지입니다. (b) FullyConv는 메인 화면, 미니맵, 상태 정보를 한 화면에 배치하지 않고 정해진 순서대로 입력하고 머신 러닝하는 이미지입니다.
두가지 구조 모두 1프레임당 1개의 행동만 수행합니다. 사람과의 플레이 조건은 같습니다. 컴퓨터라고 해서 한번에 여러 조작을 연속으로 수행하진 않습니다. 또 게임 조작의 결정은 20프레임 단위로 진행합니다. 그 결과가 위 동영상입니다. 왼쪽은 간단한 머신 러닝, 오른쪽은 심화된 머신 러닝의 AI인데 오른쪽은 인간에 상당히 가까워졌습니다.
하지만 실제 사람과의 플레이에선 도저히 이기지 못합니다. 승률 0. 이건 프로 게이머를 상대로 이기지 못했다는 게 아니라 딥마인드의 직원과 붙어도 이기지 못했다고 합니다. 한층 더 나아가 스타크래프트 2에 탑재된 스크립트 기반 AI(Bot)도 이기지 못했으니 참패라고 봐도 될 겁니다. 이 경과는 StarCraft II : A New Challenge for Reinforcement Learning에 자세히 나와 있습니다. https://arxiv.org/pdf/1708.04782.pdf
딥마인드도 도전은 이제 시작에 불과하다고 말합니다. 연속적인 이미지로 게임을 판단하는 AI는 아타리 고전 게임, 알파고, 알파 제로에선 좋은 결과를 냈으나, 이 아키텍처가 RTS 장르에서도 그대로 쓸 수 있는지는 아직 판단하지 못한 듯 합니다. 현재 딥마인드는 사람을 이길 수 없다는 전제 조건 하에, 스타크래프트 2에서 주어진 상황을 해결하는 1인 플레이 미니 게임을 개발하고 이를 AI가 플레이하도록 해서 머신 러닝 중입니다.
이런 미니 게임의 플레이가 누적되면 언젠가는 실제 사람 수준의 실력을 발휘할 수 있을지도 모릅니다.
스타크래프트 2의 게임 AI가 인간을 이길 수 있을까?
현재 스타크래프트 2의 게임 AI는 Feature Layer에서 얻은 특수 이미지를 획득해 작동하기에, 실제 게임 화면에 표시되는 이미지만 보고 플레이하는 인간과 조건이 다르다고 할 수 있지만, 우선 이런 방식으로 첫 걸음을 떼는 건 당연하다 보입니다. 스타크래프트 2의 AI가 머신 러닝을 통해 강해지만 '아직 화면에 보이지 않는 적의 행동을 추측하고 거기에 맞는 전략을 세우게'되니 AI의 응용 범위는 더욱 넓어질 것입니다. 바둑 AI인 알파고가 보드게임 범용 AI인 알파 제로로 발전한 것처럼, 스타크래프트 2에서 높은 수준의 게임 AI를 실현하면 RTS 장르의 범용 AI로 발전시킬 수 있을 것입니다.
다만 RTS용 범용 AI가 완성됐다고 해서 이게 다른 장르에도 모두 쓸 수 있느냐고 묻는다면 그건 아닙니다. 예를 들어 축구나 농구처럼 많은 선수 유닛이 같은 무대에서 경쟁하는 스포츠 게임이라면 대충 적용이 되도, 야구처럼 움직임이 전혀 다른 분야라면 쓰기 힘들 것입니다.
스타크래프트 2에서 AI가 패배한 건 아직 도전 초기 단계임을 감안해야 하지만, 아타리의 고전 게임을 공략하는 AI나 알파고가 그랬던대로 '규칙을 모른 상태에서 게임 화면만 보고 플레이하는 AI'를 바꿔야 할 때가 온 것일지도 모릅니다. 즉 AI가 플레이 대상의 복잡성에 따라 여기에 맞는 신경망 구조나 학습 모델을 세우는 과정을 근본적으로 재검토할 필요가 생겼을지도 모릅니다. 이 세계에는 아직 딥마인드가 도전해야 할 게임이 많습니다. 딥마인드가 다양한 게임 AI 개발에 도전하면서 AI 재설계도 여러번 이루어져야 할 것입니다.
써놓고도 뭔 말인지 모르겠네요. 관심이 적어서 현재 A.I 개발이 어느 방향으로 이루어지는질 모르겠으니;;