어쩌다데싸

탐색과 활용 그 사이 - 탐슨 샘플링(Thompson Sampling) 본문

Recommedation System

탐색과 활용 그 사이 - 탐슨 샘플링(Thompson Sampling)

엔팁 2026. 7. 22. 17:28

 

탐색 vs. 활용 (Exploration vs. Exploitation)

 

추천 시스템에서는 탐색과 활용에 대한 딜레마가 종종 발생합니다. '사용자가 이미 좋아하는 아이템을 계속 추천할 것인가, 아니면 아직 잘 모르지만 좋아할 수도 있는 새로운 아이템을 보여줄 것인가?'에 대한 고민이죠.

 

사용자가 이미 좋아하는 아이템을 계속 추천하면 당장의 성과(CTR, 전환율 등)는 잘 나오지만 장기적으로는 질려서 이탈할 가능성이 높습니다. 반대로 새로운 것을 추천했을 때 사용자의 취향에 부합하지 않았을 경우 주요 성과지표는 떨어질 가능성이 높아요. 

이 둘 사이의 균형을 'Exploration–Exploitation Trade-off'라고 합니다.

- 탐색(Exploration): 아직 충분히 검증되지 않은 아이템을 일부러 노출시켜서 정보를 얻는 것
- 활용(Exploitation): 지금까지 수집된 데이터를 바탕으로 가장 좋은 성과를 낼 것으로 이미 알려진 아이템/전략을 추천하는 것

 

 

추천은 단순히 사용자의 선호를 예측하는 시스템이 아닌, 추천의 결과를 활용해서 다음 추천을 하게 되는 순환형태를 띄고 있습니다. 따라서 눈 앞의 성과에만 집중해 '활용'을 강조한 구조를 만들었을 경우에는 다음과 같은 문제가 발생할 수 있습니다. 

  • 피드백 루프 편향(Feedback Loop Bias): CTR 등 단기 성과 기반으로 계속 학습하면, 초기에 우연히 노출이 많았던 아이템에 대한 반응이 쌓이고 그게 다시 더 많은 노출로 이어지는 악순환이 생김. 실제로 더 좋은 아이템이 있어도 노출 기회를 얻지 못해 검증되지 못하는 문제 발생
  • 콜드 스타트(Cold-Start): 신규 아이템이나 신규 사용자는 기반 데이터가 없으니 '활용' 중심 추천에서는 불리할 수밖에 없음. 특히 신규 아이템의 경우 노출 기회를 얻지 못해 추천이 되지 않는 문제 발생
  • Position Bias와 유사한 문제 발생: CTR 기준 최상위 고정 노출된 아이템이 실제 품질에 기반한 것이 아닌 '이미 노출되었던 것'에 대한 증거뿐일 수 있음

 

OTT를 예로 들어봅시다. 전세계적으로 히트를 쳤던 '오징어게임'을 모든 사람에게 추천해준다고 하면 다른 마이너한 콘텐츠들에 비해 전체적인 클릭률은 높게 나올 겁니다. 이렇듯 인기있는 아이템 위주로 추천하는 것도 '활용'에 속하죠.

 

하지만 그 중에서는 정말 오징어게임 외 다른 장르도 좋아하는 사람들도 있을 겁니다. 그런 사람에게 마이너한 콘텐츠를 보여줬을 때 사용자가 선호하면 추천 시스템에서 보다 다양한 추천으로 사용자의 취향을 저격할 수 있습니다. 이것이 '탐색'입니다. 

 

탐색 위주의 추천 리스트를 만들었을 때는 그만큼 리스크도 큽니다. 사용자가 원하는 것을 찾기 전까지는 인기 아이템에 비해 CTR 등의 주요 지표가 떨어질 수밖에 없는 것이죠. 

 

