Bucket Place/기타

[Ranking Algorithm] 인기순 알고리즘 (음원사이트 & Reddit basic & Hacker News)

Cloud Travel 2015. 9. 15. 14:05


1. 여는글


 어떻게 하면 질리지 않고(똑같은 화면이 반복되지 않고), 인기순을 최대한 반영해주는 페이지를 보여줄수 있을까? 


 컨텐츠를 관리하는 입장에서 한번씩 막히는 부분이 위와 같은 의문일 것이다. 처음에는 사이트내에 구현해 놓은 특정 수치(ex. 좋아요 횟수)가 높은 순으로 정렬해서 보여주었을 것이다. 하지만, 컨텐츠가 쌓여갈수록 인기있는 컨텐츠는 계속 상위에 노출되어 점점 더 높은 수치를 점유하게 되어 피드가 고정되는 현상이 일어날 것이다. 


 이 현상을 막기 위해서는 어떻게 하면될까? 답은 시간에 있다.



2. 음원 사이트에서의 인기순 생성


 간단한 인기순 알고리즘으로 넘어가기 전에, 인기순 정렬을 만드는 개념에 대해서 간단히 알아보고 넘어가보자. 인기순을 계산하는 예로 음원사이트를 생각해보았다.

 

 인기순에서 필요한 것중 가장 큰 것은 인기순에 사용할 값, 정렬 기준 값이다. 이는 각 사이트의 특성 및 마케팅 전략에 따라서 달라질 수 있으며 다양한 요소를 사용하면 기준값을 계산하는 공식이 생성되게 된다. 어떠한 사이트간에 기준값의 포함 요소로 사용되는 것은 사용자의 행동 패턴이다.  음원사이트에서 사용할 만한 행동요소가 어떤 것이 있는지 생각해보자.


 1) 음원 검색

 2) 음원 듣기 재생수

 3) 음원 다운로드

 4) 음원을 자신의 앨범에 담기

 5) 음원 좋아요 클릭 


 사용자의 행동패턴을 뽑아냈으면 다음으로 해야할 일은 어떤 행동을 인기순에 적용할 것인가를 정하는 것이다. 많은 회사들은 인기순을 좀더 사용자에게 친근하게 가져가기 위해서 사용가능한 왠만한 기준을 모두 사용한다. 하지만, 특정 목적에 따라서 사용할 사용자 패턴을 선택 할 수 있다. 예를 들어, 회사에게 이득을 많이 준 곡을 인기가 많다고 하겠다라는 기준이 있다면, 다운로드 수와 재생수를 사용하여 인기순 기준 공식을 세울 수 있다. 다른 예로, 회사의 이득도 중요하지만 사용자의 선택도 중요하다고 생각한다면 다운로드 수, 재생수, 앨범에 담은 수 그리고 좋아요 수를 이용하여 공식을 세울 수 있다.


 공식 제작에 필요한 요소를 선택했다면 각각 요소에 대한 가중치를 정해야 한다. 가중치는 사용자의 행동 비율을 이용하여 정할 수도 있고, 회사의 이득, 마케팅적인 요소에 따라서 많이 달라진다. 아래는 필자가 임이로 적용한 가중치 값이다.


 1) 음원 검색 x 1

 2) 음원 듣기 재생수 x 100

 3) 음원 다운로드 x 400

 4) 음원을 자신의 앨범에 담기 x 200 

 5) 음원 좋아요 클릭 x 150


 이를 이용하여 인기순 기준값을 정하는 공식을 정하면 아래와 같다.


  Score = search_count * 1 + play_count * 100 + download_count * 400 + add_album_count * 200 + like_count * 150


 이와 같이 생성된 공식을 이용하여 인기순을 정렬하면, 인기순 피드는 계속 변하지 않고 정착되어 있는 모습을 볼 수 있다.


