본문 바로가기
🏭 Data

MAB 알고리즘 [1/2] - A/B 테스트의 한계, MAB 알고리즘과 Thompson Sampling 이해하기

by kukim 2024. 10. 26.

"메인 페이지의 추천 영역, 어떤 상품을 보여줄까? A/B 테스트만으로는 부족하다?"

 

A/B 테스트는 디지털 서비스에서 가장 널리 사용되는 실험 방법입니다. 하지만 테스트 기간이 길고, 기회비용이 발생하며, 실시간 최적화가 어렵다는 한계가 있죠. 이런 문제를 해결하기 위해 MAB(Multi-Armed Bandit) 알고리즘이 등장했습니다. 이 글에서는 A/B 테스트의 한계점부터 MAB 알고리즘, 특히 Thompson Sampling의 동작 원리까지 상세히 알아보겠습니다.


 

목차

1. A/B 테스트의 이해

   - A/B 테스트란 무엇인가

   - 구현 방식

   - 실제 적용 시 마주치는 어려움들

 

2. MAB(Multi-Armed Bandit)의 이해

   - MAB의 개념과 배경

   - 핵심 개념: 탐색과 활용

   - A/B 테스트와의 비교

 

3. MAB 알고리즘의 종류와 특징

   - ε-Greedy: 가장 단순한 방법

   - UCB: 불확실성을 고려한 방법

   - Thompson Sampling: 확률적인 접근

 

4. Thompson Sampling 실전 활용하기

   - 베이지안 접근법의 이해

   - 실제 구현 방법

   - 실전 적용 시 고려사항

   - 성능 모니터링

   - 세그먼트별 적용


먼저 이런 상황을 가정해 보겠습니다.

여러분이 커머스 서비스의 담당자라고 해봅시다. 메인 페이지 최상단에 있는 첫 번째 추천 영역의 성과를 개선해야 하는 미션이 주어졌습니다. 이 영역은 하루 트래픽의 대부분을 차지하는 중요한 공간이에요.

 

"오늘의 특가 상품을 보여줄까, 아니면 개인화 추천 상품을 보여줄까?"

"제목은 '오늘의 발견'으로 할까, '당신을 위한 추천'으로 할까?"

무신사 / 마켓컬리 / 네이버쇼핑 메인 페이지 최상단 추천 영역 - 2024/10/26

 

이런 의사결정을 위해 데이터 기반의 실험이 필요합니다. 널리 사용되는 A/B 테스트부터 MAB 알고리즘까지, 각각의 특징과 활용법에 대해 자세히 알아보도록 하겠습니다.

 

1. A/B 테스트의 이해

1.1. A/B 테스트란 무엇인가

A/B 테스트는 두 가지 이상의 버전을 사용자들에게 노출하여 어떤 버전이 더 나은 성과를 보이는지 비교하는 실험 방법입니다. 앞서 예시로 든 메인 페이지 첫 번째 추천 영역에 적용해 본다면, 전체 트래픽(100 % a.k.a. 버킷)을 다음과 같이 나눌 수 있습니다

 

- A안: "오늘의 특가" 제목과 함께 특가 상품 노출

- B안: "당신을 위한 00 추천" 제목과 함께 개인화 추천 상품 노출

- C안: "비슷한 연령대의 00" 제목과 함께 나와 비슷한 연령이 좋아하는 추천 상품 노출 

 

이렇게 세 가지 버전을 준비한 후, 사용자들에게 노출하여 클릭률(CTR)이나 구매 전환율 같은 지표를 측정하게 됩니다.

실험과 버킷들

1.2. 구현 방식

그렇다면 세 가지 방안을 테스트한다고 했을 때 어떻게 사용자들에게 나누어 보여줄까요? 

1.2.1. 고정된 사용자 그룹 방식

- 사용자 ID나 특정 속성을 기준으로 그룹을 나눕니다

- 예: 사용자 ID를 해싱 처리하여 각 버킷에 할당

- 장점: 

  - 동일한 사용자가 항상 같은 버전을 보게 되어 일관된 경험 제공

  - 사용자 단위의 전환율, 구매액 등 사용자 기반 지표 측정 용이

