[U Stage] Day15_추천 시스템 Basic 1

윰진·2022년 10월 11일
0

NaverAIBoostCamp정리

목록 보기
13/30

day15_20221011

1강 추천 시스템 Basic 1

GOAL

  • 추천시스템에 대한 간략한 소개
    • 추천시스템의 도전 과제
    • 사용할 수 있는 정보 및 데이터
    • 실제 추천 시스템이 적용된 사례
  • 추천 시스템 및 모델 평가 지표 소개
    • Offline Test : 수집된 데이터를 바탕으로 모델의 성능을 객관적인 지표로 평가
      • Precision@K, Recall@K, AP@K, MAP@K, 그리고 NDCG
    • Online Test
      • Online A/B Test : 추천 결과를 대조군(A)와 비교군(B)으로 동시에 유저들에게 서빙하여 둘 중 어느 쪽이 더 선호되는지 테스트
  • 인기도 기반 추천 기법 소개

추천 시스템이란

검색 : pull 방식, 사용자가 query 를 던져 데이터를 가져온다.
추천 : push 방식, 사용자의 흥미도를 고려하여 상품을 추천한다.


필요성 1 다양한 상품과 컨텐츠가 등장하여 Long Tail Phenomenon 이 발생

  • 인기있는 소수의 아이템만 많이 소비, 나머지 아이템은 적게 소비됨

필요성 2 정보를 찾는데 시간이 오래걸림

  • 어떤 키워드로 검색해야하는지 모를 수 있음

{\rightarrow} 인기있는 소수의 아이템 추천에서 개인화의 영역으로 발전하고 있음
{\Rightarrow} Long Tail 추천 : popular product 의 면적보다 long tail 면적이 넓어짐
- 사례 : 유튜브 인기 영상 추천, SNS 친구 추천 등


사용 데이터

유저 관련 정보

  • 유저 프로파일링
    추천 대상 유저에 관련된 정보를 구축하여, 개인 유저 혹은 유저 그룹별로 추천
    • 식별자 (Identifier)
      user id, 광고 추천에 사용되는 device id, 로그인 없이 브라우저 쿠키
    • 데모그래픽 정보
      성별, 연령, 지역, 관심사 (추정 정보를 활용하기도 함)
    • 유저 행동 정보
      페이지 방문 기록, 아이템 평가, 구매 등의 피드백 기록
      • 딥러닝이 발전하면서 유저가 어떤 서비스를 사용하고 어떤 행동을 했는지를 분석해서 더 정교한 추천을 할 수 있게 되었다.

아이템 관련 정보

추천 아이템 별로 고유 정보가 다르기 때문에 케이스 및 서비스 마다 사용하는 방법이 다르다.

  • content base recommendation
  • 아이템 ID
  • 아이템의 고유 정보 ( meta data )
    • 영화 : 장르, 출연 배우 및 감독, 소개글, 개봉년도
    • 상품 : 카테고리, 브랜드, 출시일, 상품 이미지
    • 음악 : 아티스트, 작곡가, 장르, 음악 신호 그 자체

유저 - 아이템 상호작용 정보

  • 유저와 아이템의 상호작용 데이터
    유저가 오프라인 혹은 온라인에서 아이템과 상호작용 할 때 로그로 남는다.
    추천 시스템을 학습하는 데이터의 feedback이 된다.
    • Explicit Feedback
      유저에게 아이템 만족도를 직접 물어본 경우
      예를 들어 영화 평점
    • Implicit Feedback
      유저가 아이템을 클릭하거나 구매한 경우
      - 상대적으로 데이터 양이 많다.
      - Implicit feedback 을 잘 모델링하는 것
      예를 들어 유저가 상품을 구매한 경우 implicit feedback = Y

추천 시스템 문제 정의

추천 시스템의 목적

목적 특정 유저/아이템에 적합한 아이템/유저를 추천한다.
{\rightarrow} 유저-아이템 상호 작용을 평가할 score 값이 필요하다.
문제 추천을 위한 score 는 어떻게 구하고 사용할까?