그림1. 음원 사이트에서의 인기순 목록


 이제는 시간이라는 개념을 섞을 차례다. 시간을 어떻게 섞을 것인가? 


 1) 시간을 짤라보자

 가장 간단한 방법은 시간을 자르는 것이다. 시간을 자르는 것은 일간 / 주간 / 월간을 계산할때 사용하면 좋을 법한 방식이다. 인기순에 반영되는 사용자 행동 패턴이 발생한 시점을 이용하여 그 행위가 어제 / 지난주/ 지난달에 일어났는지 판단하여 각각의 요소에 사용하는 방식이다. 실시간의 경우에도 사용이 가능한데, 하루가 아닌 1시간 단위 또는 큰서비스의 경우 분단위로 짤라서 인기순을 계산하면 된다. 


 ex. 일간인기순

 Score = play_count_by_1day * 100 + download_count_by_1day * 400 + add_album_count_by_1day * 200 + like_count_by_1day * 150


 이와 같은 경우는 과거의 컨텐츠도 인기가 있다면 상위에 노출이 가능하게 된다. 또한, 특정 기간의 행동을 사용하여 점수를 계산하기 때문에 지속적으로 피드가 바뀔수가 있다. 


 2) Aging 기법을 사용한다.

 Aging 기법을 다른 말로 이야기하면 컨텐츠에 나이를 먹인다라고 생각하면된다. 이 방식의 기본적인 공식은 아래와 같다.

 

 AgingValue는 현재로부터 얼마나 컨텐츠가 오래됬는가를 기준으로 생성하는 값이다. 컨텐츠가 오래 될수록 AgingValue가 커져서 전체적인 값이 작아지게 된다. 이렇게 하면 오래된 컨텐츠는 아무리 인기가 높아져도 인기순 상위에 올라오기가 힘들어진다. 하지만, 나이가 먹은 컨텐츠가 뒤로 숨어버리기 때문에 인기순 피드는 지속적으로 변하게 된다.


 시간을 짤르는 방식은 쉽고 간단하게 적용할 수 있다. 하지만, Aging기법은 Aging을 어떻게 시키느냐고 큰 이슈이기 때문에 다양한 방법이 다양한 사이트에서 만들어지고 있다. Reddit 사이트에서 초창기에 사용했던 인기순 방식과 Hacker News 사이트에서 사용하는 인기순에 대해서 간단히 짚어보자.



3. Reddit basic ranking algorithms

 

 Reddit이 초창기에 사용한 인기순 공식이다. 이는 컨텐츠를 원하는 시점까지 피드에 노출시킬 수 있는 가능성이 있다.

 

 ** score: 기준에 의해 생성된 점수

 ** coolingRate : 얼마나 더 빨리 나이를 먹일 것인가 (음수이며, 기본모델의 값은 -8이다) 

 ** TimeDiff: 현재로부터 컨텐츠가 얼마나 지났는가 (시간/일/주/달 등 서비스에 맞게 계산하면된다.)

 ** DecayPoint : 컨텐츠 인기도가 떨어지는 시점(인기 피드에서 감춰지는 시점)


 시간의 개념을 사용할때 해당 컨텐츠가 DecayPoint를 지나면 인기도가 확떨어지게 된다. 예를들어, 주간 단위 인기순을 생성하여 DecayPoint가 1주일일 경우 아래와 같이 인기순 값이 정해진다.


그림2. Reddit basic ranking algorithms with decay


 decayPoint가 존재하지 않는다면 해당 컨텐츠는 계속 노출되어 계속 힘을 얻게 된다.(빨간선) 하지만, decayPoint를 적용하면 기 시점을 지나는 순간 급속도로 인기도가 하강하게 된다. 하강시에는 인기가 많을 수록 더 길게 살아 남게 되고 결국 0이 된다.


 이는 좋아보이지만 단점이 있다. 위 그래프와 같이 아무리 인기가 많은 컨텐츠도 나이가 먹으면 인기도가 0이된다. 0에 대해서 인기도를 파악할 또다른 근거가 필요하게 된다. 이는 인기순 피드에서 인기도가 0보다 큰값을 보여준다면 해결될 문제지만, 그렇다면 컨텐츠의 양이 급감할 수 있는 위험이 존재한다. 



