How Ads Ranking Works: The Data System Behind Every Ad You See
Author: DataStrata | Source: Medium | Published: 2026-06-28
한 줄 요약
광고 랭킹은 100ms 내 수백만 후보를 selection → light ranking → heavy ranking + auction의 3-stage funnel로 좁히고, quality multiplier가 들어간 generalized second-price 경매로 승자를 결정한다.
핵심 주장/내용
- 핵심 문제: 수백만 후보, 슬롯 1개, 100ms 미만. 해법은 funnel(각 stage가 recall vs latency를 trade-off하며 점점 정확·비쌈)
- Stage 1 Selection: ML 아님, 순수 boolean 필터(geo/demo/budget/audience/format/frequency cap). “eligible한가”(deterministic) vs “이겨야 하나”(probabilistic) — 혼동은 설계 실수
- Stage 2 Light Ranking: 수천→수백. 사전 계산 피처만, shallow 모델(GBDT/XGBoost). throughput > accuracy, recall이 precision보다 중요
- Stage 3 Heavy Ranking + Auction: 수백 후보에 정밀 pCTR. full real-time 피처 + DLRM. 경매:
Total Value = bid × pCTR × quality_score, 최고 bid가 아닌 최고 total value 승리, second-price 지불. reserve price 미달 시 광고 미노출(장기 신뢰 보호) - pCTR: calibrated binary classification. raw score는 확률 아님 → 과거 클릭률로 calibrate(uncalibrated면 경매 수식 깨짐)
- 데이터 엔지니어링 관점 — feedback loop가 hard part: 매 경매가 데이터 생성 → pCTR 재학습 → 승자 변경 → 새 데이터. exposure/survivor bias: 현 모델이 높게 랭크한 광고에 편향, 노출 안 된 광고는 클릭 라벨 없음. auction log에 loser 포함이 counterfactual·bias 보정에 필수
주요 수치 / 사실
- 6개 테이블: dim 계층(SCD Type 2 on ad_sets) + fct_auction_log(후보당 1행, loser 포함) + impressions/clicks/conversions + agg_ad_performance(시간당, light ranking feature store) + dim_user_features(일별)
- 클릭은 노출의 ~1-3% → 별도 테이블(단일 wide 테이블이면 대부분 null)
- “year 3에도 좋은 모델”을 만드는 것은 distribution shift(exposure bias) 관리
관련 위키
Source: 원문 보기