결국 추천시스템은 이미 알고 있는 최선의 선택을 '활용'하면서도, 더 나은 선택을 발견하기 위해 새로운 가능성을 '탐색'해야 합니다. 이 둘 사이의 균형을 어떻게 맞출 것인가는 추천시스템의 중요한 문제 중 하나입니다.

 

이번 글에서는 탐색과 활용 사이 균형을 맞추는 방법 중 하나인 탐슨 샘플링(Thompson Sampling)에 대해 정리해보려 합니다.

 

 

Thompson Sampling 이해를 위한 사전 지식

Thompson Sampling에 대해 알기 전에 이 이론의 근간이 되는 베이지안 확률분포에 대해 알아야 합니다.

 

베이지안 확률분포

일반적으로 '확률'하면 '무한히 반복했을 때의 상대적 빈도'와 같이 빈도주의적 관점에서의 확률을 떠올립니다. 베이지안에서는 '확률이 무엇인가'부터 다시 시작해야 합니다.

✍️ 확률을 보는 관점: 빈도주의 vs. 베이지안
- 빈도주의 관점
: 확률 = 무한히 반복했을 때의 상대적 빈도. 동전을 던졌을 때 앞면이 나올 확률이 50%라는 건, 동전을 "무한히 던지면 앞면 비율이 50% 수렴한다"는 뜻
- 베이지안 관점
: θ(동전이 앞면 나올 진짜 확률)는 이미 고정된 값이지만, 나는 그 값을 정확히 모른다. 대신 내가 가진 정보를 바탕으로 θ가 어떤 값일지에 대한 확신의 정도를 확률분포로 표현. "앞면 확률이 50%다"라는 말은, θ가 실제로 0.5라는 뜻이 아니라 θ가 0.5 근처일 것이라는 내 확신이 가장 크다(그리고 그 확신이 앞뒤 어느 쪽으로도 치우치지 않았다)는 뜻

 

 

동전의 앞면이 나올 확률은 50%라고 하지만, 사실 이미 던져진 동전의 결과는 이미 100%로 확정된 상태입니다. 하지만 손으로 가렸기 때문에 알지 못할 뿐이죠. 빈도주의 관점에서는 "지금 이게 앞면일 확률은?"이라고 물었을 때 대답하기 어렵습니다. 이미 벌어진 이 상황을 무한히 반복할 수 없기 때문이죠.

 

하지만 베이지안에서는 "50%"라고 답할 수 있습니다. 이것은 동전의 상황에 대한 사실을 말한 것이 아니라, "내가 가진 정보로는 앞면인지 뒷면인지 구분할 정보가 없다"라고 나의 정보에 대한 상태를 숫자로 표현한 것입니다.

 

즉, 확률(θ)은 이미 정해져 있는 고정된 값이지만 나는 그 값을 모른다는 것이 베이지안의 기본 가정입니다. 베이지안 확률은 이 고정된 θ가 무엇인지에 대한 내 확신의 정도를 숫자(혹은 분포)로 표현한 것이에요. 

이 관점의 장점은 확신의 정도가 데이터를 볼 때마다 업데이트된다는 것에 있습니다. 동전을 10번 던져서 8번 앞면이 나왔다고 했을 때, 처음에 50% 근처일 것이다는 믿음을 점차 70~80%일 것이다는 믿음으로 바뀌게 되죠. 

 

이 업데이트 과정을 수식으로 표현하면 다음과 같은 식이 됩니다. 

 

사후분포(Posterior) ∝ 우도(Likelihood) × 사전분포(Prior)

 

  • 사전분포: 데이터를 보기 전, 원래 가지고 있던 믿음
  • 우도: 관찰한 데이터가 각 θ 값 하에서 얼마나 그럴듯한지
  • 사후분포: 데이터를 반영해 업데이트된 믿음

 

 

사전분포는 원래 가지고 있던 '믿음'이기 때문에 주관적입니다. 이 점에서 베이지안 관점은 주관적이다는 비판이 있기는 하지만 데이터가 충분히 쌓이면 사전분포가 어떻게 되든 사후분포는 결국 데이터가 가리키는 방향으로 수렴하게 됩니다. 

 

