-
[NAVER DEVIEW 2021] Look-alike Modeling and Serving : 비슷한 사람 찾기 추천시스템Recommendation System 2023. 10. 31. 18:14
목차
네이버 2021 DEVIEW에는 여러 추천시스템이 공개되었는데, 그 중 비슷한 유저그룹을 찾는 방법에 대한 리뷰
- 영상 링크
- 자료 링크
1. What is Look-alike
- Look-alike (유사타겟) : 특정한 유저 그룹(seed)이 주어졌을 때, 해당 그룹과 비슷한 유저를 찾는 것
- 네이버 플랫폼은 see(광고주가 소유한 유저 정보)가 없기 때문에 임의로 seed를 만들어서 평가함
2가지 seed set (스마트스토어 방문자, 상품페이지 조회자)를 사용하여 오프라인 테스트 진행
- 네이버 플랫폼은 see(광고주가 소유한 유저 정보)가 없기 때문에 임의로 seed를 만들어서 평가함
- KPI : CVR(conversion rate, 전환수/클릭수), CTR(click through rate, 클릭수/노출수), CTCVR(CTR*CVR)
- 처리량 : 1억 이상의 유저(브라우저별 익명화된 유저, 쿠키)에 대해 유사도 계산을 10분 이내 진행
2. Model Architecture
- Real-time Attention Based Look-alike Model for Recommender System(링크) 의 아이디어 차용
- Offline : 사용자 행태 학습 후 embedding 저장
- Internal Data warehouse : 사용자 행태 log 데이터
- Data manipluation Batch service를 통해 log 데이터가 Feature로서 store에 저장됨
- 해당 Feature를 이용하여 User Embedding Model 학습 후 Embedding 값이 저장됨
- 정확도가 목표이며 오프라인에서 진행되는 것이므로, 긴 기간의 데이터를 이용하여 충분한 계신 시간을 통해 정확한 embedding값을 계산
- Online : 저장된 embedding을 이용하여 실시간 요청에 Look-alike learning을 진행
- 광고주에게 받은 Request Seed는 priority queue에서 우선순위를 설정하여 PU learning이 진행됨
- learning 및 inference가 끝난 결과물은 priority queue를 통해 광고주에게 전달
- 이 과정 전체가 일정 시간(최대 10분) 내로 진행되어야 하기 때문에 request가 쌓이지 않도록 빠르게 처리하는 것도 중요
3. Offline Part : User Embedding
- 목표 : User embedding vector 생성
- 목표(CTR, CVR, 노출, ROAS 등)에 따라 추출되는 특징이 달라짐. 네이버에서는 광고주의 목표가 CVR이었기 때문에 전환 행태에 초점을 맞춤
- Multi-class classification task
- Input : 쿠키별 사용자의 행동 데이터
- Label : 상품 카테고리 구매 여부.
- 여러 실험 결과를 통해서 전환행태에는 상품 카테고리 구매 여부를 label로 두는 것이 가장 적절하다고 판단
- 카테고리 약 600개 (IAB audience taxonomy - purchase intent 참고)
3-1. Dataset 생성
- Input : 쿠키별 사용자의 행동 데이터
- Label : 유저가 구매한 목록의 카테고리를 one-hot으로 labeling
- Negative Sampling
- 1:10 negative sampling
- input 데이터의 양을 늘리는게 아니라, label의 category를 600개 -> 10+1개로 sampling하여 computational cost를 줄임
- sampling distribution : random X, 카테고리가 자주 등장할수록 많이 sampling 되도록 수정
3-2. Model
1-1. categorical feature : one-hot vector -> embedding -> continuous vector -> average pooling
1-2. continuous feature : normalization (min-max, mean, stddev)
2. FC layer를 통해 차원 맞춰주기
3. Attention Merge Layer로 feature vector들을 합쳐줌. attention score를 이용하여 weighted sum을 진행.
- a : attention score matrix | 어떤 input이 들어오느냐에 따라 feature의 중요도를 연산하여 학습. 최종 weight 계산->sum
4. MLP (Multi Layer Perceptron)를 지나 최종적으로 User Embedding Vector가 만들어짐
5. Negative sampling을 진행했던 카테고리의 embedding matrix와 dot product -> 각 카테고리별 logit을 만들어냄
6. Softmax -> Cross Entropy로 loss 계산.
3-3. User Embedding 시각화
- 두 브랜드 내의 seed, ,추천, 구매는 비슷한 공간에 위치
- 두 브랜드의 user는 다른 성향을 보인다고 할 수 있는데, 마침 다른 공간에 나타나고 있음
4. Online Part : Look-alike Learning
- 목표 : Seed와 user embedding을 사용하여 가까운 사용자 set 반환
- Seed : 1,000 ~3M 사용자 셋 (1만~10만 권장)
- User Embedding : Offline part에서 생성
- 처리 속도 : 10분 이내 ASAP 완료
4-1. PU Learning
- 원래의 supervised learning에서는 positive와 negative example이 모두 존재하지만, 현재의 데이터는 positive와 unlabeled만 존재함. PU learning은 U를 positive와 negative로 분리하는 classifier를 만드는 것이 목표
- Positive example(P) : {Seed}
- Unlabeled example(U) : {전체 유저 - Seed} - 2-stage learning
- stage 1.
1. {U^1} : U 중에서 믿을만한 (reliable) negative를 찾는다.
2. P(positive)와 {U^1}(negative)을 학습하여 classifier 1을 만든다.
3. classifier1을 이용하여 {U-U^1} 을 구분한다.
4. 구분된 결과 중 positive를 {U^p}, negative를 {U^n}으로 표현한다. - stage 2.
5. {U^n}을 다시 샘플링하여 (아마 stage1에서 사용했던 reliable negative 방식같음) {U^2}를 만든다.
6. P(positive)와 {U^2}(negative)를 학습하여 classifier 2를 만든다. - 추천 유저 선별
7. classifier2을 이용하여 {U}에서 positive한 user를 찾는다. positive한 확률로 sorting하여 topK를 구함
- stage 1.
5. Service Part
5-1. 서비스 시스템
(Online learning에서 PUlearning이 진행되는데 spark의 MLlib이 사용된걸 보면, 간단하고 기본적인 classifier를 사용했다는 것일 듯.
spark classification algorithm 페이지 )
5-2. 최적화 (학습, 추론 속도 향상)
- Offline
- TF graph 최적화 : CPU 병목 제거, GPU Utilization 향상. non-TF python 코드 최소화, TF primitives 사용
- Data I/O 최적화 : tf.data api 사용으로 대용량 데이터 hdfs를 통해 학습 및 추론
- 결과 : 최적화 전 대비 학습 속도 600% 향상
- Online
- Spark Physical Plan 분석을 사용하여 결과는 같고 속도는 빠를 수 있도록 최적화
- 결과 : 최적화 전 대비 학습+추론 200% 향상
6. Expreiments & Results
6-1. Offline test
- 대상 광고 : 과거 배너광고(Display Ad) data를 활용. 14개의 카테고리. (뒤에 나오는 지표는 14개의 카테고리 결과 중 중간값을 보여주는 것)
- 실험 그룹
- 대조군 1 : non-target (전체 유저 대상)
- 대조군 2 : 2018년 look-alike 모델 (구모델, 유저 행동 vector 와 seed vector 사이의 거리를 계산)
- 실험군 : 현재의 look-alike 모델 (신모델) - 평가 지표 : CTCVR, CVR, CTR (중요도 순)
- CTCVR 결과
- 구모델은 non-target에 비해 2배 좋은 성능을 보이며, 신모델은 더 좋은 성능을 보임
- seed를 1M, 3M, 5M으로 확대할수록 cold user까지 실험군에 포함되게 되어 성능이 떨어짐을 보임
- 상품 상세페이지 조회자 seed보다, 스토어 방문자 seed가 더 성능이 좋음. 그만큼 seed의 선정이 중요함
6-2. Online test
- 결과적으로 약간의 ctr 손해가 있었으나, CTCVR과 CVR에서 500% 이상의 상승이 존재
- 다만, 2개의 광고 회사로 실험한 것이므로 일반화할 수 없음
6-3. 성능 개선 실험
- CTR 개선 실험
- 방법 : label을 기존 상품구매에서 -> 상품구매+광고클릭 으로 변경
- 결과 : CTR, CVR 소폭 하락
- 이유 1. 상품 구매가 클릭보다 CTR, CVR에 좋은 데이터
- 이유2. 성질이 다른 두 label을 함께 학습하여 난이도 상승, fitting이 잘 안됨
- 노출 수 개선 실험
- 활동성이 낮은 유저는 제거
- 결과 (아래 사진인데 무슨 말인지 잘 이해 안감)
Review
- 아이디어나 모델 자체는 심플하고 구현도 어려워보이지 않음
- 도메인마다 multi-class classification에 사용될 label을 무엇으로 둘 것인지에 대한 고민이 필요해 보임
네이버는 광고주의 광고를 볼법한 유저를 뽑는 것이므로, 광고주의 category를 label로 두었음 - Q. label을 negative sampling을 진행했다고 하는데, 그러면 데이터마다 label의 카테고리 종류나 순서가 달라지게 된다. 이게 어떻게 학습이 된다는건지 이해가 어렵다. 예를 들어 어떤 데이터는 [개, 고양이] 순서로 학습되면 어떤 데이터는 [고양이, 곰] 이렇게 학습된다는 것
- PU learning에 대해 알 수 있는 시간이었음. 좀 더 깊이 파봐야겠음
'Recommendation System' 카테고리의 다른 글
추천시스템 평가지표 | Offline Metric with Code (2) 2023.11.08 2023 트위터 X의 추천시스템 (Twitter's Recommendation Algorithm) (0) 2023.10.24 [NAVER DEVIEW 2023] 장소 기반 추천시스템, HyperLocal | 상황에 맞는 취향 장소 발견하기 (0) 2023.10.18 ChatGPT를 이용해서 추천시스템 만들기 (1) 2023.10.04 현업에서는 추천시스템 후처리(서빙전 필터링)를 어떻게 할까? (feat. 요기요, Spotify, LINER) (0) 2023.09.27 - Look-alike (유사타겟) : 특정한 유저 그룹(seed)이 주어졌을 때, 해당 그룹과 비슷한 유저를 찾는 것