"메인 페이지의 추천 영역, 어떤 상품을 보여줄까? 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 실전 활용하기
- 베이지안 접근법의 이해
- 실제 구현 방법
- 실전 적용 시 고려사항
- 성능 모니터링
- 세그먼트별 적용
먼저 이런 상황을 가정해 보겠습니다.
여러분이 커머스 서비스의 담당자라고 해봅시다. 메인 페이지 최상단에 있는 첫 번째 추천 영역의 성과를 개선해야 하는 미션이 주어졌습니다. 이 영역은 하루 트래픽의 대부분을 차지하는 중요한 공간이에요.
"오늘의 특가 상품을 보여줄까, 아니면 개인화 추천 상품을 보여줄까?"
"제목은 '오늘의 발견'으로 할까, '당신을 위한 추천'으로 할까?"
이런 의사결정을 위해 데이터 기반의 실험이 필요합니다. 널리 사용되는 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
- Multi-Arm Bandits for recommendations and A/B testing on Amazon ratings data set
'🏭 Data' 카테고리의 다른 글
MAB 알고리즘 [2/2] - MAB와 Thompson Sampling의 아키텍처 및 실전 구현 (w. Kotlin) (2) | 2024.10.28 |
---|
댓글