- 단점: 특정 사용자 그룹의 특성이 결과에 영향을 미칠 수 있음

1.2.2. 트래픽 기반 랜덤 분배 방식

- 접속할 때마다 무작위로 버전을 노출합니다

- 로드밸런서의 가중치 기반 라우팅과 유사한 방식으로 구현합니다

- 전체 트래픽(100)을 실험 별로 다르게 나눌 수 있습니다

  - 예: A안 30, B안 30, C안 40으로 설정

  - 새로운 기능 테스트 시 초기에는 적은 버킷(10~20)만 할당하여 리스크 관리 가능

- 장점: 더 무작위적인 실험이 가능하며 편향을 줄일 수 있음

- 단점: 한 사용자가 다른 버전을 보게 될 수 있어 경험이 일관적이지 않을 수 있음

1.2.3. 실험 결과 측정을 위한 로깅

각 유저에게 어떤 것을 보여주어야 할지 정했다면, 실험의 성과를 정확히 측정하기 위해 사용자 로그를 잘 저장해야 합니다.

 

행동 로그 예시

{
    "timestamp": "2024-01-01 10:00:00",
    "userId": "user123",
    "sessionId": "session456",
    "experimentId": "main_recommendation_test",
    "bucket": "A",
    "event": "impression",
    "position": "main_top",
    "itemId": "item789",
    "metadata": {
        "deviceType": "mobile",
        "userAgent": "...",
        "recommendationType": "특가상품",
        "amount": 15000  
    }
}

 

이러한 로그 데이터는 실시간으로 수집되어 분석 가능한 형태로 저장되어야 합니다. 자체 로그 수집기를 구축하거나 솔루션(GA, Amplitude, ...)을 사용할 수 있습니다.

1.3. 실제 적용 시 마주치는 어려움들

실제로 A/B 테스트를 진행하다 보면 여러 가지 어려움에 부딪히게 됩니다. 

1.3.1. 적절한 테스트 기간 설정의 어려움

"테스트 기간은 이 정도면 충분할까요?"라는 고민이 항상 따라다닙니다. 테스트 기간이 너무 짧으면 통계적 신뢰성이 떨어지고, 너무 길면 리소스가 낭비됩니다.

 

- 주간/계절성 고려 필요: 월요일과 금요일의 구매 패턴이 다르고, 급여일 전후의 행동 패턴도 다릅니다

- 충분한 표본 확보 필요: 클릭률 0.1%p 차이를 검증하려면 수만 건의 노출이 필요할 수 있습니다

- 외부 요인 통제: 대규모 프로모션, 연휴 등 특별한 이벤트 기간을 통제 못할 수 있습니다.

1.3.2. 기회비용 발생

테스트 기간 동안 성과가 좋지 않은 버전에 노출되는 사용자들이 발생합니다.

 

예를 들어 C안(연령대 기반)이 A안(특가) 보다 클릭률이 30% 높다는 것을 알게 되었다면, A안에 노출된 사용자들에게서 발생한 기회손실이 있었다는 의미입니다. 특히 메인 페이지처럼 트래픽이 많은 영역에서는 이 기회비용이 상당할 수 있습니다.

1.3.3. 다중 테스트의 한계

A/B 테스트를 하다 보면 한 번에 여러 가지를 테스트하고 싶은 경우가 많습니다. (정말로요...)

 

- 제목 문구 (3개) x 상품 구성 방식 (3개) x 디자인 레이아웃 (2개) = 18개 조합

- 각 조합별로 충분한 표본을 확보하려면 매우 긴 시간이 필요합니다.

- 여러 실험의 상호작용 효과를 분석하기도 어렵습니다.

1.3.4. 실험 설계와 운영의 복잡성

A/B 테스트는 지속적인 모니터링과 관리가 필요합니다. 리소스가 필요하죠.

 

- 사람의 직접 개입 필요

