Tae Hyun Kim (Lowell)

RTB Bidding Strategy via Causal ML — From Prediction to Optimization

Real-Time Bidding(RTB)은 광고 노출 한 건이 경매에 올라오는 매 순간 100ms 안에 “얼마를 부를 것인가”를 결정해야 하는 문제다. 흔한 접근은 클릭/전환을 예측하고 그 기대값에 비례해 입찰하는 것이지만, 이는 예측일 뿐 의사결정이 아니다. 정작 우리가 알고 싶은 것은 “입찰가를 1% 올리면 낙찰률·전환이 인과적으로 얼마나 변하는가, 그리고 그 효과는 세그먼트마다 어떻게 다른가”이다. 이 노트는 공개 iPinYou 데이터셋 위에서 prediction → traditional analysis → CATE → SCM → optimization으로 이어지는 5단계 파이프라인을 따라가며, 예측에서 의사결정으로 넘어가는 다리를 인과추론으로 놓는 과정을 정리한다.

모든 수치는 공개 iPinYou 데이터셋 규모에서 도출한 예시(illustrative) 값이다. 사유 baseline·클라이언트 식별자는 일절 사용하지 않으며, 절대 규모가 아니라 방법론의 형태를 보이기 위한 것이다.

문제: 왜 예측만으로는 부족한가

입찰의 기대 가치는 보통 다음과 같이 산정한다.

V(x)=pCTR(x)×pCVR(x)×valueV(x) = \text{pCTR}(x) \times \text{pCVR}(x) \times \text{value}

문제는 두 가지다. 첫째, V(x)V(x)를 안다고 해서 얼마를 입찰해야 하는지가 자동으로 나오지 않는다. First-price 경매에서 bid=V\text{bid} = V로 부르면 마진이 0이 되므로 bid shading이 필수이고, 최적 shading은 입찰가 변화에 대한 낙찰률의 반응성(elasticity) 에 달려 있다. 둘째, 이 elasticity는 상관관계가 아니라 인과 효과여야 한다. 관측 로그에서 높은 입찰은 이미 가치 높은 노출(높은 pCTR)에 몰려 있으므로, 단순 회귀의 “bid↑ → win↑” 기울기는 confounding으로 오염돼 있다.

핵심 인과 구조는 다음과 같다.

Campaign / Context / User → pCTR/pCVR → Bid → Win → Impression → Click → Conversion

                                  Competition, Floor

여기서 pCTR·Campaign은 Bid와 Win 양쪽에 영향을 주는 Confounder이고, Competition·Floor는 Win을 결정하는 또 다른 입력이다. Bid의 인과 효과를 식별하려면 이들을 통제해야 한다.

데이터: 공개 iPinYou 규모

iPinYou는 RTB 연구에서 널리 쓰이는 공개 벤치마크로, 대략 다음 규모다(반올림·근사).

단계규모(근사)의미
Bid requests~300M경매에 올라온 전체 입찰 기회
Wins (impressions)~60M낙찰되어 노출된 건
Clicks~800K클릭 발생
Conversions~16K전환 발생

깔때기 구조(funnel) 자체가 분석의 가장 큰 난점을 만든다. 우리는 낙찰된 ~60M에서만 click/conversion을 관측하고, conversion은 click=1인 경우에만 관측한다. 즉 2단계 selection bias가 데이터에 새겨져 있다.

  • Stage 1 (Win selection): 낙찰된 노출만 관측 → 전체 bid space에 대한 예측이 편향. 높은 bid로 이긴 샘플에 과적합.
  • Stage 2 (Click selection): CVR을 click=1 샘플로만 학습 → click하지 않은 노출의 전환 의향이 누락.

방법/파이프라인

Stage 1 — 예측 + selection-bias 디바이어싱

기본 예측 타깃은 pCTR=P(Click=1X)\text{pCTR} = P(\text{Click}=1\mid X), pCVR=P(Conv=1Click=1,X)\text{pCVR} = P(\text{Conv}=1\mid \text{Click}=1, X), 그리고 entire-space 타깃 CTCVR=pCTR×pCVR\text{CTCVR} = \text{pCTR}\times\text{pCVR}이다. 2단계 bias를 동시에 보정하기 위해, Stage 2는 entire-space multi-task 구조로(impression space에서 CTCVR을 학습), Stage 1은 IPW로 다룬다.

