인공지능 in 네부캠 AI 4기/추천시스템

인기도 기반 추천

제로타이 2022. 10. 11. 09:49

얼추 우리는 추천시스템이 무엇이고 목적이 무엇인지, 그리고 모델을 평가하는 지표도 간략하게 알아봤다. 이제는 추천시스템 중 가장 쉬운 방식인 인기도 기반 추천을 알아보자. 간단하게 생각하면 가장 잘 나가는, 대중성 있는 것을 추천하는 방식이면 얼추 될 것이다. 그래도 그 인기도가 무엇인지를 정의하는 방식에 따라 다양한 분기가 생길 수 있다. 
인기도라는 것이 단순히 하나의 지표로 결정되지는 않을 것이다. 조회수 많은 것을 기반으로 둔다면? 뉴스거리를 추천하는데 좋은 시스템이 될 것이다. 또는 평균 평점이 좋은 것을 기반으로 둔다면? 맛집 추천에 적격인 인기도가 될 것이다.

바로 위에서 예시를 들었지만, 크게 두 가지 방향으로 인기도의 척도를 지정할 수 있다. Most Popular와 Highly Rated.
각각에 위치하는 대표적인 공식들을 훑어보자.

Most Popular

가장 많이 조회된 것, Most Popular! 가장 많은 조회수이면서, 최신성도 고려해야 한다. 

Score Formula

$\Large score = (upvote - downvote) - time_elapsed = pageviews - time_elasped$

좋아요와 싫어요의 차이와 조회수를 얼추 동치시키면서 접근하는 것을 확인할 수 있는데, 내 개인적으로는 이게 정말 동치될 수 있는 것은 아닌 것 같다. 하지만 조회수를 단순히 페이지를 들어가본 사람의 수라고 생각하지 않고, (해당 글의 인기도를 측정하기 위해) 긍정적으로 보는 사람의 수라고 생각한다면 어느 정도 연결될 구석도 있는 듯하다.
뒤에 time_elapsed는 최신성을 나타낸다. 아무래도 조회수가 같은 아이템이라면, 최신의 것이 더 좋다는 것을 기반으로 공식이 만들어져있다. 뉴스를 생각해보면 쉬울 것이다!

근데 이렇게 단순하게 뺄셈을 한다면 시간이 지나는 것보다 조회수가 많이 늘어난다면 극단적인 경우에는 몇백 년 뒤에야 추천 대상이 바뀌게 될지도 모른다.. 당장의 급한 뉴스보다 조회수가 높다는 이유로 1년 전의 뉴스를 추천하는 뉴스 사이트를 생각해보라. 개선이 필요하겠지?

Hacker News Formula

$\Large score = \frac{pageviews - 1}{(age + 2)^{gravity}}$

위의 공식에서 조금 더 발전된 형태. 이 경우에도 시간이 오래된 것에 대해 나눗셈을 하며 값어치를 떨어뜨리는 방식으로 동작하는 것을 확인할 수 있다. 이때 분모에 상수지수인 gravitiy가 있다. 이 값을 어떻게 설정하냐에 따라 시간에 의해 값이 영향 받는 속도도 달라지게 될 것이다. 통상적으로는 1.8정도로 둔다는 듯.

Reddit Formula

$\Large score = \log_{10}(ups - downs) + \frac{sign(ups - downs) \times seconds}{45000}$

이건 레딧에서 쓰이고 있는 포스팅 글 추천시스템이라고. 앞에 있는 항은 위에서 본 조회수를 의미하고, 뒷항은 최근 포스팅 글에 더 높은 점수를 부여하는 것으로 설계되어 있다. seconds가 분자에 위치하는데 이것은 게시된 후 경과한 시간이 아니라 절대시간을 의미한다. 즉 늦게 게시될수록 이 값은 높다는 것. 이를 통해 높은 점수를 부여하는 방식!
첫값에는 왜 로그를 취했는가? 시간복잡도를 고려할 때 로그가 가지는 이점을 생각해보라. 좋아요와 싫어요의 차이가 커질수록 해당 값이 커지는 속도는 점차 줄어든다. 한번 인기글에 등록되고 나면 대체로 많은 사람들이 글에 몰리게 되고, 또 대체로 그러한 글들은 좋아요가 마구 눌리게 되어 점차 좋싫비가 커지게 된다(전에 말한 Long Tail 어쩌구와 연관됨). 그것을 고려해서 한번 로그를 씌워서 값의 크기를 조정해주는 것이다.

