작동 원리
이 데모는 LinUCB (Linear Upper Confidence Bound) 알고리즘을 브라우저에서 직접 실행합니다.
- 컨텍스트 벡터 (x): 각 광고는 고정된 피처 벡터(예: 기술 점수, 패션 점수 등)를 갖습니다.
- 가중치 벡터 (θ): 알고리즘이 각 광고에 대해 학습하는 믿음(belief)입니다. 클릭이 쌓일수록 정밀해집니다.
- 광고 선택: 점수 = (예측 점수: x^T·θ) + (탐색 보너스: α × √(x^T·A⁻¹·x)) 로 계산하여 가장 높은 광고를 추천합니다.
- 모델 업데이트: 클릭 시 행렬 A와 벡터 b를 갱신하여 다음 추천을 더 정확하게 개선합니다.
Disjoint LinUCB 모델 상세 해석
보내주신 JS 코드와 이 스크린샷 화면은 Disjoint LinUCB 모델이 작동하는 모습을 완벽하게 시각화한 것입니다.
"이 그래프가 도대체 무엇을 의미하는지", 그리고 "왜 Ad A가 추천되었는지"를 AdTech 전문가 관점에서 명쾌하게 해석해
드릴게요.
1. 코드 확인: "네, Disjoint LinUCB입니다."
작성하신 코드에서 this.A = [] 배열을 만들어 광고(Arm)마다 별도의 행렬을 관리했었죠?
이 화면에서도 4개의 막대그래프가 서로 남남처럼 각자의 점수를 계산하고 있습니다.
- Ad A의 점수: 오직 Ad A의 과거 데이터(클릭)만 반영됨.
- Ad B의 점수: Ad A가 클릭되든 말든 상관없음.
2. 그래프 완벽 해석 (The Anatomy of UCB)
이 그래프는 LinUCB의 핵심 공식인 "최종 점수 = 예측(Exploitation) + 불확실성(Exploration)"을 눈으로 보여줍니다.
① 전체 막대 높이 (Total Height) = 최종 UCB 점수
- 모델은 이 전체 높이가 가장 높은 광고를 유저에게 보여줍니다.
- 현재 Ad A (Tech)가 가장 키가 크기 때문에 [Recommended] 딱지가 붙은 것입니다.
② 색깔 있는 부분 (Bottom Bar) = "실력 점수" (Prediction / Exploitation)
- 의미: "지금까지 배운 바로는, 이 유저가 이 광고를 클릭할 확률이 이만큼이야."
- 해석:
- Ad A (분홍색): 색깔 막대가 제일 높죠? 모델은 "이 유저 취향엔 Ad A가 딱이야!"라고 아주
강하게 확신하고 있습니다.
- Ad C (노란색): 색깔 막대가 낮습니다. "음.. 경험상 이 유저는 Ad C를 별로 안 좋아할 것 같은데..."라고 생각하는
겁니다.
③ 회색 부분 (Top Bar) = "호기심 점수" (Uncertainty / Exploration)
- 의미: "이 광고에 대한 데이터가 부족해서 잘 모르겠어. 그러니까 가산점(보너스)을 줄게!"
- 해석:
- 데이터가 많이 쌓일수록(많이 노출될수록) 이 회색 막대는 점점 줄어듭니다. (아니까 안 궁금함)
- Ad D (청록색 위의 회색): 회색 부분이 꽤 두툼하죠? 모델이 "Ad D는 아직 긴가민가해. 기회를 좀 더
줘볼까?"라고 생각하고 있는 겁니다.
3. 상황별 시나리오 분석
스크린샷의 상황을 점쟁이(모델)의 속마음으로 읽어보겠습니다.
- Ad A (1등, 추천됨):
- "실력(분홍)도 빵빵하고, 아직 100% 다 아는 건 아니라서 호기심(회색)도 좀 남았네. 합치니까 네가 1등이다!"
- Ad D (2등):
- "실력(청록)은 A보다 달리는데, 내가 얘를 잘 몰라서(회색이 큼) 점수를 후하게 쳐줬어. 아깝게 2등이네."
- 만약 여기서 Ad A를 계속 노출하면? A의 회색이 줄어들면서, 언젠가 D가 역전하는 순간이 올 수도 있습니다(탐색).
- Ad B (3등):
- "실력도 어중간하고, 궁금한 정도(회색)도 어중간하네."
- Ad C (꼴찌):
- "실력(노랑)도 형편없다고 예측되고, 이미 노출도 좀 돼서 별로 안 궁금해(회색도 낮음). 넌 탈락."
4. 요약
이 시각화는 Disjoint LinUCB가 어떻게 "확실한 이득(색깔 막대)"과 "미래를 위한 투자(회색
막대)" 사이에서 줄타기를 하는지 보여줍니다.
- 유저가 Ad A를 클릭하면?
- 분홍색 막대(실력)는 더 커집니다. (예측 성공!)
- 회색 막대(호기심)는 줄어듭니다. (이제 너에 대해 더 잘 알게 됐으니까.)
AdTech 실무 적용
LinUCB가 해결하는 문제
기본 Thompson Sampling은 유저 정보 없이 광고의 평균 CTR만으로 판단합니다.
LinUCB는 유저의 Context(검색어, 성별, 시간대 등)를 Feature Vector로 입력받아
"이 유저에게 이 광고가 얼마나 적합한가"를 개인화된 수준에서 예측합니다.
Feature Vector 설계
이 데모에서는 3개의 Feature(Matching Score, User Gender, Seasonality)를 사용합니다.
실무에서는 훨씬 다양한 Feature를 사용합니다:
- 유저 Feature: 연령대, 성별, 관심사 세그먼트, 최근 검색어, 방문 이력
- 광고 Feature: 카테고리, 브랜드, 크리에이티브 타입, 랜딩 페이지 품질
- 컨텍스트 Feature: 시간대, 요일, 디바이스, 지면 카테고리
Disjoint vs Hybrid LinUCB
이 데모는 Disjoint LinUCB를 구현합니다. 각 광고가 독립적으로 학습하므로
광고 A의 학습 결과가 광고 B에 전이되지 않습니다.
신규 광고가 빈번한 환경에서는 Hybrid LinUCB로 확장하여
광고 간 공통 지식을 공유하는 것이 효과적입니다.
데모 실험 가이드
- Ad A (Tech)를 5번 이상 Click하면: Prediction 점수가 상승하고 Uncertainty가 줄어드는 것을 관찰할 수 있습니다.
- Ad D (Travel)를 Ignore하면: reward=0으로 학습되어 Prediction이 하락합니다.
- 모든 광고를 균등하게 Click하면: Uncertainty가 균등하게 줄어들어 순수 Prediction 기반 경쟁이 됩니다.
- 한 광고만 집중 Click하면: 해당 광고의 Uncertainty가 빠르게 줄지만, 나머지 광고는 Uncertainty 보너스로 여전히 경쟁력을 유지합니다.