Stage 1의 win propensity는 전체 입찰 로그(win=0 포함)에서 추정한다.

pwin(x,b)=P(win=1X=x, bid=b),wi=1pwin(xi,bi)p_{\text{win}}(x, b) = P(\text{win}=1 \mid X=x,\ \text{bid}=b), \qquad w_i = \frac{1}{p_{\text{win}}(x_i, b_i)}

극단 weight로 인한 gradient 폭주를 막기 위해 stabilized weight wistab=P(win)/pwin(xi,bi)w_i^{\text{stab}} = P(\text{win})/p_{\text{win}}(x_i,b_i), clipping, self-normalized(Hájek) 정규화를 쓴다. 이론적 근거는 단순한 reweighting 항등식이다.

Ebid[f(x)]=Ewon ⁣[f(x)p(winx) | win=1]E_{\text{bid}}[f(x)] = E_{\text{won}}\!\left[\frac{f(x)}{p(\text{win}\mid x)}\ \middle|\ \text{win}=1\right]

예시 결과: pCTR/pCVR 모델은 AUC 약 0.82–0.88 범위에서 변별력을 보였고, 디바이어싱 변형(IPW-가중)은 낙찰률이 낮은 세그먼트에서 calibration(ECE)을 눈에 띄게 개선했다. 디바이어싱의 효용은 평균 AUC보다 전체 bid space에 대한 IPW-가중 AUC와 calibration에서 더 분명히 나타난다 — 정확히, 잘 안 보이던 영역의 예측을 고치기 때문이다.

Stage 2 — 전통적 win-rate / ROI 분석

먼저 상관관계 수준에서 입찰가–낙찰률 곡선을 로지스틱으로 적합한다.

