▲ 엔씨소프트 AI 시스템팀 한태경(좌) / 엔씨소프트 게임 AI랩 강화학습팀 박현수(우)

  • 주제: 리니지: 거울전쟁 - 강화학습 AI를 서비스로 출시하기까지
  • 강연자 : 한태경, 박현수 - 엔씨소프트 / NCSOFT
  • 발표분야 : 프로그래밍 / 데이터분석 / 프로덕션&운영 / AI
  • 권장 대상 : AI 엔지니어
  • 난이도 : 기본적인 사전지식 필요


  • [강연 주제] 최근 몇년 동안 OpenAI 5나 AlphaStar 등의 연구결과가 발표되면서 현재 강화학습 기술이 상용게임에 적용가능한 수준이라는 점이 명확해졌습니다. 그러나, 연구를 위해 게임을 이용할 때와 달리 실제 서비스를 위해 강화학습을 사용할 때는 다른 고려해야할 점들이 있습니다. 이 발표에서는 리니지: 거울전쟁 콘텐츠를 개발하면서 우리가 겪은 이런 문제들과 그 해결방법을 공유하고자 합니다.

    알파고가 등장한 이후 AI, 머신러닝은 각 분야에서 화두로 자리잡았다. 이는 게임업계도 예외는 아니었다. 이전까지 콘텐츠 제작 및 플레이의 보조적인 수단으로 여겨졌지만, 인간과 유사하게 혹은 그 이상의 플레이를 보여줄 수 있다는 가능성에 주목한 것이다. 실제로 몇몇 회사에서는 개발 중인 AI와 프로 게이머의 매칭을 통해 이 가능성을 확인하려고 시도하기도 했었다.

    엔씨소프트는 이전부터 이 분야의 가능성을 눈여겨보고 자사의 게임에 접목하는 모습을 보였으며, 리니지의 거울전쟁 등 여러 콘텐츠를 통해 유저들에게 선보인 바 있다. 거울전쟁은 이계 세력의 침공이라는 컨셉으로 진행된 콘텐츠로, AI들이 실제 유저처럼 혈맹 단위로 등장해 유저들과 경쟁을 하는 콘텐츠다. 매번 등장할 때마다 강화학습을 거쳐 진화, 마치 실제 유저와 대결하는 느낌이 들도록 설계한 것이 특징이다.

    엔씨소프트의 한태경, 박현수 개발자는 딥마인드나 오픈AI처럼 대규모 자원을 사용하지 않고도 어떻게 소수의 싸움이 아닌 MMORPG 내의 혈맹 단위의 유닛을 어떻게 강화학습으로 사람과 유사한 패턴을 보이게 설계할 수 있었는지, 이번 NDC에서 설명을 이어나갔다.




    ■ AI가 팀 단위로 복잡한 행동을 이행하게 하려면? 전통 AI 기술과 강화학습의 조합으로 구현한 거울전쟁


    리니지의 거울전쟁 콘텐츠의 초창기 목표는 리니지에 AI 플레이어를 도입, 유저들에게 새로운 경험을 제공하자는 것이었다. 기존 NPC와 달리 일반 유저와 같은 캐릭터에 스킬을 사용하고, 전략적이고 지능적인 플레이로 마치 다른 유저와 싸우는 것 같은 경험을 전달하자는 취지였다. 여기서 더 나아가 AI들이 사냥터를 통제하려고 드는 상황에서 유저들이 이에 맞서 대항하는 구도까지 최종적으로 정해졌다.

    리니지의 사냥터를 통제하기 위해서는 소수의 인원이 아닌 혈맹 단위의 인원이 필요한 만큼, 이를 AI로 구성해서 보여주기 위해서는 여러 가지 문제에 봉착했다. 박현수 개발자는 이 문제를 크게 강화학습 알고리즘과 학습 시스템의 최적화 및 개발 프로세스 두 가지로 구분했다.


    그 중 박현수 개발자는 강화학습 알고리즘에 대해 언급했다. 리니지 거울전쟁에서 사용할 AI에 강화학습을 적용하기 위해서는 우선 문제의 규모부터 파악하는 것이 중요했다. 강화학습팀에서는 이를 위해 게임 상태 및 캐릭터 상태 등 필요한 부분을 공식화하고, 수식으로 상태 조합의 경우의 수를 산출해냈다.

    그 결과 리니지의 게임 상태 조합이 모든 경우의 수를 나열하기 어려울 정도로 큰 상황이라는 결론이 도출됐다. 리니지에는 한 명의 캐릭터가 100가지 이상의 다양한 능력치로 구성되어있고, 캐릭터 클래스 10가지와 캐릭터 레벨 9가지만 구분해도 90가지의 수가 생기는 상황에 팀 인원이 8명이라고 치면 그 게임 상태의 규모를 일일이 보기 어렵기 때문이다. 여기에 환경 요소에 따라 각 캐릭터마다 10가지 이상 액션이 가능하니, 상태-액션 공간의 규모도 매우 크다.


    이렇듯 리니지에서 강화학습을 적용하기 위해서는 많은 자원이 필요한 상황인데, 복잡한 지형지물 통과 및 활용, 장거리 이동 등 강화학습만으로 해결하기 어려운 요소들도 있었다. 단순히 루트를 도는 정도가 아니라, 적을 찾아서 적극적으로 장거리 이동을 하는 것은 강화학습에서 해결하기 어려운 '탐색' 문제의 대표적인 사례였기 때문이다. 리니지에서는 적을 찾아서 장거리 이동을 거친 뒤 공격하는 행동이 꼭 보상을 담보로 하지 않고, 오히려 반격 당해서 사망하면 받는 페널티도 존재한다. 따라서 보상을 전제로 하는 일반적인 강화 학습 기법으로는 적용이 어렵다. 아울러 길목을 활용한 전략적 의사결정도 일반적인 강화학습으로 적용하기 어렵다.

    엔씨의 AI랩 강화학습팀은 이를 해결하기 위한 방안으로 상위/하위 수준 의사결정을 나눈 계층형 의사결정 구조를 도입했다. 그 중 AI가 이동해야 할 목표 위치를 설정하는 '배치'를 상위 수준에 두고, 그 다음에 직접 이동하고 전투 스킬을 사용하는 액션인 '전투'를 하위 수준에 둔 뒤 각각 4스텝, 매 스텝마다 실행하는 식으로 설계한 것이다. 배치 폴리시를 상위 수준 의사결정에 둔 이유는 기존 강화학습으로 직접 학습하기 어려운 장거리 이동을 다루기 위해서였으며, 여기에는 효용 함수나 탐색기법 등 전통적인 AI 기술을 적용했다.

    ▲ 강화학습으로는 어려운 문제를 해결하기 위해 전통적인 AI 기술도 더한 계층형 의사결정 구조를 구축하되

    ▲ Dota2에서 성과를 보인 OpenAI 모델을 참고했다

    이와 달리 전투 폴리시의 인공 신경망 구조는 오픈AI5와 비슷하게 구성했다. 오픈AI가 Dota2에 적용해서 성과를 보인 만큼, 리니지에서도 좋은 효과를 보일 수 있으리라 판단해서였다. 배치 폴리시의 출력은 전투 폴리시의 입력 중 하나로, 이를 전투 폴리시 단계에서 의사결정에 참고는 할 수 있으나 때로는 무시하고 더 중요한 다른 액션을 할 수 있도록 설계했다.

    지형지물을 이용하는 전략 요소를 넣기 위해서는 우선 지형을 분석하는 방식을 설계해야했다. 우선 거울전쟁에서는 기란감옥 2층이라는 한정된 공간을 사용하는 만큼, 계산 효율을 위해 지형의 모든 점대점 거리의 경우의 수, 즉 5,050X5,050개 거리의 정보를 사전에 계산하고 주요 위치 70개도 사전에 정의한 뒤 고전 AI 기술로 이동과 관련한 작업을 처리해나갔다.

    ▲ AI 플레이어들이 등장할 기란감옥 2층의 지형정보를 사전에 정리했다

    배치 폴리시에서는 그 다음 단계로 각 상황에 따라 주요 위치 70개에서 적과 아군의 영향력을 계산하는 작업을 거치게 된다. 이 수식에서는 적과 아군 캐릭터의 레벨, 이들과 주요 위치 사이를 고려해서 해당 지역의 위협도와 안전도 등의 값이 계산되며, 이와 유사한 방식으로 승률이 계산할 수도 있다. 여기에 게임의 관한 지식과 직관까지 더한 각종 효용 함수를 설계해 수식을 보완했다.

    이러한 계산이 끝난 뒤, 게임 상태를 평가하고 AI가 어디로 이동해야 하나 결정하는 단계가 남는다. 기본적으로 우리 편이 강하면 적이 있는 방향으로, 우리편이 약하면 적이 없는 곳으로 이동한다는 규칙을 정한 뒤, 앞서 계산한 승률이 높으면 '공격', 승률이 낮으면 '방어'로 전략을 결정하게끔 했다. 그 전략과 함께 주요 위치의 위협도, 안전도 등 영향력까지 계산해 최종 목표 위치를 결정하는 방식으로 최종 설계됐다.

    공격 상황에서는 위협도가 높은 위치로, 방어 상황에서는 위협도가 낮은 위치로 이동하는 등 목표 위치가 결정되면 이동 경로도 탐색할 필요가 있다. 이는 사전에 정의된 주요 위치 70개로 만든 그래프에 A*알고리즘을 사용, 이동경로를 찾고 첫 번째 위치를 다음에 이동해야 할 목표로 출력한다. 그리고 전투 폴리시가 이동 관련 보상을 받으려면 이 위치를 이동하게끔 해서 실제 이동이 진행될 수 있도록 했다.


    초창기에는 AI가 주변 지역을 타일 단위로 이동하는 액션을 취했으나, AI의 액션을 제한하지 않는 장점이 있는 반면 빠른 학습이 어렵다는 단점이 있었다. 이에 고수준 액션을 도입, 특정 적 또는 아군에게 접근 같은 직관적인 이동 액션 외에도 배치 폴리시에서 계산한 위협도, 안전도 값을 이용해 '뒤로 물러나기'나 '안전한 지역으로 후퇴하기' 등 추상적 이동 액션도 구현했다.

    거울전쟁에서는 이러한 복잡한 문제를 해결하는 것을 넘어서, 플레이어와 유사한 행동을 보여주는 AI를 설계해야만 했다. 일반적으로 강화학습 AI는 보상을 최대화하기 위해 행동하기 때문에 부자연스러울 우려가 있었던 만큼, 이를 최대한 줄이기 위해 또다른 관점에서 볼 필요가 있었다. 그래서 강화학습팀에서는 보상을 조정하고, 특정 조건에서 액션을 제한하는 식으로 설계를 해나갔다. 문제점이 있긴 하지만, 아직 경험상 이보다 실용적인 방법을 찾지 못해서 차선으로 고른 방안이었다.



    우선 팀플레이를 장려하기 위해 개인 보상에 팀 보상을 추가했으며, 이에 의거해서 보상 테이블을 우선 설정했다. 그럼에도 기획팀에서 아직 AI의 행동이 플레이어처럼 보이지 않는다고 지적했고, 그에 따라 보상을 추가하거나 조정하는 등 추가 수정 작업을 거쳤다. 또한 재미를 위해서 AI가 공격적으로 행동하게끔 유도하고, 불리할 때 계속 도망만 다니지 않도록 세부적으로 조정했다.

    이렇듯 거울전쟁에서는 강화학습과 전통적인 AI 기술을 두 층위로 나누어서 적용, 최대한 플레이어와 유사한 행동을 보이게끔 유도해왔다. 그러나 돌이켜보면 이 방식도 문제가 있다고 회고했다. 우선 전통 AI 기술 특성상 문제 상황이 발생할 때마다 그에 대응하기 위한 규칙, 효용함수 구조가 매번 추가되고 복잡해지는 문제가 있었다. 그래서 개발 후기에 가면 복잡해진 요구사항에 맞춰 함수와 규칙을 설계하는 것도 어려웠다.

    이를 해결하기 위해 엔씨소프트에서는 향후에는 상위 폴리시에 계층적 강화 학습(Hierarchical Reinforcement Learning, HRL) 구조를 사용할 방침이다. 다만 아직 기존 연구 중에 엔씨소프트에서 봉착한 문제에 적용할 방법이 많지는 않아 다양한 실험이 필요할 것으로 전망했다.

    ▲ 전통적인 AI 기술로는 예외 상황마다 규칙과 함수를 설계해야 하는 만큼

    ▲ 이를 보완하기 위해 HRL의 가능성에 주목, 연구 중이다

    또한 기획자의 의도대로 AI를 움직이게 하기 위해 보상함수를 조정하고 액션을 제한하는 조치를 취했는데, 기획자가 수정할 때마다 재학습이 필요해 실험이 어려웠다. 또한 일반 심층 강화학습 알고리즘은 특정 보상이 강화되는 방향으로 학습되는 경향이 있는데, 보상 가중치를 미세하게 변경해도 행동을 그에 맞춰 미세하게 변경하기 어렵다는 문제도 있었다.

    기획자의 의도에 따라 AI가 움직이게 하는 도구를 만들어야 한다는 과제가 남은 상황, 박현수 개발자는 원하는 행동 양식을 입력하면 그에 맞춰 행동하는 폴리시를 설계하거나, 혹은 독특한 행동 양식을 가진 여러 폴리시를 도입하는 두 가지 접근 방안을 언급했다. 그러나 이 두 연구 역시도 현재 엔씨소프트에서 겪고 있는 문제와 딱 들어맞는 케이스가 적어 많은 학습 시간이 필요하다. 박현수 개발자는 이를 어떻게 개선해야 하며, 문제를 어떤 식으로 해결해나가서 다음 번 거울전쟁 및 유사 콘텐츠를 더 정교하게 설계할 수 있을까가 강화학습팀의 고민 중 하나라고 설명했다.

    ▲ 기획자의 의도를 바로 AI가 반영할 수 있도록 구축하는 과정도 고민 중이다



    ■ 시뮬레이션부터 라이브 서비스까지 원활하게 하려면, 프레임워크가 필요하다


    AI 시스템팀의 한태경 개발자는 강화학습 프레임워크에 대해 설명하기 전에 시뮬레이터 개념부터 설명했다. 시뮬레이터는 강화학습 기본 개념에 입각해 게임 환경에서 관찰한 정보를 바탕으로 에이전트의 추론을 통해 행동하는 방향으로 구현한 것이다. 리니지에서는 워커라는 에이전트가 리니지 서버인 게임 환경을 통해 관찰하고 학습된 모델의 추론으로 전략을 도출하는 식으로 적용한다. 그리고 랭커 유저의 스펙을 가진 NPC를 Ai Player Character, 줄여서 APC로 잡은 뒤 앞서 도출한 전략이 각 APC가 어떤 행동을 해야 하는지 결정하는 방식으로 움직인다.

    APC의 각 행동들은 결정되면 매 정해진 시간마다 게임 서버로 전달되며, 시스템 팀에서는 워커가 게임 환경으로부터 관찰과 행동을 효율적이고 안정적으로 할 수 있도록 AI 프레임 워크를 제작하는 업무를 맡았다. AI 프레임 워크는 워커 사이드에 해당하는 리니지 Env 패키지와 게임 환경 사이드인 AI 시스템 라이브러리로 구성되어있으며, 크게 다섯 가지 역할을 담당하고 있다.


    우선 AI 프레임 워크는 던전 생성, 캐릭터 생성 등 학습 환경 조성에 필요한 API를 제공하며, APC에게 명령을 내려 조종하거나 이를 수행한 결과를 받을 수 있는 API를 조성한다. 또한 관찰한 Feature를 압축, 캐싱 등을 통해 효율적으로 관리하는 기능을 제공하고 다량의 패킷을 송, 수신할 수 있는 네트워크 구조와 로깅 기능을 제공한다. 그리고 워커, 게임 오브젝트들의 상태 기록과 통계를 통해 실시간 모니터링할 수 있는 기능도 제공한다.

    강화학습 콘텐츠 개발은 시뮬레이터 개발, 학습 시스템 구축, 모델 학습, 그 이후에 학습된 모델을 바탕으로 콘텐츠를 개발하고 런칭하는 총 5가지 단계를 거치게 된다. 각 파이프라인마다 여러 문제가 발생한 가운데 한태경 개발자는 그 중 세 가지를 언급했다.

    ▲ 강화학습 콘텐츠 개발은 이렇게 다섯 가지 단계를 거치는 가운데

    ▲ AI 프레임 워크는 여러 API를 제공, 콘텐츠 개발을 돕는다

    첫 번째는 게임 환경 업데이트를 즉각 반영해야 한다는 점이었다. 리니지를 기준으로 평균 20일 동안 약 110회의 데이터 및 코드 업데이트가 있는데, 이렇듯 온라인 게임 특성상 게임 환경이 끊임없이 변할 수밖에 없다. 이에 빠르게 적응하지 못하면 에이전트에 성능 저하가 발생하며, 또 업데이트 반영에 반복적인 작업도 많다보니 생산성도 저하되는 문제도 발생한다.

    이러한 문제를 해결하기 위해 시뮬레이터 업데이트 과정을 자동생성으로 전환했다. 자동생성 도구에서는 프로토버퍼로 Feature와 Action을 정의한 뒤, 정의된 코드 템플릿을 이용해 간단히 더블클릭만으로 리니지 Env 패키지와 AI 에이전트 라이브러리 로직이 생성되게끔 했다. 더 나아가 코드 자동 생성으로 관찰과 행동 로직에 Featuer 관리 로직, 학습 환경 조성 API, 비즈니스 로직 및 로깅까지 자동으로 생성되게 했으며, 그에 따라 콘텐츠 업데이트에 빠르게 대응하고 생산성이 향상됐다.


    그 다음으로는 학습 환경 구축과 모델 학습 단계에서 심층 강화 학습 모델의 구조적인 문제를 들었다. 심층 강화 학습 모델은 데이터를 통해 학습하는 만큼 많은 시뮬레이션과 데이터를 요구하는데, 라이브 서비스에 적용하는 만큼 콘텐츠 학습 시간을 최대한 줄여야 하는 과제가 주어졌다.

    이에 워커로부터 시뮬레이션 결과를 전달받고 개선된 모델을 다시 전달하는 러너(Learner) 프로세스를 더하고, 직접 시뮬레이션을 진행하는 워커의 군집인 워커팜에 각 워커가 시뮬레이터 구조대로 관찰하고 행동하는 게임 환경 3단계를 구현했다. 빠른 학습을 위해 러너는 5초마다 각 워커에 모델을 업데이트시켰으나, 워커가 늘어나면서 네트워크 대역폭 이상 트래픽이 발생해 리턴도 늦고 액션 패킷 요청도 딜레이되는 문제가 있었다.

    이를 해결하기 위해 각 물리머신당 프록시를 두고, 러너가 프록시로 각 머신당 1회만 모델을 업데이트한 뒤 프록시가 각 머신 내 워커들에게 배포하는 형태로 구성했다. 이것으로 네트워크 트래픽은 해결했으나 워커들이 관찰하고 행동하는 게임 환경에서 병목 현상이 생겼다. 싱글 서버로 학습하기엔 시뮬레이션 수가 부족했고, 학습을 위한 게임 환경 구축을 하기에는 시간과 기기 구입 비용 문제 등이 있었다.

    ▲ 러너를 더해 학습 시간을 줄이고자 했으나

    ▲ 트래픽이 방대해져서 중간에 프록시를 추가, 대역폭을 줄였다

    이에 도커를 이용해 게임 환경을 이미지화를 결정, 그에 맞춰서 윈도우즈 컨테이너화를 진행했다. 해당 작업은 시간이 많이 소요됐지만 컨테이너화 성공 이후, 업데이트, 스케일 아웃, 문제 발생시 자동 복구, 모니터링 등 여러 방면에서 이점이 있었다. 또한 인하우스 클라우드에서도 가장 효율적인 게임 서버 개수만큼 생성해 시뮬레이션 최대화를 할 수 있었다.

    마지막으로는 이렇게 방대한 시뮬레이션과 라이브 서비스 상황에서 오류를 어떻게 감지하느냐 하는 문제였다. 약 1,000개의 워커가 일주일 24시간 내내 학습 중인데, 이를 사람이 직접 탐지하기엔 로그가 너무 방대했기 때문이다. 이는 Watcher와 시각화 툴을 개발, 적용하는 것으로 해결했다.

    ▲ 시뮬레이션 최대화를 하면, 모니터링의 문제가 발생하는 만큼 이를 해결하기 위한 툴도 관건이었다

    Watcher는 주기적으로 로그를 분석한 후 메신저를 알리는 툴로, Feature 및 Packet에 비정상적인 부분이 있나 탐지하고 배틀로그를 기반으로 간헐적으로 발생하는 이슈도 패턴화시켜서 탐지하게끔 했다. 오류가 발생하면 어떤 머신에서 언제, 어느 빈도로 무슨 문제가 발생했나 요약한 내용을 개발진에게 메신저로 전달, 수정이 쉽도록 설계했다. 이외에도 게임 관련 정보도 요약해 메시지로 전송, 라이브 및 시뮬레이션 상황을 쉽게 모니터링 할 수 있도록 구성했다.

    여기에 시각화 툴로 로그를 기반으로 학습 및 라이브 서비스 상황을 시각적으로 재현, 어떤 흐름으로 문제가 발생했나 체계적으로 분석할 수 있는 환경도 조성됐다. 해당 툴을 통해 유저들이 거울전쟁에서 APC가 특정 지형에서 약하다는 점을 이용해 대응하고 있다는 점을 확인했으며, 이를 보완해서 다음 버전에 적용하도록 AI 성능을 업그레이드할 수 있었다고 설명했다.


    이렇듯 리니지 거울 전쟁에서는 계층구조와 고수준 액션을 사용한 강화학습에 보상을 적절히 설계해 인간 플레이어와 유사한 행동을 보이는 AI 플레이어를 선보일 수 있었다. 1주 안에 강화학습 과정을 마칠 수 있어 정기 업데이트가 가능했으며, AI 프레임워크를 통해 콘텐츠 개발의 생산성과 안정성도 확보했다. 그러나 앞서 언급한 것처럼 특정 지형에 약하다거나 하는 문제도 발견한 만큼, 이를 지속적으로 개선해 유저들에게 더 발전된 콘텐츠를 제공할 것이라고 덧붙였다.