강화학습(reinforcement learning)은 기계 학습(machine learning)의 한 영역이다. 인간 및 여타 생물은 주어진 환경 속에서 자신에게 주어진 보상을 최대화하는 방향으로 행동을 결정하는 심리를 가지고 있다. 여기에 착안, 정해진 보상 체계에 따라 특정 행동을 보상하는 과정을 반복함으로써 AI가 목표 수행 방법을 학습하게 하는 방식이다.
국내서 일찍부터 AI에 투자한 엔씨소프트의 <리니지> 속 ‘거울전쟁’ 콘텐츠는 사람처럼 행동하는 AI를 통해 플레이어에게 새로운 경험을 제공하려는 동기로 출발한 콘텐츠다. 제작진은 강화학습 알고리즘과 고전 AI 기술을 함께 사용해 인간처럼 행동하는 적 NPC를 만들어낼 수 있었다. NDC22 2일 차 강연에 나선 엔씨소프트 한태경, 박현수 개발자는 그 자세한 과정을 공유했다.
강연자 : 한태경, 박현수
소속 : 엔씨소프트 AI 시스템 팀 / 엔씨소프트 게임 AI 랩
발표자 소개
한태경: 현재 리니지 AI 컨텐츠를 개발중. 이전에는 코쿤게임즈에서 클라이언트 & 서버 컨텐츠 개발, 아이온 서버팀에서 서버개발을 맡았다. AI 엔지니어에 관심도가 높았던 차에 좋은 기회를 얻어 현재의 팀에서 일하게 됐다.
박현수: 엔씨 게임 AI 랩 강화학습팀에서 강화학습 관련 기술 연구 개발을 하고 있다. 강화학습, 진화알고리즘을 게임인공지능에 사용하는 데 관심이 있다. 최근에는 PC <리니지> 거울전쟁 프로젝트에 참가했다.
거울전쟁은 사냥터를 통제하는 AI들에 맞서는 이벤트다. 거울전쟁의 NPC들은 기존 NPC와 달리 플레이어와 같은 스킬을 사용하고, 지능적인 플레이를 펼칠 수 있었다.
이벤트가 시작하면 AI 플레이어로 구성된 파티가 ‘기란감옥’맵 2층에 진입, 몬스터 보스를 사냥하고, 이때 다른 플레이를 발견하면 전투를 거는 방식으로 진행됐다.
이러한 AI를 완성하는 데까지는 크게 두 종류 문제가 발생했다. 첫째는 강화학습 알고리즘 차원에서 해결해야 할 문제, 둘째는 학습 시스템 최적화 및 개발 프로세스 차원에서 해결할 문제였다.
거울전쟁 콘텐츠의 AI 강화학습에서 개발진에게 주어진 도전 과제는 무엇이 있었을까?
첫째로는 게임 상태의 규모 문제가 있었다. 전체 게임 상태는 캐릭터별 상태와 캐릭터 조합으로 구성됐다. 플레이어 캐릭터에는 100가지 능력치, 10개 클래스, 9단계의 캐릭터 레벨(91에서 99까지)이 존재하기 때문에, 한 팀이 8명이라고 가정하면 이미 나열하기조차 힘든 큰 게임 상태가 된다
더 나아가 이 환경은 캐릭터들의 액션 조합에 따라 계속 게임 상태가 바뀌는, 멀티 에이전트 환경으로 볼 수 있다. 결과적으로 상태-액션의 공간 규모가 크기 때문에 강화학습을 위해서는 많은 자원이 필요했다.
둘째로, 강화학습 방식만으로는 해결하기 어려운 문제도 몇 가지 있었다. 그중 하나는 적을 찾아 이동하는 장거리 이동 학습이 어렵다는 점이다. 이는 전형적으로 강화학습 기법으로 해결하기 어려운 탐색 문제에 해당한다. 적을 찾아 공격할 때 보상이 주어져야 하는데, 이때 거꾸로 공격받아 페널티를 받기 쉽기 때문이다.
더 나아가, 기란감옥 맵은 좁은 길목을 활용해 소수로 다수의 적을 상대하는 전략적 의사결정이 필요한 경우가 많다. 이 또한 일반적 강화학습만으로는 학습이 어렵다.
이러한 ‘복잡한 게임 상태’와 ‘지형 문제’ 해결을 위해 개발진은 계층형 의사결정 구조를 사용했다. 상위수준의 배치 폴리시가 다음에 이동해야 할 목표 위치를 결정하고, 하위수준의 전투 폴리시가 실제로 이동 액션이나 스킬을 사용하게 했다.
이때 배치 폴리시는 전투 폴리시가 직접 학습하기 어려운 장거리 이동 부분을 다루기 위해 도입된 것이다. 배치 폴리시에도 HRL 사용을 시도했지만, 당시 상황에는 적용이 어려워 대신 전통적 AI 기술인 효용함수, 탐색기법을 사용해 보완했다.
배치 폴리시는 4스텝마다 전투 폴리시에 이동할 위치를 알려주고, 전투 폴리시가 이동 액션을 통해 위치에 도착하면 보상받는 식으로 작동했다. 전투 폴리시 입장에서는 배치 폴리시가 환경으로 작동한 셈이다.
배치 폴리시의 출력은 전투 폴리시의 입력 중 하나로 사용된다. 전투 폴리시는 배치 폴리시의 출력을 의사결정에 참고하겠지만, 자체 판단에 따라 무시하고 이동보다 더 중요한 액션을 취할 수도 있었다.
기란감옥 2층은 중앙에 큰 공간이 있고, 여러 작은 방과 좁은 복도로 구성된 맵이다. 가로세로 각각 96 타일로 된 맵으로 표현할 수 있으며, 따라서 이동 가능 타일은 5,050개다. 이런 크기에서 강화학습으로 이동과 전투를 학습하는 건 어렵다. 하지만 이동 작업만 고전 AI 기술로 처리하는 것은 어렵지 않다.
이후 진행되는 영향력 계산, 경로 탐색 등 작업의 기초 데이터는 임의의 두 위치 간 거리다. 이때 모든 5,050개 점(위치)에서 다른 5,050개 위치로 가는 점 대 점 거리를 미리 계산한 뒤, 런타임에서는 효율을 위해 해당 계산값을 참조하도록 했다.
같은 이유로 5,050개 점 중에서, 의사결정에 중요하게 작용하는 70개 주요 위치를 미리 설정해뒀다. 런타임에서는 지형 분석기가 데이터 파일로 저장된 지형 정보를 참조해 거리 계산과 경로 탐색 작업을 수행했다.
배치 폴리시의 다음 작업은 70개 주요 위치에 있어서 적과 아군 각각의 영향력을 계산하는 것이었다. 이때 적과 아군의 캐릭터 레벨, 각 캐릭터와 ‘주요 위치’ 사이의 거리를 고려해 해당 지역의 위협도/안전도 값을 계산하게 했다.
유사한 방식으로 게임 승률 예측도 가능했다. 예를 들어 적과의 거리에 따라 캐릭터에 닥친 위협도를 계산하고, 아군 대 적군 수 차이에 따라 승률을 계산하는 직관을 발휘할 수 있다. 이런 직관에 인게임 지식을 포함해 각종 효용함수를 설계했다.
이다음 게임 상태를 평가해 AI의 이동 위치를 결정하게 했다. 기본적으로는 아군(AI)이 더 강할 경우 적이 있는 위치로 이동하고, 반대로 아군 세력이 더 약할 경우에는 적이 없는 곳으로 목표 위치를 결정하게 했다.
또한, 예상한 승률이 높으면 공격, 낮으면 방어로 전략을 결정하도록 했다. 이렇게 결정한 전략, 그리고 70개 ‘주요 위치’의 위협도 및 안전도 등 영향력에 따라, 배치 폴리시가 최종 목표 위치를 결정하게 된다.
목표 위치가 결정되고 나면 현재 위치에서 목표 위치까지 경로 탐색이 이뤄진다. 사전 정의된 주요 위치 70개로 구성된 그래프 위에서 A*를 사용해 이동 경로 탐색한다. 이동 경로 상의 첫 번째 위치를 다음에 이동해야 할 목표로 출력하고, 전투 폴리시가 이동 관련 보상을 받으려면 이 위치로 이동해야 한다.
이때 원래는 주변 48개 타일을 목표로 하는 이동 액션을 사용했다. 이는 AI 액션을 제한하지 않는다는 장점이 있지만 빠른 학습이 어렵다는 문제가 있었다.
이를 고수준 이동 액션으로 해결했다. 배치 폴리시에서 계산한 위협도/안전도 값을 이용하면 “특정 적이나 아군에게 접근” 같은 직관적 이동 액션뿐 아니라 “뒤로 물러나기”, “안전한 지역으로 후퇴” 등 추상적(고수준) 이동 액션도 구현할 수 있었다. 이 덕분에 원래 목적이었던 1주일 안의 빠른 학습도 가능했다.
거울전쟁 콘텐츠는 실제 플레이어와 유사한 AI 캐릭터를 플레이어들에게 경험시켜주는 것이다. AI가 서비스로 완성되기 위해서는 기본적으로 플레이어와 비슷하게 행동하면서, 일부 상황에서는 기획자 요구사항에 맞춰 행동을 조정할 수 있어야 했다.
먼저 인간과 유사한 행동 구현 문제에서는 기본적으로 팀플레이를 장려하기 위해 기본적인 개인 보상 체계에 팀 보상을 추가하는 식으로 보상을 설계했다.
그런데 강화학습 AI는 보상 최대화를 위해서만 행동할 뿐이기 때문에 일반 플레이어처럼 보이지 않는 부자연스러운 행동을 할 수 있다. 관련하여 기획자가 가장 많이 지적한 문제는 AI가 아무 행동도 하지 않거나, 뭉쳐 다니는 등의 모습을 보일 때다.
그래서 이를 개선하기 위한 보상을 추가하거나 조정했다. 예를 들어, 일반 플레이어는 동료보다 자기 HP를 더 중요하게 생각하는 경향이 있다. AI 또한 자기 캐릭터를 우선시하게 만들기 위해, 아군 사망 시 페널티에 더해 자기 캐릭터 사망 시 페널티를 더해줬다.
강화학습 프레임워크 구축에서는 시뮬레이터의 경우 강화학습 기본개념에 따라 게임 환경에서 관찰한 정보를 바탕으로 에이전트의 추론을 통해 행동하는 방식으로 구현했다.
워커(worker)라는 에이전트가 리니지 서버 게임 환경을 통해 피쳐를 관찰하고 학습된 모델의 추론으로 전략을 도출한다. 랭커 유저 스펙을 가진 NPC를 APC로 부르는데, 앞선 단계에서 도출된 전략이 각 APC의 행동을 결정한다. 결정된 APC 행동은 정해진 시간마다 게임 서버로 전달된다.
시스템 팀은 워커가 효율적, 안정적으로 게임 환경 관찰과 액션을 취할 수 있도록 AI 프레임워크를 만들었다. AI 프레임워크는 워커 사이드인 리니지 환경 패키지(Lineage Env Package)와 게임 환경 사이드인 AI 시스템 라이브러리(AI System Library)로 이루어져 있다.
AI 프레임워크가 제공하는 것은 크게 5가지다. ▲던전 생성 및 캐릭터 생성 등에 필요한 학습 환경 조성 API ▲APC에게 공격, 이동, 스킬 사용 등 명령을 내리고 수행 결과를 리턴받을 수 있는 APC 명령 API ▲관찰한 피쳐를 압축, 캐싱 등을 통해 효율적으로 관리하는 피쳐 관리 API ▲다량의 패킷을 송, 수신할 수 있는 네트워크 구조와 로깅 기능 ▲워커, 게임 오브젝트들의 상태 기록과 통계를 통한 실시간 모니터링 기능
강화학습 콘텐츠 개발 파이프라인은 ▲시뮬레이터 개발 ▲학습 시스템 구축 ▲모델 학습 ▲콘텐츠 개발 ▲게임 콘텐츠 런칭 등 5단계로 구성된다. 파이프라인 상에서는 몇 가지 문제가 발생했다.
첫째는 게임 환경 업데이트의 즉각 반영 문제다. <리니지>는 온라인게임이기 때문에 게임환경이 끊임없이 변하고, 변화를 빠르게 적용 못하면 에이전트 성능저하가 발생하며 업데이트 반영에 반복적 작업이 많아 생산성 저하 문제도 발생한다.
시뮬레이터 업데이트는 요구사항을 확인한 뒤 리니지 환경 패키지와 AI 에이전트 라이브러리를 업데이트하고 시뮬레이터를 배포하는 과정으로 이루어진다. 여기서 패키지와 라이브러리 업데이트가 가장 반복적이며 오랜 시간이 걸리는데, 여기에 자동생성을 도입해 기존 1시간 소요되던 것을 10분으로 줄일 수 있었다.
코드 자동 생성 도구는 AI 프레임워크의 핵심이다. Protobuffer로 피쳐와 액션을 정의하고 정의된 코드 탬플릿을 이용하면 더블클릭만으로 리니지 환경 패키지와 Al 에이전트 라이브러리 로직이 생성된다. 그 결과 빠른 콘텐츠 업데이트 대응이 가능해졌고, 휴먼 에러가 감소했으며 생산성이 눈에 띄게 향상됐다.
둘째로는 학습 환경 구축과 모델 학습 단계에서 발생한 문제다. 심층 강화 학습 모델은 많은 시뮬레이션과 데이터가 있을 때 더 빠르게 학습할 수 있다. <리니지>는 라이브서비스 게임이기 때문에 콘텐츠 학습 시간 단축도 중요한 이슈였다. 따라서 시뮬레이션을 최대화하는 것이 도전 과제가 됐다.
학습 시스템 구조는 워커로부터 시뮬레이션 결과를 전달받고, 개선된 모델을 다시 워커로 전송해주는 러너 프로세스, 직접 시뮬레이션을 진행하는 워커들의 군집인 워커 팜(worker farm). 그리고 각 워커가 시뮬레이터 구조대로 관찰하고 행동하는 실제 게임 환경의 3단계로 이뤄져 있다.
러너는 5초마다 각 워커에 모델을 업데이트했는데, 이 구조로 인해 대역폭 이상의 트래픽이 발생하는 이슈가 생겼다. 물리 머신마다 프록시를 두는 방식으로 이를 해결했다. 러너가 프록시로 머신당 1회씩만 모델을 업데이트하고, 프록시가 머신 내 워커들에게 모델을 브로드캐스트하는 구조를 통해 트래픽을 대폭 감소시킬 수 있었다.
한편 워커들이 관찰, 행동하는 게임 환경에서 병목이 발생하는 문제도 있었다. 싱글 서버만으로 학습을 진행해서는 시뮬레이션의 수가 충분하지 않았다. 또한, 학습을 위한 게임환경 구축에는 시간과 머신 등 비용이 크게 발생했다.
이에 도커를 이용해 게임 환경을 이미지화했다. 윈도우 기반 게임 서버였고, 도커를 고려하지 않은 구조로 인해 윈도우 컨테이너화하기는 매우 까다로웠다. 컨테이너화에 성공한 이후에는 업데이트, 스케일 아웃, 문제 발생 시 자동 복구, 모니터링 등 많은 이점이 있었다.
세 번째 도전과제는 많은 시뮬레이션, 그리고 라이브 서비스 상황 안에서 오류를 탐지하는 방법이었다. 1,000개의 워커가 24시간 내내 학습 중이기 때문에 사람이 직접 탐지하기엔 로그가 너무 많았다.
이 문제는 와쳐(watcher)와 비주얼라이제이션 툴(시각화 도구)을 이용해 해결했다. 먼저 와쳐는 주기적으로 로그를 분석, 메신저로 알려주는 도구다. 비정상적인 패킷 및 피쳐가 있는지 확인하고 간헐적 발생 이슈도 배틀 로그를 기반으로 패턴화해 탐지할 수 있었다.
비주얼라이제이션 툴은 로그를 기반으로 학습이나 라이브 서비스 상황을 시각적으로 재현, 문제 발생 흐름을 확실하게 확인할 수 있게 하는 도구. 유저의 대응 방식이나 APC의 전투 방식, 보완할 APC 약점 등 인사이트를 얻는 데 도움을 주는 도구이기도 하다.
강화학습 측면에서 계층구조와 고수준 액션을 사용해 복잡한 문제도 해결할 수 있게 되었고, 보상을 적절히 설계해 기획자 의도를 반영하면서 인간 플레이어와 유사한 행동을 보이는 AI 학습이 가능하게 되었으며, 약 1주 안에 강화학습 과정을 마칠 수 있어 정기 업데이트가 가능하게 되었다.
학습 시스템 측면에서는 AI 프레임워크를 이용해 콘텐츠 개발에 생산성과 안정성을 확보했고 윈도우 컨테이너를 이용해 대규모 AI 학습환경 구축으로 학습 속도가 향상되었으며 이슈 탐지 도구를 통해 크리티컬 이슈 해결 및 이슈 자동 탐지가 가능했다.