게임에서 수치는 아주 민감한 부분입니다. 어떤 게임에서는 크리티컬 확률 1% 차이로 공략에 실패하는가 하면 누군가는 어제오늘 달라진 아이템 드랍율에 웃기도 울기도 합니다. 그런 만큼 기획자가 머리를 쥐어 싸매고 최고의 값을 낸다고 생각해도 실제로 받아들이는 유저에게는 최악으로 다가올 수도 있습니다.

그렇다면 게임의 흥망성쇠를 좌우하기까지 하는 이런 수치들을 단순히 기획자에게만 의존해야 할까요? 그렇지 않습니다. 주변에는 컴퓨터라는 최고의 값을 찾아내는 기계가 있으니까요. NDC 3일차 강단에 오른 박스앤위스커의 박장시 강연자는 바로 그 방법에 대해서 소개하기 시작했습니다.

데이터를 통해 게임 속 최적의 값을 찾아내는 방법. 이번 강연에서 알려드리겠습니다.



■ 사람이 정하기엔 수치는 너무나 중요하다. 기계가 정하게 할 순 없을까?



오늘 강연의 주제는 바로 ‘데이터를 이용한 게임 밸런싱’입니다. 제가 이 강연을 한 이유는, 우선 제가 게임을 정말 좋아해서인데요. 저한테 있어서 게임은 숫자로 가득 찬 세상입니다. RPG 게임을 예로 들자면 온갖 스텟들이 있고 FPS 게임의 경우에는 총기의 데미지, 속도, 재장전 속도 등 다양한 수치들이 있는 걸 볼 수 있습니다. 이런 수치들은 모두 개발자들이 한 땀씩 구현한 건데요.

제가 봐온 기획자들은 이런 수치를 전부 일일이 정할 뿐 아니라 업데이트에 맞춰 각종 수치를 스프레드시트를 통해 수정하거나 테스트하곤 했습니다.

▲ 게임은 온갖 수치가 그래픽이란 옷을 입고 있는 세계다

그런데 전 그 모습을 보고 의문이 들었습니다. ‘이런 수치를 사람이 임의로 정해도 될까?’ 하는 의문이었죠. 기획자분들이 수치를 막 집어넣는다고 생각해서 그런 게 아닙니다. 입력한 수치가 과연 재미를 극대화할 수 있는 걸 상정하고 수정한 수치인가 하는 거였죠. 기계를 이용한다면 최적의 수치를 찾을 수 있지 않을까 하는 생각을 저는 하게 됐습니다.



■ 기계를 이용해 최적의 수치를 찾자


전 우선 A/B 테스트로 최적의 수치를 찾을 수 있는지 직접 시험해 봤습니다. A/B 테스트는 2개의 시안에 대해서 테스트를 해보는 거로, 2개의 시안 중에서 어떤 게 과연 더 좋은지 파악할 수 있는 간단한 테스트입니다.

우선 제가 준비한 게임은 플레이어랑 컴퓨터가 52장의 카드 중에서 각각 5장을 갖고 한 장씩 내서 점수가 높은 쪽이 이기는 아주 단순한 게임인데요. 여기서 게임의 재미를 살릴 수 있게 크리티컬 카드를 집어넣었습니다. 숫자를 2배로 높여주는 카드죠. 그런데 여기서 한 가지 문제가 발생하게 됩니다.

▲ 크리티컬 확률을 몇으로 할 때 유저들은 제일 좋아할까?

보통은 기획자들이 아주 깔끔하게 정리할 겁니다. 이런 분야에는 도가 튼 분들이니까요. 그런데 만약 의견이 갈린다면 어떡할까요. 한쪽은 10%가 좋다, 다른 쪽은 20%가 좋다고 할 때 어떻게 정하는 게 좋을까요. 그 고민을 A/B 테스트로 해결할 수 있습니다.

한쪽은 크리티컬 확률이 10%인 A군, 다른 쪽은 크리티컬 확률이 20%인 B군으로 나눈 다음 테스트를 해서 유저들이 좋아하는 지표를 구하면 되는 겁니다.

본격적인 A/B 테스트에 앞서 다양한 설계를 했는데요. 시뮬레이션에서는 각각 1000명씩, 총 2000명의 유저를 지정하고 게임을 200번씩 즐기도록 했습니다. 그러면서 Fun Index라는 지표를 넣어서 유저들이 재미를 얼마나 느끼는지 수치화했습니다. 이걸 위해 다양한 가정을 넣었는데요. 게임에 이기면 Fun Index가 1점 상승하고, 지면 떨어지게 하는 거에서부터 적당히 크게 이기면 많이 상승하게, 하지만 너무 크게 이기거나 지면 떨어지도록 했습니다.


