ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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 (스마트스토어 방문자, 상품페이지 조회자)를 사용하여 오프라인 테스트 진행
      • 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를 구함

      classifier2로 추천 유저 선별

       

      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에 대해 알 수 있는 시간이었음. 좀 더 깊이 파봐야겠음

       

      댓글

    Designed by Tistory.