올바른 실험을 위해서는 설계 단계에서 전문가의 판단이 필요합니다. 하지만 업무가 바쁘거나 빠르게 작동해야 한다면(?) 트레이드오프를 고려해야 합니다. 또한 모니터링 및 이상 징후 발생 시 대응해야 하고결과 분석 및 의사결정을 내려야 합니다.

 

- 실험 그룹 설정의 어려움

적절한 버킷 비율 설정, 실험 대상 세그먼트 선정, 통제 집단(Control Group) 설정 등이 필요합니다.

 

- 통계적 유의성 확보를 위한 노력

충분한 표본 크기 확보, 외부 요인 통제, 실험 결과의 신뢰성 검증이 필요합니다.

 

이러한 어려움들로 인해, 빠른 의사결정이 필요한 상황에서는 A/B 테스트가 답답하게 느껴질 수 있습니다.

그렇다면 이런 생각을 해볼 수 있습니다.

"사람의 개입을 최소화하면서, 자동으로 더 나은 선택지를 찾아갈 수는 없을까?"

"실험을 진행하면서 동시에 최적의 답을 찾아갈 수는 없을까?"

 

이러한 고민에 도움을 줄 수 있는 것이 MAB(Multi-Armed Bandit) 알고리즘입니다.


2. MAB(Multi-Armed Bandit)의 이해

MAB(Multi-Armed Bandit)는 재미있게도 카지노의 슬롯머신에서 유래한 이름입니다. 'Bandit'은 슬롯머신의 별명이고, 'Multi-Armed'는 여러 개의 레버(팔)를 의미합니다.

 

카지노에 들어간 도박꾼을 상상해 봅시다. 앞에 세 대의 슬롯머신이 있고, 각각의 승률이 다르다고 해요. 하지만 어떤 기계의 승률이 가장 높은지는 모릅니다. 도박꾼은 제한된 시간과 돈으로 최대한의 수익을 내고 싶습니다.

 

이는 위에서 살펴본 상황과 매우 비슷합니다

- 슬롯머신 → 추천 영역의 각 버전들 (특가, 개인화, 연령대 기반)

- 승률 → 각 버전의 클릭률이나 전환율

- 제한된 시간과 돈 → 한정된 트래픽과 기회

2.1. 핵심 개념: 탐색(Exploration)과 활용(Exploitation)

쉽게 설명해서 MAB 알고리즘의 핵심은 '탐색'과 '활용' 사이의 균형을 찾는 것입니다.

 

탐색(Exploration)

- 각 버전의 실제 성과를 알아보기 위해 충분히 시도해 보는 것

- 예: 연령대 기반 추천이 생각보다 좋은 성과를 낼 수도 있으니 일정 수준 노출해봐야 함

 

활용(Exploitation)

- 지금까지 가장 좋은 성과를 보인 버전을 더 많이 사용하는 것

- 예: 특가 상품 노출이 현재까지 가장 클릭률이 높다면 이를 더 많이 보여주기

2.2. A/B 테스트와의 비교

A/B 테스트와 MAB의 가장 큰 차이점은 '실시간 학습과 자동 최적화' 능력입니다.

 

A/B 테스트

- 미리 정한 기간 동안 정해진 비율대로 노출

- 모든 테스트가 끝난 후에야 의사결정

- 테스트 기간 내내 성과가 낮은 버전도 계속 같은 비율로 노출

 

예시로 A/B 테스트는 새로운 메뉴를 테스트하는 식당 같아요.

- 처음 정한 계획대로 2주 동안 A안 30%, B안 30%, C안 40% 비율로 진행

- 2주가 모두 지난 후에야 "아, C안이 제일 좋았네!" 하고 확인

- 그동안 성과가 좋지 않았던 A안, B안도 계속 같은 비율로 보여줄 수밖에 없었음

 

MAB

- 실시간으로 성과를 학습하며 노출 비율을 조정

- 좋은 성과를 보이는 버전에 더 많은 트래픽을 자동으로 할당

- 테스트하면서 동시에 최적화가 이루어짐

 

반면 MAB는 손님들의 반응을 보고 실시간으로 대응하는 똑똑한 식당처럼 작동합니다.