이 중 가장 낯선 개념은 우도(Likelihood)인데요, 우도는 "θ가 특정값이라고 가정했을 때, 지금 관찰한 값이 나올 가능성"입니다. 표기는 P(데이터|θ)로 습니다. 주의해야 할 점은, "θ가 일어날 확률"이 아니라 "θ를 고정했을 때 현재 데이터가 나올 확률"입니다. 

 

동전 던지기로 다시 예를 들어보면 10번 던져서 앞면이 8번 나타났을 때,

  • θ=0.5(공정한 동전)라고 가정하면 → 8/10(관측한 데이터)이 나올 가능성은 그렇게 높지 않다
  • θ=0.8이라고 가정하면 → 8/10이 나올 가능성이 꽤 높다
  • θ=0.2라고 가정하면 → 8/10이 나올 가능성은 매우 낮다

즉 우도는 "여러 θ 후보들을 쭉 세워놓고, 각 후보가 지금 데이터를 얼마나 잘 설명하는지 채점하는 함수"라고 보면 됩니다. θ를 바꿔가며 데이터가 나올 확률을 계산해서 나열한 것이 우도 함수입니다. 0부터 1 사이의 모든 가능한 θ 값 각각에 대해 따로따로 계산합니다.

 

마지막으로 사후분포는 사전분포와 우도를 곱해서 θ에 대한 새로운 믿음을 만든 것입니다. "곱한다"는 연산이 핵심인데, 이를 통해 사전분포가 낮게 보던 θ라도 데이터가 강하게 지지하면 사후분포에서 끌어올려지고, 반대로 사전분포가 높게 보던 θ라도 데이터가 지지하지 않으면 눌리게 됩니다. 

 

  • P(θ|데이터) ∝ P(데이터|θ) × P(θ)

여기서 흥미로운 점은, 우도 P(데이터|θ)와 사후분포 P(θ|데이터)는 조건부 확률의 방향이 정반대라는 것입니다. 우도는 "θ를 조건으로 줬을 때 데이터가 나올 확률"이고, 사후분포는 "데이터를 조건으로 줬을 때 θ가 그 값일 확률"입니다. 베이즈 정리는 바로 이 방향을 뒤집어주는 역할을 합니다. θ가 데이터를 얼마나 잘 설명하는지(우도)를, 데이터가 θ를 얼마나 지지하는지(사후분포)로 바꿔주는 것이죠.

 

우리가 결국 구하고 싶은 건 데이터를 관찰한 뒤 θ가 어떤 값일지에 대한 확률(사후분포)이고, 이를 직접 구하기 어려우니 상대적으로 계산하기 쉬운 사전분포와 우도를 곱해서 구하는 것이 바로 베이즈 정리입니다. 

 

베타분포(Beta distribution)

지금까지는 θ에 대한 확신을 '분포'라는 말로 추상적으로 표현해왔습니다. 실제로 이 분포를 계산하고 그래프로 그리기 위해서는 구체적인 수식 형태가 필요한데, 클릭률(CTR)처럼 0~1 사이의 값을 추정할 때 가장 널리 쓰이는 형태가 바로 베타 분포입니다. 

 

베타분포는 정의 자체가 0과 1 사이의 값만 가지는 분포입니다. 확률(θ)이라는 것 자체가 0~1 사이의 값이니, "확률에 대한 확률분포"를 표현하기에 형태가 정확히 들어맞습니다. 정규분포처럼 -∞부터 +∞까지 뻗어나가는 분포로 θ를 표현하면 "확률이 1.3이다"처럼 말이 안 되는 영역까지 포함하게 되는데, 베타분포는 이런 문제가 없기 때문에, θ를 표현하는 사전분포로 자주 선택됩니다.

 

