DEV Community

Cover image for 입찰가를 머신러닝으로 — bid = f(predicted value)의 모든 것
HyunSeok Jeong
HyunSeok Jeong

Posted on • Originally published at blog.trysitely.com

입찰가를 머신러닝으로 — bid = f(predicted value)의 모든 것

들어가며

Meta·Google에서 "자동 입찰"을 켜고 ROAS 목표를 입력하면, 그 뒤에서는 사람이 정한 단가가 아니라 매 광고 노출마다 다시 계산되는 입찰가가 움직입니다. 이 입찰가는 "이 광고를 이 사람에게 보여주면 얼마짜리 가치를 만들 수 있을까"라는 예측에서 나오고, 그 예측은 머신러닝 모델 여러 개를 합친 결과입니다. 이 글은 입찰 자동화를 켜고 끄는 마케터가 그 안쪽 파이프라인을 이해할 수 있도록, bid=f(predicted value)\text{bid} = f(\text{predicted value}) 한 줄을 6~7개 H2로 풀어 정리합니다.

pCTR·pCVR·pLTV가 가치로 변환되어 bid 가격으로 산출되는 머신러닝 파이프라인
자동 입찰의 안쪽 — 예측 모델이 가치를 만들고, 가치가 입찰가가 된다

자동 입찰의 핵심 등식

광고 노출 한 번을 두고 광고주가 입찰할 가격은 그 노출이 만들 기대 가치보다 작거나 같아야 합니다. 그 기대 가치가 어디서 오는지가 머신러닝의 자리입니다.

📌 이 글의 전제

독자가 자동 입찰·CPC·CPA·ROAS 목표 같은 단어는 쓴다고 가정합니다. 머신러닝의 디테일은 모르더라도 "예측값으로 의사결정한다"는 개념은 알고 있다고 가정합니다.

가장 단순한 경우 — Cost per Click 입찰

CPC 입찰에서 광고주가 한 클릭에 최대 1,000원까지 지불할 수 있다면, 한 광고 노출의 기대 가치는 그 노출이 클릭으로 이어질 확률(pCTR) 곱하기 클릭당 가치입니다.

bidCPC=pCTRValueclick \text{bid}\text{CPC} = pCTR \cdot \text{Value}\text{click}

pCTR이 0.05일 때 bid = 0.05 × 1,000 = 50원입니다. 같은 광고도 클릭 가능성이 낮아 보이는 사람에게는 더 적게, 높아 보이는 사람에게는 더 많이 입찰합니다. 이 한 줄이 자동 입찰의 골격입니다.

Value-based bidding — 클릭 한 번에 다른 가치를 매김

ROAS 목표 캠페인은 클릭 가치 자체를 사람마다 다르게 봅니다. 클릭한 사람이 얼마짜리 구매를 할 확률(pCVR)과 평균 매출까지 곱해 들어갑니다.

bidROAS=pCTRpCVRE[revenueconv]/ROAS target \text{bid}_\text{ROAS} = pCTR \cdot pCVR \cdot \mathbb{E}[\text{revenue}|\text{conv}] / \text{ROAS target}

이게 풀-퍼널 자동 입찰의 골격이고, 같은 캠페인 안에서도 사람마다 입찰가가 100배까지 차이 나는 이유입니다. ROAS 4를 목표로 한다면 분자가 4배 커야 같은 입찰을 합니다.

pCTR·pCVR — 두 예측 모델

광고 입찰의 ML은 거의 항상 두 모델로 나뉩니다.

pCTR — 클릭 확률 예측

입력 특성(features):

  • 사용자 신호 — 디바이스·OS·세션 길이·과거 광고 인터랙션
  • 컨텍스트 신호 — 시각·요일·페이지 카테고리·앱
  • 광고 신호 — 크리에이티브 임베딩·카피 텍스트·광고주 카테고리

모델 종류는 logistic regression·factorization machines·심화한 deep learning(DLRM·Wide&Deep)까지 다양합니다. 광고 시장의 표준은 huge sparse feature(억 단위 카테고리)에 잘 맞는 logistic + embedding 조합입니다.

pCVR — 전환 확률 예측

pCVR이 더 어렵습니다. 클릭은 빈도가 1~5% 수준이지만 전환은 0.01~1% 수준이고, 라벨이 도착하는 시점이 며칠 늦습니다(delayed feedback). 그래서 pCVR은 데이터가 더 적고 노이즈가 더 큰 환경에서 학습됩니다.

💡 delayed feedback의 표준 처리

전환이 며칠 뒤 도착하는 만큼, 학습 시점에 라벨 0인 데이터가 진짜 0인지 아직 도착 안 한 건지 모릅니다. 표준 처리는 (1) survival 분포로 전환 도달 시간을 모델링하고 (2) 라벨 미도착을 censoring으로 처리하는 방식입니다.

가치 환산 — 클릭/전환을 돈으로

예측 확률만으로는 입찰을 못 합니다. 그 확률에 곱할 "값"이 필요합니다. 이 값을 어떻게 잡는지가 자동 입찰의 정확도를 결정합니다.

단순 평균 vs 사용자별 LTV

E[revenueconv]\mathbb{E}[\text{revenue}|\text{conv}] 를 평균으로 잡으면 누구나 같은 가치를 갖습니다. 하지만 실제로는 한 번 사고 떠나는 사람과 정기 구매자가 섞여 있어, 사용자별 pLTV(predicted lifetime value)를 별도 모델로 추정하는 게 정확합니다.

bidLTV=pCTRpCVRpLTV/ROAS target \text{bid}_\text{LTV} = pCTR \cdot pCVR \cdot pLTV / \text{ROAS target}

