DEV Community

Cover image for Multi-Armed Bandit vs A/B — 언제 어떤 걸 써야 하나
HyunSeok Jeong
HyunSeok Jeong

Posted on • Originally published at blog.trysitely.com

Multi-Armed Bandit vs A/B — 언제 어떤 걸 써야 하나

Meta 광고 매니저의 "Auto Optimize", Google Ads의 "Optimize", 추천 시스템의 "자동 배분" — 이름은 다르지만 뒤에서 돌아가는 알고리즘은 같은 가족입니다. Multi-Armed Bandit(MAB). 그런데 우리가 "실험"이라고 부르는 A/B 테스트와는 결이 완전히 다릅니다. 어느 쪽을 언제 써야 하는지, 마케터가 운영 의사결정을 내릴 때 헷갈리지 않도록 한 번 정리해 봅니다.

1. 슬롯머신 비유 — MAB의 출발점

카지노에 슬롯머신이 5대 있습니다. 각 머신의 당첨 확률은 다르지만 우리는 모릅니다. 토큰은 1,000개 한정. 어떻게 굴려야 가장 많이 따낼까요?

A/B 테스트와 Multi-Armed Bandit의 차이를 슬롯머신 5대로 비교
A/B는 모든 머신을 똑같이 굴려 어느 게 좋은지 결정한 뒤 한 대만 굴리는 방식. MAB는 굴리면서 학습하고, 좋아 보이는 머신에 점점 더 많이 토큰을 넣는다.

두 가지 전략이 있습니다.

  • A/B 전략: 1,000번을 5대에 200번씩 똑같이 나눠서 굴려 본다. 결과를 본 뒤 가장 잘 나온 머신을 골라 다음번엔 그 머신만 굴린다.
  • Bandit 전략: 굴리는 도중에 결과를 보고, 잘 나오는 머신엔 토큰을 더 넣고, 안 나오는 머신엔 덜 넣는다. 1,000번 안에 학습과 수확을 동시에 한다.

A/B는 "결정을 위한 도구"이고, MAB는 "수익화하면서 학습하는 도구"입니다. 이 한 줄이 두 기법을 가르는 가장 중요한 차이예요.

📌 이 글에서 다룰 것

슬롯머신 비유로 시작해서 ε-greedy → UCB → Thompson sampling 세 가지 알고리즘을 직관 수준에서 풀고, "광고 소재 자동 배분", "랜딩 페이지 카피 테스트", "가격 실험" 세 가지 케이스에서 어떤 도구를 골라야 하는지로 마무리합니다. 코드는 8줄짜리 Thompson sampling 한 개만.

2. Exploration vs Exploitation — 모든 게 이 한 줄

MAB의 핵심 개념은 단 하나입니다.

  • Exploration(탐색): 아직 모르는 옵션을 시도해 정보를 얻는다
  • Exploitation(활용): 지금까지 가장 좋아 보이는 옵션을 골라 수확한다

이 둘은 본질적으로 충돌합니다. 탐색에 너무 많이 쓰면 최적안이 있어도 수확을 못 하고, 활용에 너무 빨리 빠지면 사실 더 좋은 안이 있는데 못 보고 끝나요.

수식으로 쓰면, 시점 tt 에서 옵션 aa 의 평균 보상 추정치를 μ^a\hat{\mu}_a , 시도한 횟수를 NaN_a 라고 할 때 다음과 같은 트레이드오프를 풉니다.

선택=argmaxa(μ^a+exploration bonus(Na,t)) \text{선택} = \arg\max_a \left( \hat{\mu}_a + \text{exploration bonus}(N_a, t) \right)

오른쪽의 "보너스 항"을 어떻게 정의하느냐에 따라 알고리즘이 갈립니다. ε-greedy, UCB, Thompson sampling 모두 이 보너스의 다른 형태일 뿐이에요.

*💡 A/B는 사실 *

A/B 테스트는 정해진 기간 동안 모든 옵션을 동등하게 굴린다는 점에서 탐색만 하는 단계를 따로 떼어낸 것입니다. 끝난 뒤 결과를 보고 한 안만 쓰는 단계가 활용 단계예요. MAB는 이 둘을 시간으로 분리하지 않고 동시에 섞어서 굴립니다.

3. 세 가지 알고리즘 — ε-greedy, UCB, Thompson sampling

3.1 ε-greedy — 가장 단순한 형태

확률 ε\varepsilon 만큼은 무작위 옵션을 고르고(탐색), 1ε1 - \varepsilon 만큼은 지금까지 가장 잘 나온 옵션을 고른다(활용). ε=0.1\varepsilon = 0.1 이면 매 노출의 10%를 탐색에, 90%를 활용에 씁니다.

장점은 코드 두 줄로 끝나는 단순함, 단점은 탐색이 무차별이라는 점이에요. 이미 100번 시도해서 분명히 안 좋은 안에도 똑같이 10% 확률로 토큰이 들어갑니다.

3.2 UCB(Upper Confidence Bound) — 신뢰구간 상한을 보고 결정

각 옵션의 평균 추정치 + "이 추정의 불확실성"을 함께 봅니다. 시도 횟수가 적은 옵션은 불확실성이 크니까 자연스럽게 더 자주 선택돼요.

UCBa(t)=μ^a+clntNa \text{UCB}_a(t) = \hat{\mu}_a + c \sqrt{\frac{\ln t}{N_a}}

여기서 두 번째 항이 시도 횟수 NaN_a 가 작을수록 커집니다. 즉 "아직 잘 모르는 옵션"이 자동으로 더 자주 선택되고, 시도가 쌓이면 그 항은 줄어들어 자연스럽게 활용 단계로 넘어가요.

3.3 Thompson sampling — 베이지안 방식

각 옵션의 보상 분포를 사전 분포(예: Beta(1,1))로 두고, 결과가 나올 때마다 사후 분포를 업데이트합니다. 매 시점마다 각 옵션의 사후 분포에서 샘플을 뽑아 가장 큰 값을 선택해요.

샘플링 자체에 무작위성이 있어 자연스럽게 탐색이 되고, 데이터가 쌓일수록 분포가 좁아지면서 탐색 비중이 줄어듭니다. 직관적으로는 "가능한 진실의 시나리오 중 하나를 무작위로 뽑아 보고, 그게 사실이라면 어떤 선택을 할지"를 매 노출마다 해보는 방식이에요.


python
# Thompson sampling — 클릭률 두 옵션 자동 배분 (8줄)
Enter fullscreen mode Exit fullscreen mode

Top comments (0)