베타분포는 두 개의 파라미터 α(알파), β(베타)로 모양이 결정됩니다.

 

Beta(α, β)

  • α: "성공(클릭) 횟수 + 1"에 가까운 역할
  • β: "실패(무클릭) 횟수 + 1"에 가까운 역할

왼쪽: α > β 오른쪽 α < β

α가 클수록 분포가 오른쪽(1 방향)으로, β가 클수록 왼쪽(0 방향)으로 쏠립니다.

 

그리고 α와 β가 둘 다 커질수록(=데이터가 많이 쌓일수록) 분포는 점점 뾰족해집니다.

 

 

아무런 정보가 없을 때는 Beta(1,1)로 표현하고 베타분포는 0부터 1까지 완전히 평평한 균등분포가 됩니다. "θ가 0.01일 가능성과 0.99일 가능성이 똑같다"는, 아무 정보도 없는 상태를 표현하는 것입니다. 이걸 무정보 사전분포(uninformative prior)라고 부르는데, 새로 추천 시스템에 등록된 아이템처럼 아직 아무런 노출 데이터가 없는 경우의 출발점으로 자연스럽습니다. 

 

여기서 베타분포가 실무적으로 특히 편리한 이유가 나옵니다. 사전분포를 Beta(α, β)로 두고, 이후 s번 성공·f번 실패라는 데이터를 관찰하면, 사후분포는 복잡한 계산 없이 Beta(α + s, β + f)로 계산할 수 있습니다.

 

성공 횟수를 α에, 실패 횟수를 β에 그냥 더해주기만 하면 끝입니다. 원래 베이즈 정리는 사전분포와 우도를 곱한 뒤 정규화하는 적분 계산이 필요한데, 베타분포는 이 과정이 파라미터 덧셈 하나로 축약됩니다. 이런 성질을 '켤레사전분포(conjugate prior)'라고 부르는데, 사전분포와 사후분포가 같은 종류(여기서는 둘 다 베타분포)로 남는다는 뜻으로 이해하면 됩니다.

 

사전분포의 α와 β는 어떻게 결정하나요?
α/(α+β)로 평균적인 믿음(예: CTR 5%)을 반영하고, α+β의 크기로 그 믿음에 대한 확신의 세기(마치 몇 건을 이미 관찰한 것과 같은가)를 정합니다. 정답이 정해진 공식은 없고, 보통 과거 데이터의 노출·클릭 총합을 그대로 쓰거나 그 크기를 적절히 줄여서 사용합니다.

 

 

Thompson Sampling

서론에서 언급했듯이, 여러 아이템을 동시에 운영할 때는 탐험(Exploration)과 활용(Exploitation) 사이에서 균형을 잡아야 합니다. 지금까지 CTR이 가장 높아 보이는 아이템을 계속 밀어주면 당장은 안정적이지만, 아직 충분히 검증되지 않은 아이템에 숨어 있을 더 좋은 아이템을 놓칠 수 있기 때문이에요.

 

Thompson Sampling은 이 균형을 각 아이템의 CTR을 베타분포로 표현한 뒤 그 분포에서 직접 샘플링하는 방식으로 풀어냅니다.

 

알고리즘 구조

각 아이템이 자신만의 사후분포인 Beta(α, β)를 갖고 있다고 합시다. 사용자에게 무엇을 노출할지 결정할 때마다 다음 세 단계를 반복합니다.

 

1. 샘플링

: 각 아이템의 사후분포에서 임의의 값을 하나씩 뽑는다. 예를 들어, 아이템 A는 Beta(30,70)에서, 아이템 B는 Beta(8,12)에서, 아이템 C는 Beta(3,17)에서 각각 랜덤하게 숫자 하나씩 뽑는 식이다.

2. 선택

: 뽑힌 샘플값 중 가장 높은 값을 가진 아이템을 유저에게 노출한다.

3. 업데이트