Highly Rated

방금까지 조회수를 기준으로 인기도를 결정짓는 공식을 보았다. 대체로 뉴스에 쓰이는 방식이기에 최신성을 중요하게 고려하는 모습을 확인할 수 있었다. 
이번에는 조회수 말고 높은 평점을 기준으로 하는 모델들을 보자. 위에서 최신성을 고려했던 것처럼 이쪽에서도 따져야할 문제들이 있긴 하다.

어떤 영화를 보고 싶니?

평점이 높은 기준으로 보면 E영화가 가장 볼만하겠지만, 평가 횟수를 보면 5개밖에 없다. 나라면 평가 횟수도 적절하게 많은 A영화를 선택할 것이다. 이처럼 평균 평점이 곧이곧대로 신뢰할 수 있는 평점인지, 그리고 평가 횟수는 충분히 많은 지가 고려되어야 할 중요한 요소이다.

Steam Rating Formula

$\Large avg\_rating = \frac{\#\ of\ positive\ reviews}{\# of\ reviews} $
$\Large score = avg\_rating - (avg\_rating - 0.5) \times 2^{- \log(\#\ of\ reviews)}$

avg_rating는 말 그대로 평균 평점 점수를 나타낸다. 근데 뒤에 복잡한 수식이 빼지고 있다.
괄호 안의 0.5는 중간값을 의미한다. 평균 평점이 중간값보다 작다면, 이 값은 음수가 될 것이고 이러한 식을 뺄셈하니 실제 score는 값이 조금 더 커지는 보정을 받게 된다. 반대로도 마찬가지로 평점이 높다면 낮춰지는 방향으로 보정을 받게 된다.
이 값이 2의 로그 제곱으로 곱해지는 것을 확인할 수 있는데, 이 값은 리뷰의 갯수가 많을수록 작아지게 된다. 즉 뺄셈으로 이뤄진 이 항은 리뷰의 갯수가 많으면 score에 영향을 거의 주지 않게 된다. 그렇지만 리뷰의 갯수가 적다면 평균 평점이 높을 때는 낮게, 낮을 때는 높게 보정해주는 작업을 해주는 것이다.
적은 데이터를 쉽게 믿을 수는 없으니 중간으로 갈 수 있게 살짝 보정을 한다는 느낌으로 생각하면 될 것 같다. 

Movie Rating

$\Large avg\_rating = \frac{sum(rating}{\# of\ reviews} $
$\Large score = avg\_rating - (avg\_rating - 3.0) \times 2^{- \log(\#\ of\ reviews)}$

이 공식을 이용해 영화 평점에 적용하는 방식. 단순히 좋싫비를 따지는 게 아니라 5분위의 평점에 대해서도 써먹을 수 있는 공식이다! 이번에는 괄호에서 3.0을 빼게 되는데 1점부터 5점까지의 중간값인 3을 빼주는 것을 확인할 수 있다. 여기에서 단순한 중간값이 아니라 모든 평점 데이터의 평균을 낸 후에 그 값을 빼주는 방식으로 써도 된다고 하는데, 그럼 처음 취지와 어긋나지 않으려나? 이 부분은 더 공부해봐야 알 듯.

'인공지능 in 네부캠 AI 4기 > 추천시스템' 카테고리의 다른 글

모델 기반 협업 필터링  (0) 2022.10.23
협업 필터링 개요  (0) 2022.10.19
컨텐츠 기반 추천  (0) 2022.10.18
연관분석  (0) 2022.10.15
추천 시스템 Basic  (0) 2022.10.11