추천 시스템을 더 똑똑하게: 반사실 평가로 A/B 테스트 줄이기
추천 시스템을 만들다 보면 이런 생각이 한 번쯤 들죠.
“지금 모델이 진짜 좋아서 클릭이 오른 걸까,
아니면 원래 그런 사용자들이라서 그렇게 보이는 걸까?”
오늘은 이 질문에 정면으로 답하려는 접근법,
바로 추천 시스템을 위한 ‘반사실(counterfactual) 평가’를 이야기해 보겠습니다.
이 글에서는
오프라인 평가가 근본적으로 갖고 있는 한계
A/B 테스트만으로는 부족한 이유
IPS, CIPS, SNIPS 같은 반사실 평가 기법이 어떻게 일하는지
실제 추천 시스템 팀에서 어떻게 활용하면 좋은지
를 쉽고 재미있게 풀어볼게요.
오프라인 평가는 왜 실제 성능을 잘 못 맞출까?
보통 추천 시스템에서는 로그 데이터를 모아서 오프라인에서 모델을 평가합니다.
예를 들어 이런 식이죠.
“지난달 사용자 A에게는 X, Y, Z를 추천했고 Y를 클릭했다.
우리 새 모델이 그때도 Y를 상위에 올렸다면, 잘한 거네!”
문제는 바로 여기 있습니다.
이 방식은 사용자가 ‘이미 본 아이템’에 대한 데이터만 가지고 새 추천을 평가합니다.
즉, 과거에 추천 시스템이 노출해 준 아이템들에 대해서만 평가가 가능합니다.
당연히 이런 질문에는 답을 못합니다.
“그때 우리 시스템이 X 대신 전혀 다른 아이템 W를 보여줬다면,
사용자는 W를 더 좋아하지 않았을까?”
즉, 추천이 가지는 ‘개입’의 본질을 완전히 무시하고 있는 셈입니다.
실제 환경에서는 추천 시스템이 사용자의 선택 가능성을 바꾸는 ‘행위자’인데,
오프라인 평가는 이를 단순히 관찰된 데이터 문제로만 취급하는 거죠.
그래서 이런 일이 뻔하게 벌어집니다.
오프라인에서 A 모델 > B 모델
실제 A/B 테스트에서는 B 모델이 매출, 클릭, 유지율에서 더 좋음
데이터 과학자 입장에서는 꽤 허탈한 순간입니다.
왜 이런 괴리가 생길까요?
핵심은 데이터 자체가 “편향된 관찰 결과”라는 점입니다.
인기 있는 아이템은 더 자주 노출 → 더 많은 클릭/구매 → 더 좋아 보임
상단에 노출된 아이템은 더 많이 클릭됨 → 위치 편향
특정 기간에만 푸시된 아이템은, 푸시 전략의 영향을 같이 먹고 있음
즉, “사용자가 좋아해서 일어난 결과인지”,
“시스템이 그렇게 보여줘서 일어난 결과인지”가 섞여 있습니다.
전통적인 오프라인 평가는 이것을 분리하지 못합니다.
그래서 온라인 A/B 성능과의 갭이 생기는 것이죠.
“진짜로 보여줬다면?”을 묻는 반사실 평가의 등장
이 문제를 가장 직접적으로 해결하는 방법은 명확합니다.
바로 A/B 테스트입니다.
A 그룹: 기존 추천 정책
B 그룹: 새로운 추천 정책
실제 클릭, 구매, 체류 시간 같은 KPI를 비교
이게 이상적인 “개입 실험”이긴 하지만, 현실적인 제약이 많습니다.
실험 셋업, QA, 모니터링까지 리소스가 많이 듦
잘못된 추천을 대량 노출할 위험
여러 실험을 동시에 돌리기 어렵고, 속도도 느림
그래서 나온 아이디어가 반사실(counterfactual) 평가입니다.
이 접근은 이런 질문을 시뮬레이션합니다.
“과거 그 순간에, 기존 추천 대신 새 모델의 추천을 보여줬다면
실제로 클릭/구매 결과가 어떻게 달라졌을까?”
물론 과거를 다시 돌릴 순 없습니다.
대신, 로그에 남아 있는 “누가, 무엇을, 어떤 확률로, 어떻게 봤는지” 정보를 이용해
통계적으로 그 결과를 추정하는 겁니다.
이걸 가능하게 만드는 핵심 도구가 바로 반향 확률 점수(IPS, Inverse Propensity Scoring)입니다12.
IPS, CIPS, SNIPS: 수식보다 직관이 먼저다
이름만 들으면 엄청 어려워 보이지만,
IPS의 아이디어는 놀라울 만큼 단순합니다.
조금 과장해서 말하면 이렇습니다.
“로그 속의 각 클릭을,
‘원래는 얼마나 보기 어려웠던 상황인지’에 따라
더 크거나 작은 가중치로 다시 세자.”
조금 더 직관적으로 설명해 보겠습니다.
1. IPS의 직관: 희귀한 노출일수록 크게 본다
어떤 아이템이 과거에 노출된 확률(노출 가능성)을 p라고 합시다.
기존 시스템이 그 아이템을 자주 보여줬다면 →
p는 크다거의 안 보여줬다면 →
p는 작다
IPS는 각 상호작용(예: 클릭)에 1/p라는 가중치를 곱합니다.
자주 노출된 아이템 클릭 → p가 크므로 1/p는 작다 → “조금만 반영”
잘 안 노출된 아이템 클릭 → p가 작으니 1/p는 크다 → “크게 반영”
이 과정을 모든 로그에 적용해서
“새 추천 정책으로 갔을 때의 기대 성과”를 추정합니다12.
결과적으로, 과거 정책이 잘 봐주지 않던 아이템들의 정보를
더 정직하게 반영할 수 있게 됩니다.
이게 바로 ‘선택 편향’을 교정하는 역추정(inverse) 방식입니다.
2. 그런데, IPS에는 두 가지 큰 문제가 있다
실전에서 IPS를 돌리면 바로 두 가지 벽에 부딪힙니다.
첫 번째는 지원(support) 부족입니다.
새 모델이 추천하는 아이템 조합이,
과거 정책에서는 거의 혹은 아예 나타나지 않았던 경우입니다.
과거 로그에 그런 상황이 거의 없으니
가중치를 계산할 수 없거나,
계산해도 근거가 너무 빈약해집니다.
두 번째는 변동성(variance) 폭발입니다.
노출 확률 p가 너무 작으면 어떻게 될까요?
어떤 샘플은 1/0.01 = 100
어떤 샘플은 1/0.001 = 1,000
이런 값들이 섞여 평균을 내면,
추정치는 샘플 몇 개에 의해 심하게 출렁거립니다.
현업 입장에서는
“실험마다 결과 수치가 들쭉날쭉해서 도무지 믿기 어렵다”는 상황이 됩니다.
3. CIPS와 SNIPS: 실전용으로 다듬어진 변형들
이 문제를 완화하려고 등장한 것이 CIPS(Clipped IPS)와
SNIPS(Self-Normalized IPS) 같은 변형 기법입니다1.
둘 다 기본 정신은 IPS와 같지만,
“너무 위험한 가중치”를 누르는 장치를 둔 버전이라고 보면 됩니다.
CIPS: 너무 큰 가중치는 잘라낸다
CIPS는 말 그대로 가중치 상한을 정해 ‘클리핑’합니다.
가령 1/p가 1000이어야 하는 샘플이 있어도
상한을 100으로 정해 두었다면,
“100까지만 인정”하고 잘라버립니다.
이렇게 하면 몇 개의 극단적인 샘플이 전체 추정을 휘둘러 버리는 상황을 막을 수 있습니다.
하지만, 상한값을 어떻게 잡을지는
데이터 도메인
트래픽 규모
노출 정책
등에 따라 다르기 때문에, 튜닝이 필수입니다.
SNIPS: 전체를 비율로 다시 정규화한다
SNIPS는 한 단계 더 나아가서,
“가중치의 합으로 다시 나누는” 방식으로 자기 정규화를 합니다.
쉽게 말해,
각 샘플에 IPS 가중치를 곱해 성과를 계산하고
모든 가중치의 합으로 전체를 한 번 더 나눕니다.
이렇게 하면 극단적인 가중치가 있어도
전체 스케일 안에서 상대적으로 눌리는 효과가 생깁니다.
여러 연구 결과에서, SNIPS가 별도 설정 없이도 오차율이 가장 낮았다는 보고가 많고1,
실제 추천 시스템 연구들에서도 가장 실용적인 선택지로 평가됩니다2.
결론만 요약하면 이렇습니다.
순수 IPS → 이론적으로는 깔끔하지만, 실무에서는 너무 출렁거릴 수 있다
CIPS → 변동성은 줄지만, 상한값 튜닝이 까다롭다
SNIPS → 튜닝 부담이 적으면서도 안정성과 정확도가 가장 균형 잡혀 있다
오프라인 반사실 평가, 어디까지 믿을 수 있을까?
그렇다면 이제 질문은 이것입니다.
“IPS, SNIPS로 오프라인 반사실 평가를 했는데,
이걸 가지고 A/B 테스트를 안 해도 될까?”
현실적인 답은 “완전한 대체는 아니다”입니다.
반사실 평가는 어디까지나 “관찰 데이터 기반 추정”입니다.
몇 가지 전제가 깔려 있습니다.
과거 추천 정책이, 새 정책이 탐색하려는 영역에 어느 정도는 노출을 했을 것
로그에 노출 확률(또는 그에 준하는 정보)을 꽤 정확하게 기록하고 있을 것
사용자 행동에 영향을 주는 주요 요인들이 로그 변수들에 잘 반영돼 있을 것
이 전제가 크게 깨지면,
IPS 계열 추정치는 이론적으로도 신뢰도가 떨어질 수 있습니다.
그래서 요즘 연구 흐름에서는
반사실 평가를 이용해 후보 모델을 많이 좁힌 뒤
마지막에 소수의 유력 후보만 A/B 테스트로 검증하는
하이브리드 전략이 널리 쓰입니다12.
또 하나 흥미로운 흐름은,
랭킹/추천을 학습하는 단계에서부터 반사실 접근을 통합하는 것입니다.
예를 들어, 검색·추천에서 랭킹 정책을 배울 때
사용자 클릭 로그에 IPS 가중치를 적용해,
위치 편향 같은 것을 제거하면서 랭킹 모델을 학습하는
“CLTR(Counterfactual Learning to Rank)” 연구들이 최근 활발합니다1.
심지어 대규모 실서비스처럼
후보군 생성기 + 랭커로 이루어진 2단계 추천 시스템에 대해서도,
두 단계를 함께 고려해서 오프라인에서 공동 정책 가치를 추정하는 반사실 추정기가 제안되고 있습니다1.
이는 “후보 생성기는 새로 바꿨는데, 랭커는 예전 로그 기반으로 학습된 상태라 분포가 틀어진다” 같은 문제를 줄이는 데 도움을 줍니다.
실무에서 반사실 평가를 도입하는 3단계 로드맵
이제 “그럼 우리 서비스에는 어떻게 써볼까?”가 궁금하실 겁니다.
복잡한 이론 다 빼고, 실무에서 바로 적용 가능한 관점으로 정리해 보겠습니다.
1단계: 로그 설계부터 ‘반사실 친화적’으로 바꾸기
반사실 평가의 전제는 “과거에 어떤 정책이 어떤 확률로 무엇을 보여줬는지”입니다.
따라서 로그에 최소 다음 정보를 넣어 두면 좋습니다.
추천이 내려간 시점의 정책 버전 / 모델 ID
각 아이템이 노출되도록 선택된 확률(또는 점수에서 추정 가능하게 하는 정보)
슬롯(위치), 노출 여부, 클릭/구매 여부
만약 확률을 정확히 남기기 어렵다면,
아이템 점수 분포와 샘플링 방식(softmax, ε-greedy 등)을
재생산할 수 있게 로깅해 두는 것도 방법입니다.
이 단계만 잘 해 놓아도,
나중에 IPS, SNIPS를 적용할 수 있는 기반이 생깁니다.
2단계: 오프라인 관찰 평가 + 반사실 평가를 같이 돌려보기
기존에 하던 평가(Recall@K, NDCG, Hit Rate 등)에
IPS/SNIPS 기반의 반사실 지표를 추가로 계산해 보세요.
예를 들어,
기존 Recall@20
SNIPS-조정 Recall@20
을 나란히 비교해 보면 흥미로운 패턴이 보일 수 있습니다.
특정 모델은 기존 Recall는 높지만, SNIPS 기준에서는 성능이 떨어지는 경우
→ 인기 아이템에 과하게 의존했을 가능성반대로 SNIPS 기준에서 성능이 잘 나오는 모델
→ 덜 노출된 아이템을 잘 발굴하는 모델일 수 있음
이렇게 해서
“오프라인 관찰 지표 vs 반사실 지표 vs A/B 결과” 간의 관계를
몇 번 경험적으로 쌓아두면, 점점 감이 생깁니다.
3단계: A/B 테스트의 ‘입구 필터’로 활용하기
마지막 단계에서는 반사실 평가를
A/B 테스트 대기열의 필터로 쓰는 전략을 추천합니다.
예를 들어,
수십 개의 후보 추천 모델을 만든 뒤
오프라인 관찰 지표 + SNIPS 지표 모두 일정 기준 이상인 모델만 추려
그 중 소수만 실제 트래픽에 올려 A/B 테스트
이렇게 하면,
실험 갯수를 줄여 리소스를 절약하고
‘터무니없는 후보’를 미리 탈락시켜
사용자에게 나쁜 추천을 대량 노출할 위험을 줄일 수 있습니다.
또한 온라인에서 A/B를 돌린 뒤,
그 결과를 다시 로그로 축적해
다음 세대 반사실 평가의 질을 높이는 선순환도 만들 수 있습니다.
시사점: 추천 시스템, 이제 “무슨 일이 일어났을까?”가 아니라 “일어났을 수도 있었던 일”을 본다
정리해 보면, 추천 시스템의 반사실 평가는
단순히 새로운 수학 장난이 아니라, 실제 비즈니스 의사결정의 질을 끌어올리는 도구입니다.
전통적인 오프라인 평가는
“이미 일어난 일”만 보고 모델을 평가합니다.반사실 평가는
“그때 다른 추천을 했더라면 어땠을까?”를 통계적으로 추론합니다.IPS, CIPS, SNIPS 같은 기법은
이 추론 과정에서 발생하는 편향과 변동성을 줄여 줍니다.A/B 테스트를 완전히 대체하진 못하지만,
후보 모델을 좁히고 실험 리스크를 줄이는 강력한 보완재가 됩니다.
흥미로운 건, 이 접근이 추천 시스템에만 국한되지 않는다는 점입니다.
광고, 가격 정책, 콘텐츠 노출 전략, 심지어는 정신 건강 서비스 배분 정책 같은 분야에서도
“새로운 정책을 실제로 적용하기 전에, 과거 데이터를 이용해 오프라인에서 미리 시뮬레이션”하는 연구들이 진행되고 있습니다34.
결국, 질문의 수준이 달라집니다.
“이 모델이 과거 데이터에선 잘 맞았다”에서
“이 모델이 앞으로 개입할 세상을, 과거를 바탕으로 최대한 공정하게 예측했다”로.
추천 시스템을 운영하고 있다면,
다음 리팩토링 스프린트 때 로그 설계와 반사실 평가 도입을 한 번 고민해 보세요.
A/B 테스트를 더 똑똑하게, 더 안전하게 쓸 수 있는 기반이 되어 줄 겁니다.
참고
1Towards Two-Stage Counterfactual Learning to Rank
2Accurate and Diverse Recommendations via Propensity-Weighted Linear Autoencoders
4Using Propensity Score Matching to Measure Down Stream Causal Impact of an Event
이 노트는 요약·비평·학습 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.