추천 문제 : 랭킹 또는 예측

  • 랭킹 ( Ranking ) : 유저에게 적합한 Top K 개의 아이템 추천
    Top K 개를 선정하기 위한 기준 또는 스코어가 필요하다.
    유저(X)가 아이템(Y)에 가지는 정확한 선호도를 구할 필요는 없다.
    • 평가 지표 : Precision@K, Recall@K, AP@K, MAP@K, 그리고 NDCG
  • 예측 ( Prediction ) : 아이템에 대한 유저의 선호도를 정ㅎ확하게 예측 ( 평점 또는 클릭/구매 확률 )
    Explicit Feedback , Implicit Feedback
    유저 - 아이템 행렬을 채우는 문제
    • 평가 지표 : MAE, RMSE, AUS

추천 시스템 평가

비즈니스 / 서비스 관점

매출이나 PV(Page View) 가 증가했는지 또는 유저의 노출 대비 클릭수가 증가했는지가 중요

품질 관점

연관성(Relevance), 다양성(Diversity), 새로움(Novelty), 참신함(Serendipity)

  • 참신함과 연관성은 서로 충돌할 수 있다.

Offline Test

테스트 데이터로 성능을 평가하는 단계로 새로운 추천 모델을 검증하기 위해 가장 우선적으로 수행되는 단계이다.

  • 유저로부터 수집한 데이터를 train/valid/test 로 나누어 모델의 성능을 객관적 지표로 평가
    • serving bias : offline model 에서 새로운 데이터가 추가되어 새로운 모델로 발전하는 것
  • 성능 지표
    • ranking : Precision@K, Recall@K, AP@K, MAP@K, 그리고 NDCG
    • prediction : MAE, RMSE, AUS

Online Test

Offline Test에서 검증된 가설이나 모델을 이용해 실제 추천 결과를 서빙하는 단계
Traffic 을 나눠 동시에 대조군(A)과 실험군(B)의 성능을 평가
{\rightarrow} 실제 서비스를 통해 얻어지는 결과를 통해 최종 의사결정이 이루어진다.
{\Rightarrow} 매출 및 CTR 등 비즈니스/서비스 지표 변화를 관찰

추천 시스템의 평가 지표 소개

실제 현업에서는 대부분 매출, CTR 등 비즈니스/서비스를 지표로 성능을 평가한다.
Ranking 문제의 metric 을 살펴 보자.

Precision/Recall @K

  • Precision@K
    추천한 K 개의 아이템 중에서 실제 유저가 관심있는 아이템 비율
  • Recall@K
    관심있는 전체 아이템 중에서 추천한 아이템 비율

예를 들어

  • 추천한 아이템 개수 : 5 (=K)
  • 유저가 관심있는 아이템 개수 : 2
  • 유저가 관심있는 아이템 전체 개수 : 3
    {\rightarrow} Precision@5 = 25{\frac{2}{5}}
    {\rightarrow} Recall@5 = 23{\frac{2}{3}}

Mean Average Precision(MAP) @K

추천된 K 개의 아이템 순서에 따라서 지표가 달라진다.

  • 선호 아이템을 더 높은 순위로 추천할 때 점수가 상승
  • AP@K
    Precision@K 와 달리, 관련 아이템을 더 높은 순위에 추천할수록 점수 상승
    AP@K=1mi=1KPrecision@i{AP@K = \frac{1}{m}\sum^K_{i=1} Precision@i}
  • MAP@K
    모든 유저에 대한 Average Precision 값의 평균
    MAP@K=1Uu=1U(AP@K)u{MAP@K = \frac{1}{|U|}\sum^{|U|}_{u=1}(AP@K)_u}

Normalized Discounted Cumulative Gain(NDCG)

Top K 리스트를 만들어 유저가 선호하는 아이템을 비교하여 값을 구한다. 추천 순서에 가중치를 주며 1에 가까울수록 좋은 성능으로 판단 ( 가장 많이 사용됨 )

참고 연관성을 수치로도 활용할 수 있음 {\rightarrow} 유저에게 얼마나 더 관련있는 아이템을 상위로 노출시키는지 알 수 있음

NDCG Formula

Cumulative Gain
상위 K개 아이템에 대해 관련도를 합한 것
CGK=i=1Kreli{CG_K = \sum^K_{i=1}rel_i}

Discounted Cumulative Gain
Cumulative gain 을 K개의 순서에 따라 log2(i+1){\log_2(i+1)}로 discount 함
DCGK=i=1Krelilog2(i+1){DCG_K = \sum^K_{i=1}\frac{rel_i}{\log_2(i+1)}}