- 처음에는 세 메뉴를 골고루 제공해 보다가

- "오, 메뉴 C의 반응이 좋네?" 싶으면 메뉴 C를 더 많은 손님에게 추천

- "메뉴 A 재주문율이 낮네..?" 메뉴 A를 더 적은 손님에게 추천

- 하지만 나머지 메뉴들도 소수의 손님에게 계속 제공하면서 반응 체크

- 이 모든 과정이 자동으로 이루어짐

 

즉, MAB는 "이 메뉴가 인기가 있네? 그럼 이걸 더 많이 추천해 볼까?"라는 과정을 자동화한 것이라고 볼 수 있습니다. 

이것이 바로 앞서 이야기했던 "사람의 개입을 최소화하면서, 자동으로 더 나은 선택지를 찾아갈 수 없을까?"라는 AB Test의 단점을 보완할 수 있죠. 그렇다면 MAB는 어떻게 구현할까요?


3. MAB 알고리즘의 종류와 특징

MAB를 구현하는 방법은 여러 가지가 있습니다. 각각의 알고리즘은 '탐색'과 '활용'의 균형을 맞추는 서로 다른 전략을 가지고 있습니다. 대표적인 세 가지 알고리즘을 살펴보겠습니다.

 

(각 알고리즘의 디테일한 수식은 wiki를 참고해 주세요!)

3.1. ε-Greedy: 가장 단순한 방법

ε(입실론)-Greedy는 MAB 알고리즘 중 가장 이해하기 쉬운 방법입니다.

 

작동 방식

- ε(예: 10%) 확률로 무작위 선택 (탐색)

- (1-ε)(예: 90%) 확률로 현재까지 가장 좋은 성과를 보인 것을 선택 (활용)

 

메인 페이지 추천 영역에 적용한다면

- 10%의 트래픽에는 세 가지 버전(특가/개인화/연령대) 중 무작위로 노출

- 90%의 트래픽에는 현재까지 클릭률이 가장 높은 버전을 노출

- 매우 단순하지만 실제로도 꽤 효과적으로 작동하기도 합니다.

3.2. UCB: 불확실성을 고려한 방법

UCB(Upper Confidence Bound)는 "잘 모르는 것에 대해 낙관적으로 평가하자"는 전략입니다.

 

작동 방식

- 각 버전의 평균 성과에 '불확실성 보너스'를 더함

- 노출 횟수가 적을수록 더 큰 보너스 점수를 줌

- 가장 높은 점수를 받은 버전을 선택

 

실제 적용 예시

- 특가 상품: 1000번 노출, 클릭률 3% -> 3% + 작은 보너스 (많이 시도해 봄)

- 개인화 추천: 100번 노출, 클릭률 2.8% -> 2.8% + 중간 보너스

- 연령대 기반: 50번 노출, 클릭률 2.5% -> 큰 보너스 (적게 시도해 봄)

 

추천 영역에 적용하면

- 많이 노출해 본 특가 상품은 실제 클릭률에 가까운 점수

- 덜 노출된 연령대 기반 추천은 "혹시 더 좋을 수도 있어!" 하고 보너스 점수를 줌

- 시간이 지나면서 보너스 점수는 자연스럽게 감소

3.3. Thompson Sampling: 확률적인 접근

Thompson Sampling은 확률 분포를 활용한 방법으로, Netflix, Microsoft 등 여러 기업의 실험에서 좋은 성과를 보여준 알고리즘입니다. 추천 시스템과 A/B 테스트 영역에서 널리 사용되고 있습니다. (ref. Multi-Arm Bandits for recommendations and A/B testing on Amazon ratings data set)

 

작동 방식

- 각 버전의 성과를 확률 분포(e.g. 베타 분포)로 추정

- 이 확률 분포에서 무작위로 샘플링하여 가장 높은 값을 가진 버전을 선택

- 실제 결과를 보고 확률 분포를 계속 업데이트

 

실제 적용 예시

- 특가 상품: 1000번 노출, 30번 클릭 -> "클릭률이 2.8~3.2% 사이일 것 같아"