즉, A군과 B군에서 어느 쪽의 Fun Index가 높은지 컴퓨터로 시뮬레이션해보자는 거였습니다. 물론 미리 이 수치가 절대적이라고 할 순 없습니다. 이건 실제 유저를 대상으로 한 게 아닌 가상 시뮬레이션이었으니까요.

테스트 결과, 크리티컬 확률이 20%인 사례가 10%인 사례보다 Fun Index가 높은 걸로 나왔습니다. 앞서 의견이 갈렸던 상황이라면 크리티컬 확률이 20%인 게 유저들이 좀 더 좋아한다는 결과가 나왔으니 이대로 업데이트하면 되겠죠.

▲ 테스트 결과 크리티컬 확률이 20%인 B군이 Fun Index가 높았다

그런데 문제가 있습니다. 지금은 시뮬레이션이라 상관없지만 유저를 대상으로 한다고 할 때, 테스트의 비용이 발생한다는 겁니다. B군과 A군의 Fun Index 차이가 곧 비용의 손해로 다가왔습니다. 44.25의 차이가 발생했는데, 실험 참여 유저가 10만 명이라고 한다면 약 2.2억 원의 손해가 발생한 거죠.

그리고 또 다른 문제도 있었습니다. 세상은 시시각각 바뀐다는 거였습니다. 테스트에서는 가정이 바뀌지 않습니다. 하지만 실제로는 그렇지 않죠. 나중에 되니 압도적으로 이기는 게임이 Fun Index 수치를 높게 잡아야 할 수도 있습니다. 결국, 시간이 지날수록 처음에 얻은 지표와는 달라질 수가 있다는 겁니다.

▲ 실제 유저를 대상으로 할 경우 약 2.2억 원의 테스트 비용(예시 기준)이 발생하고

▲ 현실에서 재미의 요소는 언제든 바뀔 수 있는데 시뮬레이션은 이를 간과하고 있었다

누군가는 테스트가 부족한 게 아니냐는 말을 하기도 하는데, 이건 테스트 사이즈와는 상관없습니다. 유저의 성향이 바뀐 거니까요. 결국 A/B 테스트를 개선할 필요가 있었습니다. 그렇게 개선한 테스트가 바로 MAB(Multi-Armed Bandit) 테스트였다.



■ MAB 테스트로 손해를 최소화하고 지속 가능한 테스트를 하자



결국 A/B 테스트를 보완할 대안이 필요하죠. 그 대안이 바로 MAB(Multi-Armed Bandit)입니다. 여기서 암(Arm)은 슬롯머신의 손잡이를 뜻하는 말인데요. 슬롯머신 아시죠? 돈을 넣고 손잡이를 잡아당기면 확률에 따라 돈을 받을 수 있죠. 그럼 슬롯머신이 많다면, 여기서 한가지 짚고 넘어가야 할 게 있습니다.

슬롯머신이 10개라고 할 때, 100번이나 한다고 하겠습니다. 이 중에서 가장 돈을 잘 주는 슬롯머신을 골라야죠. 그러려면 우선 처음에는 탐색으로 모든 슬롯머신을 한 번씩 해봐야 합니다. 만약 했는데 2번 슬롯머신이 가장 확률은 높은 거 같다면 이제부터는 2번에만 집중하는 거죠. 여기서 딜레마에 빠지게 됩니다. 탐색을 여러 번 하면 돈을 못 벌고, 그렇다고 아깝다고 생각하면 제대로 된 탐색이 이뤄지지 않는 거죠.

결국 최소의 탐색으로 최고의 결과를 얻을 필요가 있습니다. 그 방법의 예로 엡실론 그리디(Epsilon-Greedy) 알고리즘을 소개할까 합니다. 방법은 매우 단순합니다. 우선 여러 번의 탐색을 통해 결과를 도출해낸 후에 가장 좋은 결과를 낸 곳(베스트 암)에 남은 전부를 투입하는 방식입니다. 이렇게 엡실론 그리디 알고리즘을 사용한 MAB는 구현하기도 쉽고 단순합니다.

▲ 최소한의 탐색으로 최대한의 결과를 내보자