: 유저가 클릭했는지 여부에 따라, 그 아이템의 α 또는 β에 1을 더한다. (클릭했으면 α+1, 안 했으면 β+1)

 

왜 이 방식을 통해 탐험과 활용을 동시에 해결할 수 있을까요? 핵심은 2번째 단계입니다. 평균이 아니라 샘플값으로 비교한다는 것.

  • 노출이 많이 쌓여 분포가 뾰족한 아이템(예: A)은 샘플을 뽑아도 매번 평균 근처(30%)의 값이 나온다. 확신이 강하니 결과가 안정적이다.
  • 노출이 적어 분포가 넓게 퍼진 아이템(예: C)은 샘플을 뽑을 때마다 값이 크게 요동친다. 가끔은 운 좋게 매우 높은 샘플값이 나올 수도 있다.

즉 아직 데이터가 부족한 아이템도, 가끔 운 좋은 샘플이 뽑히면 자연스럽게 노출 기회를 얻습니다. 이게 곧 탐험이죠. 반대로 이미 확신이 쌓인 아이템은 매번 비슷한 샘플값을 내며 안정적으로 선택받고, 이게 곧 활용입니다. 

 

핵심은 이 둘을 분리된 로직으로 처리하는 것이 아니라, 분포의 불확실성 자체가 자동으로 탐험 정도를 조절한다는 점입니다. 노출이 쌓일수록 분포가 뾰족해지고, 뾰족해질수록 자연스럽게 탐험 빈도가 줄어듭니다. 

 

 

예를 들어, 위와 같은 사후분포를 가지는 아이템이 있다고 가정했을 때 A는 상대적으로 노출이 많아 안정된 값(0.31)을 가집니다. B는 노출이 중간 수준이라 그 사이 값(0.58)이 나왔고요. C는 노출 수는 적지만 랜덤하게 뽑았을 때 높은 샘플값(0.71)을 가질 수 있습니다. 만약 다시 샘플링한다면 이 순위는 얼마든지 바뀔 수 있고요.

 

이렇게 랜덤하게 각 아이템의 사후분포에서 샘플링했을 때 높은 값을 가지는 아이템을 추천하는 과정에서 탐색과 활용을 모두 만족시킬 수 있게 됩니다. 

 

 

결론

앞서 정리했던 개념과 연결지어 보면

  • θ = 고정된 진짜 CTR. 우리가 갖고 있는 건 그에 대한 확신(사후분포) - 이 확신을 의사결정에 직접 활용하는 게 Thompson Sampling
  • 사후분포 = 사전분포 × 우도 → 매 클릭/무클릭마다 α, β를 갱신하는 게 곧 사후분포 업데이트
  • 베타분포를 쓰는 이유 → 매번 파라미터 덧셈만으로 실시간 업데이트가 가능해서, 대량 트래픽 환경에서도 계산 부담 없이 돌릴 수 있음

Thompson Sampling이 탐색과 활용에서 유용한 이유는 두 딜레마 사이에서 고정된 규칙으로 억지로 나누지 않았다는 데 있습니다. 대신 "내가 이 아이템에 대해 얼마나 확신이 없는가"라는 불확실성을 탐색의 동력으로 바꾸었습니다. 

 

데이터가 적어서 불확실한 아이템을 배제하는 게 아니라 그 불확실성 덕분에 자연스럽게 기회를 얻고, 데이터가 쌓여 확신이 생긴 아이템은 그 확신 그대로 안정적으로 활용할 수 있습니다. 하나의 확률분포로 탐색과 활용을 동시에 해낼 수 있다는 점에서 Thompson Sampling은 추천시스템에서 유용하게 사용할 수 있을 것 같습니다. 

 

현재 Diversity 문제를 풀기 위해 많은 고민을 하고 있는데 Thompson Sampling을 직접 활용해보면서 이에 대해서도 다음 글로 작성해보겠습니다.