Ideal DCG
가능한 DCG 값 중 가장 큰 것으로 이상적인 추천을 했을 때 DCG 값
IDCGK=i=1Krelioptlog2(i+1){IDCG_K = \sum^K_{i=1}\frac{rel^{opt}_i}{\log_2(i+1)}}

  • 유저의 relevant item 개수가 k보다 적을 경우가 존재함
    • 1) k = 5 riopt=1{r_i^{opt} = 1} 일 때, 유저의 relevant item 개수가 5개 이상이라면 idcg = (1/log2) + (1/log3) + (1/log4) + (1/log5) + (1/log6)
    • 2) k = 5 riopt=1{r_i^{opt} = 1} 일 때, 유저의 relevant item 개수가 3개라면 idcg = (1/log2) + (1/log3) + (1/log4)

★Normalized DCG
추천 결과에 따루 구해진 DCG 를 IDCG 로 나눈 값

  • 연관성을 0과 1 사이의 값으로 나타내는 척도
    NDCG=DCGIDCG{NDCG = \frac{DCG}{IDCG}}

예시

인기도 기반 추천 평가 지표

통계적으로 모든 사용자에게 좋은 평가를 받은 아이템을 추천

  • 데이터가 부족하거나 추천 모델 구축이 되지 않은 서비스 초기에 많이 사용
  • 척도 : 조회수, 평균 평점, 리뷰 개수, 좋아요 / 싫어요 수
- 인기도와 정보의 생성 시점도 함께 고려해야 한다.

score=f(popularity,age){score = f(popularity,age)}
score=(upvotedownvote)timeelasped{score = (upvote-downvote)-time_elasped}
score=pageviewstimeelasped{score = pageviews - time_elasped}

  • pageview 가 크게 늘어나면 시점에 관한 정보를 반영하기 어렵다.

Hacker News Formula

뉴스 추천 서비스 : 많은 사람이 본 뉴스 추천, 시간이 오래될수록 점수를 깎는다.

시간에 따라 줄어드는 score 를 조정하기 위해 gravity(=1.8) 라는 상수를 사용한다.

  • pageview 의 상승 속도가 age 상승 속도 보다 빠르다.
    score=pageviews1(age+2)gravity{score = \frac{pageviews - 1}{(age + 2 )^{gravity}}}

Reddit Formula

최근에 포스팅된 글에 더 높은 점수를 부여한다.

score=log10(upsdowns)+sign(upsdowns)seconds45000{score = \log_{10}(ups - downs) + \frac{sign(ups-downs)*seconds}{45000}}

  • popularity : log10(upsdowns){\log_{10}(ups - downs)}
  • 포스팅이 게시된 절대시간 : seconds
    • 나중에 게시된 포스팅일수록 절대시간이 크기 때문에 더 높은 score 를 가진다.
  • log10(upsdowns){\log_{10}(ups - downs)} : 첫 번째 vote 에 가장 높은 가치를 부여하고, vote 가 늘어날수록 score 의 증가 폭이 작아진다.
    • log 함수를 통해 vote 가 폭발적으로 증가하는 것을 보정해준다.
    • 오래된 포스팅일수록 상대적으로 많은 vote 가 있어야 높은 score를 가진다.

Highly Rated

문제 신뢰할 수 있는 평점인지, 평가의 개수가 충분한지에 대한 이슈가 있다.
{\rightarrow} 얼마나 많은 rating 이 구성되어 있는지가 중요하게 작용함

score=f(rating,#ofratings{score = f(rating, \# of ratings}

Steam Rating Formula

좋아요 개수가 평균 평점이 됨
# of reviews 값이 증가하면 score:=avg_rating{score := avg\_rating}
즉, rating 개수가 많이지면 평균 평점을 그대로 활용한다.

avg_rating=# of postivereviews# of reviews{avg\_rating = \frac{\#\ of\ postive reviews}{\#\ of\ reviews}}
score=avg_rating(avg_ratingmedian)2log(#ofreviews){score = avg\_rating - (avg\_rating - median)*2^{-\log(\# of reviews)}}

  • rating 은 평균값을 사용한다.
    • 전체 review 개수에 따라 rating 을 포정한다.
    • 0.5 보다 score가 낮거나 높을 경우 조금 높게 또는 낮게 보정
  • review 개수가 아주 많을 경우 score 는 평균 rating 과 거의 유사해진다.
  • median : 0.5 at steam rating , 3.0 at movie recommend

이 글은 커넥트 재단 Naver AI Boost Camp 교육자료를 참고했습니다.

0개의 댓글