'로컬' 슈퍼 앱에서 장기 유저 모델링은 어떻게 달라질까?
당근 ML Foundation 팀이 수백억 건 행동 로그를 별도 Transformer로 학습해 유저 임베딩을 공통 피처화, 지역 제약 배치 샘플링으로 Recall@10 +49~70% 개선
요약
당근 ML Foundation 팀이 장기 유저 모델링을 다운스트림 모델 외부로 분리. user encoder가 오프라인에서 수백억 건 액션 로그를 contrastive 학습 → 24시간 주기 유저 임베딩 갱신 → 홈피드·후보·광고 모델이 공통 피처로 재사용. 콘텐츠 임베딩 도입으로 cold item·GPU 메모리 문제 해결, RCBS(Region-Constrained Batch Sampling)로 impossible negative 98%→30%.
내용
추천 시스템에서 "유저가 지금 무엇을 원하는지"는 최근 행동에 잘 드러나지만, 매 겨울 패딩을 반복 검색하는 유저나 부동산→가구→이사 후기로 버티컬을 넘나드는 관심사는 단기 히스토리만으로 안 잡힘. selection bias 완화도 장기 관점이 필요.
다만 랭킹 모델은 latency 민감, 히스토리를 길게 넣으면 계산량·인프라 복잡도가 폭증. 결국 긴 데이터 + 잘 배우는 설계 + 서빙 가능한 구조를 동시에 풀어야 하는 문제. Pinterest, Meta, ByteDance 사례에서도 장기 히스토리 활용이 추천 성능에 큰 개선을 준 것이 보고됨.
해결 / 접근
구조 — 장기 유저 임베딩을 공통 피처로 분리
- 장기 히스토리는 별도 user encoder가 오프라인 학습·추론, 다운스트림(홈피드 랭킹·후보·광고)은 고정 벡터 피처로 받아 사용
- 다운스트림은 latency·복잡도 관리 쉬움, user encoder는 데이터·컴퓨팅 스케일 독립 확장 가능, 임베딩 1회 생성으로 여러 지면 재사용
- 한계: 표현력이 1개 피처 벡터로만 전달, 오프라인 배치라 freshness 제약
모델 — Two-tower + Causal Transformer + InfoNCE
- User Tower: 액션 시퀀스 → Causal Transformer → 유저 임베딩
- Item Tower: 아이템 피처 → MLP → 아이템 임베딩
- LLM이 다음 토큰 예측하듯, 매 시점 다음 액션 아이템을 예측 (in-batch negative)
- 학습 데이터: 중고거래·알바·부동산·중고차 클릭·전환 액션 — 기존 홈피드 two-tower 후보 모델 대비 약 150배
아이템 표현 — Item ID 임베딩 → 콘텐츠 임베딩 전환
- Item ID 방식 한계 1: cold item — 학습 후 생성된 아이템은 임베딩 없음. 중고거래처럼 아이템 생애주기 짧을 때 대응 까다로움
- 한계 2: GPU 메모리 — 수억 개 ID 임베딩 테이블이 전체 파라미터의 99% 이상 차지, Transformer는 1% 미만
- LLM 기반 콘텐츠 임베딩으로 전환: 메타 데이터로 새 아이템 임베딩 생성 가능, 임베딩 테이블 제거로 GPU 메모리 확보 → Transformer 파라미터를 ID 방식 대비 1,000배 확장
- 학습 시 메모리 문제 (수백 GB 임베딩 + 수억 건 ID→위치 매핑) 처리:
- memmap: 임베딩 파일을 디스크에서 필요한 부분만, DDP 시 OS page cache 공유
- bbhash (Minimal Perfect Hash): 키당 약 3비트, Python dict 대비 메모리 약 97% 절감
RCBS — 지역 기반 서비스의 in-batch negative 정제
- 당근 거래의 86% 이상이 반경 5km 이내, 강남 유저는 부산 매물 못 봄
- 랜덤 배치에서 약 98%가 impossible negative(노출 자체 불가능) — 모델이 "취향" 대신 "노출 불가능" 구분에 학습 신호 소모
- Region-Constrained Batch Sampling: 같은 지역 유저들로 미니배치 구성, 모델·loss 변경 없이 배치 구성만 변경
- impossible negative 비율 98% → 30%로 감소
- feasible negative는 "볼 수 있었는데 선택하지 않은" 아이템이라 harder negative — 같은 동네 비슷한 아이템 사이에서 진짜 취향을 구분
- 대안 비교: impossible mask out은 effective batch size가 극단적으로 작아져 비효율, hard negative mining은 유저별 feasibility 따로 mining 필요해 구현 복잡
다운스트림 적용
- 홈피드/광고 랭킹: projection layer 통과 후 기존 피처와 concat — 장기 시그널과 단기 실시간 시그널 역할 분리
- 홈피드/광고 후보(retrieval): 유저 임베딩만으로 후보군 제공이 가장 좋은 성능 — 다른 성질의 후보군이 다양성 기여
유저 임베딩 갱신 주기
- 오프라인은 고정 vs 12h vs 24h 차이 미미했으나 온라인 A/B는 주기 짧을수록 좋음
- 비용·성능 트레이드오프로 24시간 주기 결정
- GCP Dataflow + GPU 추론, 갱신 주기 안에 액션이 있었던 유저만 추론
결과 / 참고
오프라인 평가 (RCBS-Train fine vs Random-Train)
- Recall@10 Random-Eval에서 +49%
- Recall@10 RCBS-Eval(fine)에서 +70%
- impossible negative 비율이 낮을수록 Recall 일관되게 상승 — RCBS 직관 검증
- 같은 모델이라도 RCBS-Eval 점수가 Random-Eval보다 항상 낮음 — feasible negative가 harder negative임을 실험적으로 입증
온라인 A/B 누적 지표
- 클릭·노출, DAV(Daily Active Viewers), 앱 체류시간, 광고 매출 전방위 개선
- 중고거래 채팅·체류시간·DAV 증가 — 깊은 연결이 늘었다는 의미
메타
- 데이터 양: 수백억 개 유저 행동 로그 (기존 홈피드 two-tower 후보 모델의 약 150배)
- 인프라: GCP Dataflow, GPU 추론, beam pipeline
- 다음 과제: 유저 임베딩 추론 주기 단축, 실시간 추론에 가까운 갱신, 다운스트림 fine-tuning·distillation으로 표현력 추가 활용
- 출처: 당근 테크 블로그 — Hawke, Ben.Kim (ML Foundation 팀)
- 참고 사례: Pinterest (arxiv 2205.04507), Meta (2311.09544), ByteDance (2505.04421), Compositional Embedding (1909.02107), Unified Embedding (2305.12102)