- 개인화 추천: 100번 노출, 2번 클릭 -> "클릭률이 1.5~3.5% 사이일 것 같아"

- 연령대 기반: 10번 노출, 1번 클릭 -> "클릭률이 1~9% 사이일 것 같아"

 

추천 영역에 적용하면

- 노출과 클릭 데이터가 쌓일수록 확률 분포가 더 정확해짐

- 특가 상품처럼 많이 노출된 버전은 좁은 범위의 확률 분포

- 연령대 기반처럼 적게 노출된 버전은 넓은 범위의 확률 분포

- 각 버전의 확률 분포에서 샘플링한 값 중 가장 높은 것을 선택

 

이러한 방식으로 Thompson Sampling은 데이터가 쌓일수록 더 정확한 선택을 하면서도, 새로운 가능성을 적절히 탐색할 수 있습니다. 실제 현업에서 가장 많이 사용되는 이유이기도 하죠.

 

세 가지 사례 중 Thompson Sampling을 조금 더 설명드리겠습니다.


4. Thompson Sampling 실전 활용하기

Thompson Sampling은 각 버전의 성과를 확률적으로 추정하고 학습하는 방식입니다. 어떻게 이게 가능한 걸까요?

4.1. 베이지안 접근법의 이해

Thompson Sampling의 핵심은 "불확실성을 확률로 표현하자"는 베이지안 접근법에 있습니다.

 

예를 들어, 메인 페이지의 특가 상품 영역이

- 처음에는 "클릭률이 1~5% 사이 어딘가에 있을 거야" 정도로 막연히 추정

- 100번의 노출 중 3번 클릭 → "클릭률이 2~4% 사이일 확률이 높아"

- 1000번의 노출 중 30번 클릭 → "클릭률이 2.8~3.2% 사이일 가능성이 매우 높아"

 

이렇게 데이터가 쌓일수록 점점 더 정확한 추정이 가능해집니다.

4.2. 실제 구현 방법

Thompson Sampling은 베타 분포(Beta Distribution)를 사용해 구현하는 것이 일반적입니다.

 

각 버전별로

- 성공(클릭)의 수 = α

- 실패(미클릭)의 수 = β

- 베타 분포 Beta(α, β)에서 무작위로 샘플링

- 가장 높은 값을 가진 버전을 선택

 

예시

- 특가 상품: 1000번 노출, 30번 클릭 → Beta(30, 970)

- 개인화 추천: 100번 노출, 2번 클릭 → Beta(2, 98)

- 연령대 기반: 10번 노출, 1번 클릭 → Beta(1, 9)

각 추천 결과의 베타 분포

위 그래프에서 볼 수 있듯이, 데이터가 많이 쌓일수록 베타 분포의 모양이 달라집니다

 

- 특가 상품(왼쪽): 1000번이라는 많은 노출 데이터로 인해 분포가 매우 뾰족한 형태를 보입니다. 이는 클릭률에 대한 추정이 매우 정확해졌다는 의미입니다.

- 개인화 추천(중간): 100번의 노출로 어느 정도 분포가 좁혀졌지만, 아직 불확실성이 있습니다.

- 연령대 기반(오른쪽): 10번이라는 적은 노출로 인해 분포가 매우 넓게 퍼져있습니다. 이는 아직 실제 클릭률에 대한 불확실성이 크다는 것을 의미합니다.

4.3. 실전 적용 시 고려사항

초기값 설정

- 처음에는 모든 버전에 동등한 기회를 주기 위해 α=1, β=1로 시작

  - α=1, β=1은 균등 분포(Uniform Distribution)와 같아서, 0~1 사이의 모든 값이 나올 확률이 동일합니다

  - 즉, 어떤 버전이든 공평한 기회를 가질 수 있죠

- 이전 데이터가 있다면 이를 활용해 초기값 설정 가능

예외 처리의 중요성

- α와 β는 0이 될 수 없습니다 (베타 분포의 제약사항)