pLTV 모델은 첫 며칠 행동 시그널로 30·60·90일 매출을 예측합니다. 이게 잘 잡히면 자동 입찰이 "오늘 매출이 큰 사람"이 아니라 "장기 가치가 큰 사람"에게 더 입찰합니다.

Bid Shading — first-price 경매에서 안 비싸게 이기기

광고 시장이 second-price에서 first-price로 옮겨오면서, "내가 부른 가격을 그대로 낸다"는 환경이 됐습니다. 그러면 입찰가를 그대로 쓰면 너무 비싸게 사게 됩니다. Bid shading은 입찰가에 할인 계수를 곱해 효율적인 가격을 만드는 기술입니다.

ParseError: KaTeX parse error: Expected 'EOF', got '_' at position 14: \text{shaded_̲bid} = \text{va…

shading 모델은 과거 경매 결과를 학습해 "이 시장 상황에서 이 가치를 가진 입찰이 이기려면 얼마면 충분한가"를 추정합니다. shading이 잘 작동하면 같은 노출 수를 사면서 비용이 10~20% 줄어듭니다.

⚠️ Shading의 함정

shading 모델이 너무 공격적이면 노출 수가 줄어 학습 데이터가 줄고, 이는 다음 학습 라운드에서 모델 정확도를 떨어뜨려 악순환을 만듭니다. exploration·exploitation 균형 필요.

Pacing — 하루 예산을 고르게 쓰는 알고리즘

자동 입찰이 새벽에 좋은 기회를 놓치고, 저녁에 예산을 다 쓰면 안 되니까 하루 동안 예산이 고르게 쓰이도록 입찰가를 동적으로 조절합니다. 이게 pacing입니다.

Throttling — 입찰 빈도 조절

기대 입찰 횟수의 일부에만 참여합니다. 예산 잔량이 많으면 100% 입찰하고, 빠르게 줄면 50% → 30%로 낮춥니다.

Bid 조정 — 입찰가 자체 조절

매 시간마다 "남은 예산 / 남은 시간"으로 목표 소진 속도를 잡고, 실제 속도가 그보다 빠르면 입찰가를 낮추고 느리면 올립니다.

bidpaced=bidbasetarget spend rateactual spend rate \text{bid}\text{paced} = \text{bid}\text{base} \cdot \frac{\text{target spend rate}}{\text{actual spend rate}}

마케터가 이걸 알면 "왜 같은 캠페인이 오전엔 ROAS 5인데 저녁엔 ROAS 1.5"같은 의문을 더 잘 해석합니다 — pacing 알고리즘이 시간대별 입찰가를 다르게 잡아 결과 분포를 바꾼 신호일 수 있습니다.

자동 vs 수동 — 마케터가 만지는 다이얼

플랫폼이 ML로 입찰을 다 처리한다면 마케터가 만질 다이얼은 무엇이 남는가? 다음 4개입니다.

다이얼 설명 의사결정 빈도
ROAS·CPA 목표 모델이 추구할 효율 기준 분기
예산 하루·캠페인 예산 한도
오디언스 모델이 학습할 사용자 풀
크리에이티브·카피 가치 환산의 입력 신호 주~월

이 4개가 수십 개의 ML 모델을 통제하는 출력 인터페이스입니다. 마케터의 일은 ML이 학습할 환경(데이터·목표·자원)을 잘 디자인하는 것이지, 입찰가를 직접 정하는 것이 아닙니다.

💡 자동 입찰을 잘 쓰는 룰

ROAS 목표를 너무 자주 바꾸지 않습니다. 모델이 새 목표에 맞춰 입찰 분포를 재학습하는 데 1~2주 걸리고, 그 사이 성과가 흔들리는 걸 마케터가 못 견뎌 다시 바꾸면 모델은 영영 수렴 못 합니다. {/* TODO_HUNY: 우리 캠페인에서 ROAS 목표를 마지막으로 바꾼 게 언제인지, 그 뒤 학습 안정화에 얼마나 걸렸는지 한 줄로 */}

함정 모음

  • cold start — 신규 캠페인은 학습 데이터가 부족해 첫 1~2주는 비효율적. exploration이 비싸다는 사실을 받아들여야 함
  • label leakage — 학습 데이터에 미래 정보가 새어 들어가면 모델 평가에서는 좋아 보이지만 실전에서 실패
  • survivorship — 입찰에 이긴 노출만 학습 데이터에 들어가 분포가 편향됨. 일부러 무작위 입찰 expose 할 때가 있음
  • pCVR drift — 시즌·외부 충격으로 전환율 분포가 바뀌면 모델 재학습 필요
  • auction dynamics 변화 — 경쟁자 입찰 전략 변화로 first-price 시장 균형이 흔들림

마치며

광고 입찰의 자동화는 한 번에 다 들어온 게 아니라 pCTR → pCVR → pLTV → bid shading → pacing 순으로 한 층씩 추가되어 왔습니다. 마케터가 이 안쪽을 들여다볼 일은 흔치 않지만, "왜 같은 캠페인의 ROAS가 그렇게 흔들리는가"를 묻는 순간에는 한 층 한 층의 동작을 알아둬야 답이 보입니다.

다음 분기에 한 번만 시도해 볼 만한 것은 자체 pLTV 시그널을 광고 플랫폼에 CAPI로 전송하는 흐름입니다. 외부 ML이 추정하는 LTV보다 내가 가진 1st-party 시그널이 더 정확할 가능성이 크고, 이걸 입찰 모델에 직접 입력으로 줄 수 있다면 자동 입찰의 정확도가 한 층 올라갑니다.

{/* TODO_HUNY: 자동 입찰을 켰다 끈 적이 있다면 그 이유와 결과 한 단락 */}

참고

Top comments (0)