P(Win=1Bid,X)=Λ ⁣(β0+β1log(Bid)+γX)P(\text{Win}=1 \mid \text{Bid}, X) = \Lambda\!\big(\beta_0 + \beta_1 \log(\text{Bid}) + \gamma' X\big)

여기서 입찰 elasticity는

ε=logP(Win)logBid=β1(1P(Win))\varepsilon = \frac{\partial \log P(\text{Win})}{\partial \log \text{Bid}} = \beta_1\,(1 - P(\text{Win}))

로 닫힌 형태로 나온다. ROI는 ROI=(nconvvaluepaypricei)/paypricei\text{ROI} = (n_{\text{conv}}\cdot\text{value} - \sum \text{payprice}_i)/\sum \text{payprice}_i. 이 단계의 핵심 관찰은 elasticity가 세그먼트마다 다르다는 점이다(경쟁 약한 시간대 → 높은 elasticity). 다만 이 곡선은 confounding이 섞인 기술 통계이지 인과량이 아니다 — 그래서 Stage 3로 넘어간다.

Stage 3 — CATE (DML / Causal Forest)

처치를 연속변수 T=log(bid)T = \log(\text{bid})로 두고, Double-Debiased ML / Causal Forest(CausalForestDML)로 조건부 평균 처치 효과를 추정한다.

τ(x)=TE[Windo(T),X=x]\tau(x) = \frac{\partial}{\partial T}\, E[\text{Win}\mid do(T), X=x]

변수 분할은 다음과 같다.

Y (Outcome):       win, click, conversion
T (Treatment):     log_bid  (연속 처치)
X (Heterogeneity): campaign, hour, exchange, region
W (Confounders):   floor, competition_proxy, pCTR

DML은 nuisance(E[YX,W]E[Y\mid X,W], E[TX,W]E[T\mid X,W])를 ML로 학습하고 Robinson 잔차화로 직교화하므로, Neyman-Orthogonal Score에 의해 1단계 추정 오차에 강건하고 n\sqrt{n}-일치성을 얻는다. Causal Forest의 honest splitting은 신뢰구간의 유효성을 보장한다.

예시 결과: ATE는 양수로 추정됐고(95% CI가 0을 포함하지 않음 — log_bid 1 증가 시 win rate가 수 %p 상승), CATE 분포는 0을 중심으로 넓게 퍼져 상당한 이질성을 드러냈다. 패턴은 직관과 일치한다.

이질성 차원패턴(예시)
Campaign(업종)업종별 τ\tau 차이 뚜렷
Hour(시간대)비피크 시간대에서 τ\tau
Competition(경쟁 강도)경쟁↑ → τ\tau ↓ (조절 효과)

같은 1%의 입찰 인상이라도 어디에 쓰느냐에 따라 한계 효과가 크게 다르다 — 이것이 정책 설계의 출발점이다.

Stage 4 — SCM / counterfactual

CATE가 “평균적으로 얼마나”라면, SCM은 “이 입찰이 달랐다면?”이라는 개별·정책 반사실을 다룬다. 구조 방정식은 다음과 같이 둔다.

Bid:=fbid(pCTR,pCVR,Campaign)+UbidWin:=1{Bidmax(Competition,Floor)}Click:=fclick(ad,user)+Uclick  Win=1Conv:=fconv(intent,landing)+Uconv  Click=1\begin{aligned} \text{Bid} &:= f_{\text{bid}}(\text{pCTR}, \text{pCVR}, \text{Campaign}) + U_{\text{bid}} \\ \text{Win} &:= \mathbf{1}\{\text{Bid} \geq \max(\text{Competition}, \text{Floor})\} \\ \text{Click} &:= f_{\text{click}}(\text{ad}, \text{user}) + U_{\text{click}} \ \mid\ \text{Win}=1 \\ \text{Conv} &:= f_{\text{conv}}(\text{intent}, \text{landing}) + U_{\text{conv}} \ \mid\ \text{Click}=1 \end{aligned}

do-operator를 쓰면 backdoor 조정으로 개입 분포가 식별된다.

P(Windo(Bid=b))=zP(Winb,z)P(z),Z={pCTR,campaign,hour,exchange,floor,competition_proxy}P(\text{Win}\mid do(\text{Bid}=b)) = \sum_z P(\text{Win}\mid b, z)\,P(z), \quad Z = \{\text{pCTR}, \text{campaign}, \text{hour}, \text{exchange}, \text{floor}, \text{competition\_proxy}\}

개별 반사실은 abduction–action–prediction으로 푼다. 예컨대 “bid=80에서 졌는데 bid=130이었다면?” → (귀추) P(CompetitionWin=0,Bid=80)Competition80P(\text{Competition}\mid \text{Win}=0, \text{Bid}=80)\Rightarrow \text{Competition}\ge 80 → (행동) do(Bid=130)do(\text{Bid}=130) → (예측) [F(130)F(80)]/[1F(80)][F(130)-F(80)]/[1-F(80)]. 매개분석에서는 Bid가 Win을 통해서만 Conversion에 작용하므로 NIE/TE ≈ 1로 나타난다(Win이 거의 완전한 매개자).

SUTVA 주의: RTB는 경쟁 구조 때문에 한 입찰이 타 입찰자의 낙찰 확률에 영향을 줄 수 있어 SUTVA가 약하게 위반될 여지가 있다. 시장이 충분히 크면 개별 입찰의 영향은 미미하다고 가정하지만, 이는 한계로 명시해 둔다(Contextual Bandits/interference 관점에서 추후 다룰 지점).

Stage 5 — 최적 입찰 + 정책 시뮬레이션(OPE)

CATE/elasticity를 최적 입찰 공식에 직접 꽂는다. 예산 제약이 없으면 독점 가격 공식과 동형이다.

b(x)=V(x)(11ε(x))b^*(x) = V(x)\left(1 - \frac{1}{\varepsilon(x)}\right)

예산 BB 제약을 라그랑주로 풀면 shadow price λ\lambda가 들어간 형태가 된다.

max{bi} i(Vibi)P(Winibi)s.t.ibiP(Winibi)B  bi=Vi1+λ(11εi)\max_{\{b_i\}}\ \sum_i (V_i - b_i)\,P(\text{Win}_i\mid b_i)\quad \text{s.t.}\quad \sum_i b_i\,P(\text{Win}_i\mid b_i) \le B \ \Rightarrow\ b_i^* = \frac{V_i}{1+\lambda}\left(1 - \frac{1}{\varepsilon_i}\right)

그 다음이 이 프로젝트의 핵심 검증 단계다: 로그에서 학습한 정책을 온라인에 올리지 않고 평가하기 위해 Off-Policy Evaluation을 쓴다. 후보 정책들(고정 입찰 / pCTR 비례 / value 기반 / CATE-최적)을 IPS·doubly-robust 추정량으로 반사실 평가하고, SCM 시뮬레이터로 “이 정책을 썼다면 ROI가 얼마였을까”를 비교한다.

예시 결과: CATE-최적 정책은 세그먼트별 bid discount factor를 산출했다 — 경쟁이 약하고 elasticity가 높은 세그먼트에는 더 공격적으로(낮은 shading) 입찰을, 가치 대비 비싼 세그먼트에는 더 보수적으로 입찰을 배분. OPE 기준으로 이 정책은 value-기반·고정 baseline 대비 예산 효율(전환당 비용)이 개선됐다. 다만 OPE 추정치는 propensity overlap이 좋은 영역에서만 신뢰할 수 있으므로, Positivity가 약한 극단 입찰 구간은 신뢰구간을 넓게 보고했다.

서빙 제약: <100ms SLA

마지막으로 이 모든 것은 온라인 입찰 시점에 100ms 안에 동작해야 한다. Ad Exchange timeout이 100ms이고, feature lookup·모델 추론·입찰 계산·budget pacing이 그 예산 안에 다 들어가야 한다. 실측 목표는 P50 < 20ms, P99 < 80ms 수준이었다. 인과적으로 도출한 정책이라도 latency budget을 넘기면 무용지물이므로, CATE/optimal-bid는 사전 계산해 세그먼트별 lookup 테이블·경량 모델로 서빙한다.

주요 발견(예시 요약)

  • 디바이어싱은 평균이 아니라 꼬리에서 값을 낸다. IPW-기반 보정은 평균 AUC보다 낮은-win-rate 세그먼트의 calibration에서 효과가 컸다 — 안 보이던 bid space를 고치기 때문.
  • 입찰 효과는 강하게 이질적이다. ATE는 양수지만 CATE 분포는 0을 중심으로 넓게 퍼져 있고, 경쟁 강도가 효과를 누르는 명확한 조절 효과가 보였다.
  • 상관 elasticity ≠ 인과 elasticity. 단순 회귀의 기울기는 confounding으로 부풀려질 수 있어, DML/Causal Forest로 교정한 τ(x)\tau(x)를 최적 입찰에 써야 정책이 무너지지 않는다.
  • OPE가 온라인 실험을 대체하지는 못하지만 위험을 줄인다. Positivity가 약한 구간의 OPE 추정은 불확실성이 크다 — 신뢰구간을 정직하게 보고하고, 그 영역은 보수적으로 입찰.

배운 점

  1. Prediction → Decision의 다리는 인과량이다. V(x)V(x)(예측)만으로는 입찰가가 나오지 않는다. 입찰가를 푸는 데 필요한 건 elasticity/CATE라는 인과 미분이고, 이것이 prediction-only 파이프라인과의 결정적 차이다.
  2. selection bias를 데이터 생성 과정의 일부로 모델링하라. RTB의 funnel은 우연이 아니라 구조다. Win/Click selection을 각각 Stage 1/2로 명시하고 reweighting + entire-space 학습으로 분리해 다루면, 보정이 어디서 효과를 내는지(꼬리 세그먼트)가 해석 가능해진다.
  3. 이질성을 무시한 평균 정책은 돈을 흘린다. ATE 하나로 입찰하면 elasticity 높은 세그먼트의 기회와 비싼 세그먼트의 낭비를 동시에 놓친다. CATE 기반 세그먼트별 discount factor가 예산을 옳은 곳으로 보낸다.
  4. OPE 없이 정책을 배포하지 말되, OPE를 과신하지도 말라. off-policy 추정은 라이브 위험 없이 정책을 거를 수 있게 해주지만, overlap이 나쁜 영역에서는 그 자체가 편향된다. positivity 진단과 함께 읽어야 한다.
  5. 인과성도 latency budget을 못 이기면 무용하다. 100ms SLA 안에서 동작하도록 정책을 사전 계산·경량화하는 것까지가 의사결정 시스템의 일부다.

연결 그래프