엡실론이라는 수는 사람이 일일이 정해야 하는 단점이 있지만, 이런 약간의 단점을 제외하면 엡실론 그리디는 상당히 편한 알고리즘입니다. 자,그럼 MAB로 테스트를 하면 어떻게 될까요. 아까처럼 A군과 B군에 숫자를 임의의 나눌 필요는 없습니다.

가상으로 4000명의 유저를 넣고 시뮬레이션을 돌려보도록 하겠습니다. 엡실론을 20%로 설정하고 MAB 테스트를 하니, 그중 984명이 A/B 테스트로 걸러졌고 여기서 Fun Index가 578.12를 기록했습니다. 남은 3016명은 앞서 A/B 테스트로 찾은 결과로 B군만 집중됐고 결국 621.50이라는 Fun Index를 기록한 걸 볼 수 있습니다.

결과치를 보면 베스트 암은 75.4%로 예상한 80%에 미치지는 못했는데요. 이는 초반에 탐색하는 부분에서 정확한 검증이 되지 않았기 때문입니다.

한편, 여기서 MAB 테스트의 장점이 여기서 드러납니다. A군과 B군의 Fun Index 차이를 보면 43.38이 나오는 걸 볼 수 있습니다. 실제 유저로 테스트할 경우 1명당 4338원의 손해가 난다는 거죠. 만약 A/B테스트로만 했다면 약 2.2억 원의 비용이 발생했겠지만, MAB 테스트로 한 번 거른 덕분에 발생한 비용은 약 1.1억 원으로 전과 비교하면 1억 원 정도의 비용이 감소한 걸 볼 수 있습니다.

▲ A/B 테스트보다 더욱 저렴하게 테스트를 할 수 있다

MAB 테스트의 장점은 이뿐만이 아닙니다. A/B 테스트처럼 한번 결과를 내놓으면 끝나는 게 아닌, 새로 유저가 유입될 때마다 수치를 갱신해서 그중에서도 최고의 지표를 산출해 냅니다. 또한, 중간에 가정을 바꿔도 MAB 테스트는 스스로 계속 지표를 뽑아내면서 최고의 결과를 내놓습니다.

예제를 보면 1000명, 2000명, 3000명의 테스트를 할 때마다 가정을 바꿨는데 그에 맞춰서 지표들이 바뀌는 걸 볼 수 있습니다. 그리고 최종적으로는 A군과 C군이 역전되는 걸 볼 수 있죠.

▲ 바뀌는 재미 요소에도 대응해서 Fun Index 역시 실시간으로 변화한다

그때그때 변화하는 세상에 대응할 수 있다는 것 외에도 MAB 테스트의 장점은 얼토당토않은 의견을 넣어도 테스트를 해볼 수 있다는 겁니다.

그럼 단점은 없을까요? 물론 있습니다. 테스트를 하고 그 결과를 얻기까지 시간이 걸린다는 겁니다. 그 사이에도 지표는 바뀌는데 말이죠. 하지만, 시간이 걸림에도 불구하고 MAB 테스트를 한다면 좀 더 의미 있는 결과를 적은 비용으로 낼 수 있다고 생각합니다. 기획자는 테스트에 앞서 시드(Seed) 값을 넣고 나머지는 기계를 통해서 찾아낸 최적화 값을 사용하기만 하면 됩니다.



■ 이걸 게임에도 적용할 수 있을까?


그럼 여기서 현실적인 문제가 머리를 들이밉니다. ‘게임에서도 테스트가 가능할까?’하는 거죠. 어려움은 있지만 가능합니다.

A/B 테스트의 사례처럼 유저군을 2개로 나눈 다음에 크리티컬 확률이 10%, 20% 중 어떤 게 더 재밌는지 구하는 거죠. 물론, 이는 민감한 부분입니다. B군이 20%의 확률이라면 A군은 확률이 낮다는 건데, 유저들은 자신이 불이익받는 콘텐츠에는 민감하기 때문이죠. 그렇기에 완벽하게 시뮬레이터를 돌릴 수 있는 게임이 아니라면 아예 테스트 내용을 유저들에게 최소화시키거나 기획에서부터 차이를 최소화할 필요가 있습니다.

결론적으로 제가 일하는 박스앤위스커에서 사용하는 이런 테스트 엔진을 저는 게임에서는 어떤지 알아보고 싶습니다. 제가 좋아하는 것도 그렇지만 아직은 이를 적극적으로 사용한 사례도 없으니까요. 그러니 관심 있고 도움이 필요한 분들이 계신다면 연락 부탁드립니다.