4. Hacker News Algorithm


 Hacker News Algorithm에서 사용하는 인기순 공식이다. Hacker News는 시간단위로 인기순이 정해지는 알고리즘이다.


  

 ** score : 기준에 의해 생성된 점수

  ** gravity : 얼마나 Aging을 가속 시킬 것인가

  ** t : 컨텐츠가 생성되고 몇시간이 지났는가?


 score - 1의 의미는 unvote한 값에 대한 보정이라고 한다. 만약 자신의 서비스에 unvote기능이 없다면 -1은 할 필요가 없게된다.

 t + 2의 의미는 t가 0이거나 1일경우 Aging개념이 적용되지 않기 때문이다. ( 0^x = 0, 1^x = 1)

 gravity가 클수록 인기도가 더 빨리 하락하게 된다.


 이 공식의 장점은 Reddit basic ranking algorithms에서 발생한 단점을 보안할 수 있다. 오래된 컨텐츠는 0으로 수렴하지만 그 값이 0이 되진 않기 때문에 오래된 컨텐츠에도 인기도가 적용되어 모든 컨텐츠에 대해서 계산이 가능하게 된다. 그리고 사용자가 원하는대로 수정이 용이하다.


 이 공식의 단점으로는 놓친 컨텐츠의 순위는 회복되기가 힘들다. 모두가 자는 새벽에 올라온 컨텐츠는 무의미하게 나이를 먹기 때문에 자신의 힘을 발휘하기가 힘들다. 그리고 이렇게 인기가 있을 확률이 높지만 나이가 먹은 컨텐츠는 회복하기가 힘들다.



5. Hacker News Algorithm 변형


 여기부터는 우리 서비스에서 실제 사용했던 인기순 알고리즘의 변형판이다. 마케팅 및 컨텐츠 관리팀에서 다음과 같은 요구를 하였다.

 1) 일단위로 aging을 시키고 싶다. (기존은 시간단위)

 2) 최신순과 다른 feed를 보여주기 위해서 지금으로부터 24시간내에 올라온 컨텐츠는 맨마지막에 나오게 하고 싶다.(사실상 인기순에서 제외)

 3) 어제 올라온 컨텐츠의 힘을 강하게 해주고 싶다.


 그래서 변형한 Hacker News Algorithm은 아래와 같다.

  

 ** t : 컨텐츠가 생성되고 몇일이 지났는가? (float value, ex. 36시간 = 1.5)

  ** gravity : 얼마나 Aging을 가속시킬 것인가? (이는 컨텐츠팀과 직접 바꿔가면서 값을 정했다.)

  ** score : 기준에 의해 생성된 점수


  t + 1이 아닌 t인 이유 : 어제 컨텐츠에 대해서 힘을 더 많이 주기 위해서


 이를 적용하면서 Hacker News Algorithm의 단점을 어느정도 보안할 수 있었다. 시간 단위가 아니기 때문에 회복할 여지가 충분하게 부여됬다.



6. 마치며


 실제 음원 사이트에서는 위의 예시보다 복잡한 알고리즘을 사용하고 있을 것이다. 또한 Reddit이 현재 사용하고 있는 알고리즘도 매우 복잡해졌다. 각자의 사이트에 맞는 알고리즘을 생성하는 것이 가장 좋지만, 그것이 힘들다면 자신이 쓰기에 가장 알맞은 알고리즘을 가져와 변형하는 것도 하나의 방법이다. 


 인기순 알고리즘의 중요성중 하나는 실시간 여부이다. 초기 서비스의 상태에서 DB서버에 대한 scale-up이 어려울 경우에는 특정시간에 인기순을 계산하여 DB에 저장하는 것이 좋은 방법이 될 수 있다.


 인기순에 대해서 고민하는 사람들에게 이글이 조금이나마 도움이 되었기를 바란다~