클릭률(CTR, Click-Through Rate) 예측의 기준 모델을 정할 때 후보는 많다. Gradient Boosting, Neural Network, 그리고 로지스틱 회귀(LR, Logistic Regression). 이 중 LR은 여전히 자주 기준 모델로 선택된다. 오래된 모델이 그 선택을 받는 데에는 이유가 있다.
LR 의 특성
경량. 모델이 벡터 내적 한 번이다. 학습도, 인퍼런스도, 피처 수에 선형.
해석 가능. 계수 하나하나가 “이 피처가 결과에 얼마나 기여하는가"를 직접 말해준다.
확률 출력. 0과 1 사이의 값을 출력한다. 광고에서는 입찰가를 곱할 때 그대로 쓰인다.
모델 구조
Logistic Regression을 가장 빠르게 이해하는 방법은 선형 회귀(Linear Regression)에서 출발하는 것이다.
선형 회귀는 입력의 가중합을 출력한다.
$$ z = w \cdot x + b $$문제는 $z$가 실수 전체를 범위로 갖는다는 점이다. CTR 같은 확률을 내놓으려면 출력이 0과 1 사이여야 한다. 선형 회귀는 이를 보장하지 않는다.
시그모이드(Sigmoid) 함수가 이 문제를 해결한다.
$$ \sigma(z) = \frac{1}{1 + e^{-z}} $$시그모이드는 실수 전체를 $(0, 1)$ 구간으로 부드럽게 압축한다. 입력이 아무리 커져도 1에 수렴하고, 아무리 작아져도 0에 수렴한다. 선형 회귀의 출력을 시그모이드에 통과시키면 확률이 된다.
이 단순한 합성이 Logistic Regression의 전부다. 선형 모델 + 확률 출력.
주목할 점 하나. 확률 출력은 비선형이지만, 결정 경계(Decision Boundary), 즉 확률 0.5를 기준으로 양쪽을 나누는 경계는 여전히 선형이다. $w \cdot x + b = 0$ 이라는 초평면이 그대로 경계가 된다. LR은 “선형 분류기에 확률을 결합한 모델"이다.
log-loss
모델 구조가 정해졌다면, 학습은 “좋은 $w$와 $b$를 찾는 일"이다. 기준이 필요하다.
선형 회귀는 MSE(Mean Squared Error)를 쓴다. LR은 MSE를 쓰지 않는다. 이유는 출력 형태에 있다.
LR의 출력은 확률이다. 확률 모델의 손실에는 더 적합한 선택이 있다. log-loss (또는 cross-entropy).
$$ L = -\frac{1}{N} \sum_{i=1}^{N} \left[ y_i \log \hat{y}_i + (1 - y_i) \log (1 - \hat{y}_i) \right] $$정답이 1일 때는 $\log \hat{y}$가 커질수록 손실이 줄고, 정답이 0일 때는 $\log(1 - \hat{y})$가 커질수록 손실이 준다. 확률 예측이 정답과 가까워질수록 손실은 0에 수렴한다.
log-loss는 LR에 대해 convex하다. 지역 최적점에 빠지지 않는다. 전역 최적으로 수렴할 수 있다는 뜻이다. 이 성질이 LR을 대규모 데이터에서 빠르게 학습시킬 수 있는 수학적 근거다.
특성의 근거
앞서 정리한 세 가지 특성, 경량, 해석 가능, 확률 출력은 위 구조에서 그대로 따라 나온다.
경량
학습된 LR 모델은 결국 가중치 벡터 $w$와 편향 $b$ 한 쌍이다. 인퍼런스는 내적 한 번과 시그모이드 한 번. 피처가 백만 개든 천만 개든, 연산량은 피처 수에 선형이다. 트리 앙상블이나 신경망의 수많은 곱셈과 비선형 연산과는 비교할 수 없이 가볍다.
해석 가능
계수 $w_i$는 “피처 $i$가 1만큼 증가할 때 log-odds가 $w_i$만큼 변한다"는 뜻이다. 부호는 방향, 크기는 영향력을 말해준다. 광고 도메인에서 “어떤 피처가 클릭에 긍정적으로 작용하는가"를 알고 싶을 때, LR은 계수표 하나로 대답한다. 현업의 설명 책임에 적합하다.
확률 출력
많은 분류기는 ranking용 score만 출력한다. LR은 calibrated probability를 출력한다. 광고의 기대값 계산은 이 숫자를 그대로 곱할 수 있어야 한다. 예측 CTR × 입찰가 = 기대 수익. probability가 아닌 score는 입찰 공식에 바로 들어가지 못한다.
CTR 예측 적용
CTR 예측이라는 문제를 보면 LR이 선택되는 이유가 드러난다.
희소. 피처 대부분은 one-hot 인코딩된 카테고리다. 수백만 차원 중 몇 개만 1이고 나머지는 0이다.
고차원. 광고, 사용자, 컨텍스트의 조합은 수백만에서 수억 단위로 퍼진다.
대규모. 학습 데이터는 일 단위로 대량 축적된다.
LR은 이 세 특성과 정확히 맞물린다. 희소 벡터의 내적은 non-zero 항목만 계산하면 되므로 피처 차원이 커도 연산은 실제 값이 있는 수에 비례한다. 학습은 SGD(Stochastic Gradient Descent) 계열로 분산이 쉽다. 인퍼런스는 실시간 입찰의 타이트한 지연 예산 안에 들어간다.
CTR 모델을 처음 올리는 상황에서 이 특성들이 결정적으로 작용한다. 기준 모델을 빠르게 세우고, 학습 파이프라인, 서빙, 모니터링까지 전체 lifecycle을 먼저 검증하는 것이 우선이다. 복잡한 모델로는 그 검증이 지연된다.
한계와 다음 단계
LR이 기준 모델로 자리잡은 이유는 봤다. 이제 거기서 넘어가야 하는 이유를 볼 차례다.
가장 큰 한계는 비선형 상호작용의 부재다. 피처들끼리의 곱, 조건부 효과, 복잡한 결합을 LR은 스스로 발견하지 못한다. 사람이 feature engineering으로 미리 정의해야 한다. 피처 조합이 많아질수록 엔지니어링 비용은 커지고, 운영은 피처 설계 리뷰에 묶인다.
그래서 언제 넘어가는가. 데이터와 운영 여력이 “피처 엔지니어링으로 감당할 수 없는 지점"에 이를 때. Gradient Boosting Decision Tree는 상호작용을 스스로 학습한다. 신경망은 더 나아가 embedding으로 고차원 카테고리를 연속 벡터로 변환한다. 두 방향 모두 LR의 한계를 정확히 겨냥한다.
다만 시작점은 여전히 LR이 합리적이다. 기준 모델 없이 복잡한 모델부터 올리면, 무엇이 모델의 기여이고 무엇이 파이프라인의 기여인지 구분할 수 없다. LR이 준 숫자가 이후 모든 비교의 기준선이 된다.
z 의 통계적 의미 — logit
본문에서 계수가 “log-odds를 움직인다"고 했다. 그 log-odds가 무엇인지 짚어두면 LR의 점수를 다르게 읽게 된다.
선형 결합 $z = w \cdot x + b$ 는 시그모이드에 들어가기 전의 중간값처럼 보인다. 하지만 통계적으로는 그 자체로 의미가 있다. 시그모이드를 거꾸로 풀면 드러난다. 예측 확률을 $p = \sigma(z)$ 라 하면,
$$ z = \log \frac{p}{1 - p} $$$p/(1-p)$ 는 성공 확률을 실패 확률로 나눈 odds다. 거기에 로그를 씌운 값이 logit이고, 그게 곧 $z$다. LR이 내놓는 날것의 점수는 클릭의 log-odds를 직접 추정한 값이다.
이렇게 보면 계수 해석이 분명해진다. 피처가 1 늘면 $z$ 가 $w_i$ 만큼 움직이고, 이는 log-odds가 $w_i$ 만큼 이동한다는 뜻이다. 확률 공간에서는 비선형이지만 log-odds 공간에서는 선형이다. LR이 “선형 모델"인 자리가 바로 이 log-odds 공간이다.
fit 내부 — 수렴 루프와 solver
model.fit(X, y) 한 줄 안에서는 반복 루프가 돈다. 현재 가중치로 예측을 계산하고(forward), log-loss로 예측과 정답의 거리를 재고, solver가 그 손실의 gradient를 구해 가중치를 갱신한다. 손실이 더 줄지 않거나(tol) 정해진 횟수(max_iter)에 도달할 때까지 반복하고, 수렴하면 멈춘다.
가중치를 어떻게 갱신하느냐가 solver다. solver마다 데이터를 보는 방식이 다르다.
| solver | 방식 | 결정성 |
|---|---|---|
lbfgs (기본값) | 전체 배치 (quasi-Newton) | 결정론적 |
liblinear | coordinate descent | 결정론적 |
sag / saga | 확률적 (stochastic average gradient) | random_state 에 의존 |
lbfgs는 매 스텝에서 전체 데이터의 gradient를 한 번에 본다. 전체 지형을 펼쳐놓고 방향을 정하므로 무작위성이 없다. 같은 데이터·같은 초기값이면 매번 같은 가중치가 나온다.
saga·sag는 데이터를 샘플 단위로 훑으며 갱신하는 확률적 방식이다. 일부만 보고 방향을 정해 대규모에 강하지만, 샘플 순서를 섞는 무작위성이 들어간다. random_state를 고정하지 않으면 실행마다 가중치가 미세하게 달라진다.
liblinear은 이름과 달리 확률적 솔버가 아니다. coordinate descent 기반의 결정론적 솔버이고, 무작위성 측면에서는 오히려 lbfgs 쪽에 가깝다.
sample_weight 로 로그를 집계해 학습하기
CTR 예측처럼 하루 수천만 건씩 로그가 쌓이는 도메인에서는, row 하나하나를 그대로 학습기에 넣는 것이 큰 낭비다. 같은 피처 조합을 가진 노출이 수만 건씩 중복되기 때문이다.
LR의 선형 구조와 log-loss의 가법성 덕분에 이를 압축할 수 있다. 같은 피처 조합의 로그를 한 줄로 묶어, $y$ 에는 그 조합의 클릭률(CTR)을, sample_weight 에는 노출 수(impressions)를 넣는다.
model.fit(X, y, sample_weight=impressions)
이렇게 집계해 학습한 결과는 로그를 전부 펼쳐 학습한 것과 이론상 동일하다. 가중치 $W$ 도, log-loss 값도 같다. 근거는 손실 식에 있다. 노출 $n$ 건 중 클릭 $k$ 건인 그룹을 펼치면 손실은 $-[\,k \log \sigma(z) + (n-k)\log(1-\sigma(z))\,]$ 인데, 이는 $y = k/n$, weight $= n$ 으로 준 가중 손실과 정확히 같은 값이다. gradient가 같으니 최적해도 같다.
단, 이 동치성은 solver 특성과 맞물린다. 앞에서 본 lbfgs 같은 전체 배치·결정론적 솔버에서는 수식이 그대로 성립한다. 반면 saga 같은 확률적 솔버에서는 샘플링 단위가 “개별 로그"냐 “집계된 그룹"이냐에 따라 미니배치별 gradient 스케일이 달라져, 수렴 과정에 미세한 오차가 생길 수 있다. 정확한 동치가 필요하면 배치 솔버가 안전하다.
서빙 지연과 2-stage 파이프라인
LR을 떠나는 이유(비선형 상호작용의 부재)는 앞에서 봤다. 그런데 실무에서 LR은 완전히 밀려나지 않는다. 자리를 바꿔 남는다.
이유는 지연이다. 실시간 입찰처럼 한 요청을 5ms(0.005초) 안에 끝내야 하는 환경에서, LR의 “내적 한 번 + 시그모이드 한 번"을 따라올 모델이 없다. GBDT(Gradient Boosting Decision Tree, 대표적으로 LightGBM)는 수백 그루의 트리를 타야 하고, NN(Neural Network)은 행렬 곱이 여러 겹이다. 정확도를 조금 얻는 대신 지연을 더 쓴다.
그래서 현대의 대규모 추천·광고 시스템은 한 모델로 끝내지 않고 단계를 나눈다. 먼저 NN으로 수억 개 후보에서 수천 개를 추리고(Retrieval), 그다음 GBDT나 LR로 그 수천 개를 정밀하게 순위 매긴다(Ranking). 앞 단계는 넓게 훑고 뒤 단계는 좁게 정밀하다. 두 단계가 지연과 정확도의 서로 다른 지점을 맡는다.
지연 예산이 가장 빠듯한 마지막 랭킹 단계에서, 가장 단순한 LR이 여전히 후보로 남는다.
마무리
오래된 모델을 고른 데에는 이유가 있었다.
그 이유는 구조에 있다. 선형 모델과 시그모이드의 합성, log-loss의 convex성, 희소·고차원에서의 가벼움. 세 가지가 합쳐져 LR은 CTR 예측의 기준 모델로 오래 유지되고 있다.
다음 모델로 넘어갈 때가 오더라도, LR이 준 숫자는 기준선으로 남는다.