Airbnb가 수백 개의 수작업 통계 피처에 의존하던 검색 랭킹을, 게스트의 이벤트 시퀀스를 Transformer 인코더로 학습하는 방식으로 바꾼 과정을 다룬다. 조회 이벤트가 데이터를 압도하고, 노이즈 속 희소한 예약 전환을 최적화해야 하며, 수억 쌍의 학습 비용이 크다는 세 난제를 장기·단기 이중 시퀀스 설계와 학습 효율화로 풀었다. 최종적으로 오프라인 NDCG 누적 +3.78%와 온라인 예약·조회 지표 개선까지 얻었다.
핵심 포인트- 수백 개 수작업 통계 피처의 한계를 극복하려고 게스트 이벤트 시퀀스를 Transformer 인코더로 직접 학습한다.
- 7년치 희소 이벤트를 담는 장기 시퀀스(최대 80개)와 최근 21일 조회를 담는 단기 시퀀스(최대 200개)로 분리 설계했다.
- 검색 배칭·시퀀스 버킷화·희소 계산으로 학습 처리량을 약 4배 높였다.
- 인코더는 일 배치로 임베딩을 미리 계산·저장하고, 랭킹 시점엔 저장 임베딩만 조회해 지연을 낮췄다.
- 3단계 A/B로 점진 배포해 오프라인 NDCG 누적 +3.78%, 온라인 예약자·조회 지표를 개선했다.
상세 정리- 배경: 기존 랭킹은 총 예약 수·평균 가격 같은 집계 통계에 의존했는데, 피처가 수백 개로 늘어도 복잡한 게스트 선호를 담기엔 표현력이 부족했다.
- 난제 셋: 조회 이벤트가 압도적으로 많아(일부 게스트는 수십만 건) 계산이 버겁고, SNS와 달리 노이즈 속 희소한 예약 전환을 최적화해야 하며, 수억 쌍 학습 비용이 크다.
- 장기 시퀀스: 예약·리뷰·취소처럼 드물지만 정보량 큰 이벤트를 7년 범위로 담고 최대 80개로 자르는데, 이 컷은 가장 긴 2% 시퀀스만 truncate한다.
- 단기 시퀀스: 최근 21일 리스팅 조회를 담고 최대 200개로 제한한다.
- 피처: 모든 이벤트가 공유 피처 풀을 쓰고, 리스팅·호스트 ID 같은 고카디널리티 ID와 계층적 지리 ID를 통합 임베딩 테이블로 표현한다.
- 효율화 배칭: 인과 마스킹으로 시퀀스를 누적 처리해 여러 검색이 인코더 forward 한 번을 공유하고, 각 검색을 대응하는 중간 임베딩으로 라우팅한다.
- 효율화 버킷화·희소 계산: 길이별로 시퀀스를 버킷화해 패딩 낭비를 줄이고, 패딩된 검색은 랭킹 계산에서 제거한다 — 세 기법으로 처리량 약 4배.
- 서빙: 시퀀스 인코더는 일 배치로 돌려 신규 이벤트가 있는 게스트의 임베딩만 갱신·저장하고, 쿼리 시 랭킹 모델이 저장 임베딩을 실시간 조회해 라이브 검색 맥락과 결합한다.
- 배포: 장기 시퀀스 단독 → 단기 조회 시퀀스 추가 → 시퀀스 인코더와 공동 학습한 setwise 랭커 도입 순으로, 각 단계를 보통 3주 A/B로 검증했다.
- setwise 랭커: 리스팅을 독립 채점하는 pointwise와 달리 후보 집합을 함께 보고 리스팅 간 상대 차이를 추론한다.
- 오프라인 결과(예약 라벨 NDCG): 장기 +0.44%, 단기 조회 추가 +1.48%, setwise +2.3%로 누적 +3.78%.
- 온라인 결과: 장기에서 미취소 예약자 +0.31%·조회 +0.38%, 단기 추가로 미취소 예약자 +0.55%·미취소 숙박 +0.82%·조회 +0.90%, setwise로 미취소 예약 +0.28%·예약 요청자 +0.32%.
- 재사용: 같은 시퀀스 임베딩을 그대로 프로모션 이메일에 적용해 미취소 예약자 +0.16%·미취소 숙박 +0.23%·이메일 클릭 +5.04%를 얻었다.
- 향후: 준실시간 임베딩 갱신, wishlist·지도 상호작용 같은 이벤트 확장, target-aware 랭킹, 생성형 추천, setwise 개선을 탐색 중이다.
왜 읽나대규모 검색·추천 랭킹에 사용자 이벤트 시퀀스 모델을 도입하려는 ML 엔지니어에게 설계·효율화·서빙 분리·배포 전략의 실전 레퍼런스.