로컬 슈퍼 앱에서 장기 유저 모델링은 어떻게 달라질까?
장기 로그로 학습한 유저 임베딩과 RCBS로 추천 성능을 크게 끌어올렸다.
최근 행동만으로는 반복 관심사, 여러 버티컬을 넘는 취향, 추천이 만든 selection bias를 충분히 잡기 어렵다. 하지만 히스토리를 무작정 늘리면 latency와 인프라 복잡도가 커지기 때문에, 긴 기간의 데이터, 잘 배울 수 있는 설계, 서빙 가능한 구조를 함께 풀어야 했다.
해결책은 장기 히스토리를 별도 user encoder가 오프라인에서 학습·추론하고, 이를 홈피드 랭킹, 후보 모델, 광고 랭킹이 공통 유저 피처로 재사용하는 구조였다. 이렇게 하면 다운스트림 모델은 장기 히스토리를 직접 들고 있지 않아도 되고, user encoder는 데이터와 컴퓨팅을 독립적으로 키울 수 있다.
user encoder는 two-tower 구조로 만들었다. User Tower는 유저의 액션 시퀀스를 Causal Transformer에 넣어 유저 임베딩을 만들고, Item Tower는 아이템 피처를 MLP로 임베딩한 뒤, 다음 액션 아이템을 맞히는 InfoNCE loss로 학습했다. 중고거래·알바·부동산·중고차 등 여러 버티컬의 클릭과 전환을 모두 사용했고, 기존 홈피드 two-tower 후보 모델보다 약 150배 많은 수백억 개 로그로 학습했다.
아이템 표현은 Item ID embedding과 content embedding을 비교했다. ID 기반은 냉시작과 GPU 메모리 문제가 컸고, 전체 파라미터의 99% 이상이 임베딩 테이블에 잡혀 Transformer를 키우기 어려웠다. 반면 LLM 기반 content embedding을 쓰면 새 아이템도 메타데이터만 있으면 표현할 수 있고, 임베딩 테이블이 사라져 Transformer를 1,000배까지 키울 수 있었다.
다만 수억 개 아이템의 콘텐츠 임베딩을 학습에 붙이는 과정이 또 큰 문제였다. 이를 memmap으로 디스크에서 필요한 부분만 읽고, 아이템 ID → 위치 매핑은 bbhash(minimal perfect hash)로 처리해 Python dict 대비 메모리를 약 97% 줄였다.
가장 흥미로운 지점은 지역 기반 서비스에서의 contrastive learning이었다. 당근에서는 거래의 86% 이상이 반경 5km 이내에서 일어나기 때문에, 랜덤 배치의 약 **98%**가 유저가 애초에 볼 수 없는 impossible negatives였다. 즉, 모델은 취향이 아니라 노출 불가능 여부를 구분하는 데 학습 신호를 낭비하고 있었다.
이를 해결하기 위해 모델과 loss는 그대로 두고 배치 구성만 바꾸는 **Region-Constrained Batch Sampling (RCBS)**를 적용했다. 같은 지역의 유저들끼리 배치를 묶어 feasible negatives 비율을 높였고, impossible negatives는 **98% → 30%**로 줄었다. 같은 동네의 비슷한 아이템들 사이에서 구분해야 하므로 feasible negatives가 더 어려운 negative가 되었고, 평가에서도 RCBS-Eval이 Random-Eval보다 더 낮게 나와 이 점을 확인했다.
배치에서 impossible negatives를 마스킹하면 effective batch size가 너무 작아지고, hard negative mining은 유저별 feasibility를 따로 고려해야 해서 복잡도가 높았다. 반면 RCBS는 배치 샘플링만 바꿔도 더 어려운 negative를 자연스럽게 만들 수 있어 더 단순하고 효율적이었다.
다운스트림 적용은 홈피드/광고 랭킹에는 유저 임베딩을 projection layer 뒤에 concat하는 방식으로, 후보(retrieval)에는 유저 임베딩만으로 후보군을 만드는 방식까지 시도했다. 특히 후보군에서는 유저 임베딩만 쓰는 구성이 가장 좋았고, 서로 다른 성질의 후보가 다양성을 높이는 효과가 있었다.
유저 임베딩 갱신 주기도 실험했다. 오프라인에서는 고정, 24시간, 12시간 갱신 간 차이가 크지 않았지만, 온라인에서는 주기적 추론이 고정보다 좋고, 더 짧은 주기가 더 좋았다. 비용과 성능의 균형을 고려해 24시간 주기로 결정했고, GCP Dataflow 위에서 GPU 추론하는 beam pipeline으로 필요한 유저만 다시 임베딩했다.
오프라인 pretraining에서는 RCBS-Train(fine)이 Random-Train보다 Recall@10 +49%(Random-Eval), +70%(RCBS-Eval fine) 개선을 보였다. 다운스트림 태스크에서도 RCBS-Train(fine) 임베딩이 일관되게 더 좋았고, 온라인 A/B 테스트에서는 클릭, 노출, DAV, 앱 체류시간, 광고 매출까지 여러 지표가 함께 개선됐다.
이 요약은 원문 이해를 돕기 위한 큐레이션입니다. 저작권은 원저작자에게 있으며, 정확한 내용과 맥락은 원문을 확인하세요.
요약 오류, 출처 표기 문제, 삭제 요청은 문의 · 건의로 알려주세요.