- 실제 구현 시 반드시 처리해야 할 예외 상황들

  - 노출이 0인 경우 → α=1, β=1로 초기화

  - 클릭이 0인 경우 → 최솟값(예: 0.5 또는 1)으로 보정

  - 클릭이 노출수보다 많은 경우 → 데이터 오류 체크 필요

 

콜드 스타트 문제 해결

- 초기에 운이 없어 클릭이 전혀 없는 경우 문제가 발생할 수 있습니다

  - 예: 100번 노출되었는데 클릭이 0번 → Beta(1, 100)이 되어 거의 선택될 기회가 없음

- 이를 방지하기 위한 전략들:

  - 최소 노출 보장: 초기 1000번은 균등하게 노출

  - 임계값 설정: 노출 100번 미만인 경우 α=1, β=1로 리셋

  - 가상의 클릭 추가: 매우 낮은 클릭률이라도 기회를 주기 위해 보정값 적용

 

데이터 관리

- 최근 데이터에 더 가중치를 두고 싶다면 일정 기간의 데이터만 사용

- 예: 최근 24시간 또는 7일간의 데이터만 활용

4.4. 성능 모니터링

Thompson Sampling이 잘 작동하는지 확인하기 위해 다음 지표들을 모니터링할 수 있습니다.

 

트래픽 분배 현황

- 각 버전별 실제 노출 비율

- 시간대별 노출 패턴

 

성과 지표

- 버전별 클릭률 추이

- 전체 평균 클릭률의 변화

 

이상 징후 감지

- 특정 버전에 트래픽이 쏠리는 현상 (예: 한 버전이 90% 이상의 트래픽을 받는 경우)

- 갑작스러운 성과 변화 (예: 클릭률이 50% 이상 급락하는 경우)

 

이러한 모니터링을 통해 필요한 경우 파라미터를 조정하거나 새로운 버전을 추가하는 등의 조치를 취할 수 있습니다.

4.5. Thompson Sampling의 세그먼트별 적용

앞서 살펴본 Thompson Sampling에는 한 가지 아쉬운 점이 있습니다. 바로 "모든 사용자에게 같은 기준을 적용하고 있다"는 점입니다.

 

예를 들어:

- 20대 여성과 40대 남성이 선호하는 상품이 다를 텐데 같은 기준으로 판단

- 신규 고객과 VIP 고객이 선호하는 상품이 다를 텐데 동일한 기준 적용

- 패션에 관심이 많은 고객과 그렇지 않은 고객을 구분하지 않음

 

이러한 한계를 극복하기 위해 세그먼트별로 Thompson Sampling을 적용할 수 있습니다.

 

세그먼트별 적용 방법

- 성별로 구분: 남성/여성 각각의 Thompson Sampling 운영

- 연령대별 구분: 20대, 30대, 40대 별로 각각 다른 MAB 운영

- 예시: 

  - 20대 여성: 특가 상품 선호 (클릭률 4%)

  - 30대 남성: 개인화 추천 선호 (클릭률 3.5%)

  - 40대 여성: 연령대 기반 추천 선호 (클릭률 5%)

 

하지만 이런 방식에도 한계가 있습니다.

- 세그먼트가 늘어날수록 각각의 데이터가 희소해짐

- 새로운 세그먼트 추가 시 코드 수정 필요 (로그 데이터 aggregation 이 변경되어야 함)

- 시간대, 요일 등 다양한 컨텍스트를 동시에 고려하기 어려움


마치며.

지금까지 A/B 테스트의 한계를 극복하기 위한 MAB 알고리즘과 Thompson Sampling의 개념에 대해 알아보았습니다.

다음 글(MAB 알고리즘 [2/2] - MAB 아키텍처와 Thompson Sampling 실전 구현)에서는 실제 서비스 적용을 위한 시스템 아키텍처부터, Thompson Sampling의 구현과 운영 방법까지 자세히 알아보도록 하겠습니다.

 

감사합니다. 😃


Reference

- Wiki - Multi-armed bandit

- Multi-Arm Bandits for recommendations and A/B testing on Amazon ratings data set

- Beta Distribution 그래프 시각화 

- The Beta Distribution 설명

 

 
 
 
 
 
 
 
 
 

댓글