||
안녕하세요! 당근 ML Foundation 팀에서 ML Engineer로 일하고 있는 Hawke와 Ben.Kim이에요. 저희 팀은 개인화 추천 개선을 위한 “기반 기술”을 만드는 역할을 하고 있어요. 이 글에서는 유저의 장기 행동 로그를 Transformer로 학습해 유저 임베딩을 만들고, 홈피드·광고 등 다양한 추천 모델에 적용해 큰 폭의 온라인 지표 개선을 달성한 여정을 공유하려고 해요.
왜 장기 유저 모델링이 필요할까?
추천 시스템에서 “유저가 지금 무엇을 원하는지”는 최근 행동에서 잘 드러나요. 하지만 서비스를 운영하다 보면 최근 행동만으로는 답하기 어려운 질문들을 계속 마주치게 돼요.
1. 단기 히스토리에 담기지 않는 지속 취향과 반복 관심사는 어떻게 반영할까요?
매 겨울 패딩이나 방한용품을 반복해서 검색하는 유저, 이사철마다 부동산 매물을 탐색하는 유저가 있어요. 최근 로그만으로는 이런 패턴이 드러나지 않아요.
2. 여러 버티컬을 넘나드는 유저의 관심사는 어떻게 파악할까요?
부동산에서 매물을 탐색하는 유저가 중고거래에서 가구·가전을 검색하고, 동네생활에서 이사 후기를 찾는 경우가 있어요. 하나의 관심사가 장기간에 걸쳐 여러 버티컬에 나타나는데, 일부 지면의 최근 데이터만 사용하면 이런 연결을 잡기 어려워요.
3. 추천이 만든 노출 로그만 학습하면 생기는 selection bias를 장기 관점에서 완화할 수 있을까요?
짧은 기간의 로그만 학습하면 “모델이 보여준 것만 다시 학습하는” 순환에 빠질 수 있어요. 장기 로그를 활용하면 여러 세대의 모델과 다양한 맥락에서 발생한 액션을 함께 보게 되어 이 순환을 완화할 여지가 있어요.
하지만 추천 모델에 히스토리를 더 길게 넣으면 단순히 해결되는 문제가 아니에요. 예를 들어, 랭킹 모델은 지연(latency)에 민감해 실시간 입력을 무한정 늘리기 어렵고, 히스토리를 길게 가져갈수록 계산량과 인프라 복잡도가 급격히 커져요. 결국 긴 기간의 데이터를 넣는 것 + 잘 배울 수 있도록 설계하는 것 + 서빙할 수 있게 만드는 것, 이 세 가지를 함께 풀어야 하는 문제예요.
Pinterest, Meta, ByteDance 등에서도 장기 히스토리 활용이 추천 성능에 큰 개선을 준 사례가 이미 보고되고 있었어요. 저희도 이 방향으로 가보기로 했어요.
우리가 택한 방향: 장기 유저 임베딩을 ‘공통 피처’로 만들자
저희가 선택한 접근 방식은 이래요. 장기 히스토리는 별도의 user encoder가 오프라인에서 학습하고 추론하고, 다운스트림 모델(홈피드 랭킹, 후보 모델, 광고 랭킹)은 이를 “공통 유저 피처”로 받아 쓰는 구조예요.
이 방식의 장점은 세 가지예요.
다운스트림 모델은 장기 히스토리를 직접 들고 있지 않아도 돼요. 지연과 복잡도를 관리하기 쉬워요.
User encoder는 데이터와 컴퓨팅 스케일을 독립적으로 키울 수 있어요. 다운스트림 모델을 건드리지 않고 user encoder만 스케일업하거나 실험할 수 있어서 실험 속도가 빨라지고, 모델 크기와 학습 데이터를 자유롭게 확장할 수 있어요.
한 번 만든 임베딩을 여러 지면에서 재사용할 수 있어요. 홈피드, 후보 모델, 광고 등 다양한 곳에서 동일한 유저 임베딩을 사용해요.
물론 이 구조에도 한계가 있어요.
user encoder는 수백억 건의 로그와 큰 Transformer로 학습되어 다운스트림 모델보다 훨씬 풍부한 표현력을 가지고 있지만, 다운스트림 모델은 이를 고정된 하나의 피처 벡터로만 받아쓰기 때문에 그 표현력이 충분히 전달되지 못해요.
오프라인 배치 추론 방식이기 때문에 유저의 최신 행동이 즉시 임베딩에 반영되지 않는 신선도(freshness) 문제가 있어요.
유저 임베딩 추론 주기를 줄여 실시간에 가까운 갱신을 하거나, 다운스트림 태스크에 대한 fine-tuning과 distillation으로 user encoder의 표현력을 더 끌어다 쓰는 것 등 이런 한계를 극복하기 위한 시도들은 앞으로의 과제로 남겨두고 있어요.
User Modeling with Contrastive Learni