추천 시스템 알고리즘

이 글은 원문 Recommendation System Algorithms by Daniil Korbut을 저자의 동의하에 번역한 글입니다. 흔쾌히 번역에 동의해 주신 저자 Daniil Korbut 님께 감사의 말씀을 드립니다.

많은 회사들은 빅 데이터를 활용해 추천 시스템을 개발하고 수익을 창출해 낸다. 데이터 사이언티스트는 다양한 추천 알고리즘 중, 비즈니스의 제한된 자원과 요구사항을 고려한 최적의 알고리즘을 선택해야 한다. 데이터 사이언티스트의 일을 돕기 위해 Statsbot 팀이 주요 추천 시스템 알고리즘에 대한 글을 준비했다.

협업 필터링 (Collaborative Filtering)

가장 흔하게 사용되는 추천 시스템 알고리즘은 협업 필터링(CF) 및 협업 필터링을 바탕으로 생겨난 다양한 알고리즘이다. 초보 데이터 사이언티스트도 이력서에 넣을 프로젝트로 간단한 영화 추천 시스템을 만들 수 있다.

유저에게 뭔가를 추천하고 싶다면 우선 유저와 공통된 관심사를 가진 사람들을 찾아야 한다. 그리고 그들의 행동을 분석하고, 해당 유저에게 비슷한 물건을 추천해 주면 된다. 다른 방법으로는 유저가 기존에 샀던 물건과 비슷한 물건을 찾고, 그 물건을 유저에게 추천해 줄 수 있다.

위 두 가지 방법 모두 협업 필터링을 사용했다: 순서대로, 사용자 기반 협업 필터링(user-based collaborative filtering)과 아이템 기반 협업 필터링(item-based collaborative filtering)이다.

두 추천 시스템 모두 두 가지 과정을 거친다:

  1. 데이터베이스에 특정 유저/물건과 비슷한 유저/물건이 얼마나 많은지 알아낸다.
  2. 제일 비슷한 유저/물건의 총점을 바탕으로 특정 유저/물건에게 제품의 사용자가 어떤 점수를 줄 지 예측한다.

여기서 말하는 “제일 비슷한”은 무엇인가요?

“제일 비슷한” 유저나 물건을 찾을 때는 각 유저의 선호도를 반영한 벡터(행렬 R의 가로줄)와 각 상품에 대한 유저의 평을 반영한 벡터(행렬 R의 세로줄)만을 가지고 시작한다.

Source.

두 벡터 중 공통적으로 아는 값을 집중해서 보자. 위 사진을 보면, Bill은 타이타닉을 보지 않았고 Jane은 배트맨을 보지 않았기 때문에 영화 스타워즈만을 가지고 그들의 유사성을 계산해야한다.

코사인 유사도(cosine similarity)상관관계(correlations)가 유저/물건의 벡터들의 유사도를 계산하는데 제일 자주 사용되는 방법이다. 계산된 유사도를 바탕으로 가중산술평균 값을 구해서 표의 빈칸을 채우면 끝난다.

추천을 위한 행렬 분해 (Matrix decomposition for recommendations)

다음은 행렬 분해를 사용한 추천 시스템이다. 우리는 보통 매트릭스 분해할 때, 완성된 결과의 행렬에 어떤 값이 남아있고 어떤 의미를 가졌는지에 대해 생각하지 않는다. 하지만 이 추천 엔진을 사용하게 되면 u가 i번째 사용자에 해당하는 벡터라는 것과 v가 j번째 사용자에 해당하는 벡터라는 것을 쉽게 알아차릴 수 있다. 때문에 필자는 이 시스템이 굉장히 우아한 추천 알고리즘이라고 생각한다.

Source.

벡터 uv의 내적 값을 구하면 i번째 유저가 j번째 영화에게 줄 점수인 x를 예측할 수 있다. 즉, 벡터에서 알고있는 값으로 모르는 값들을 구하고 예측하는 원리다.

예를 들어, 행렬 분해 후 유저 Ted를 위한 벡터(1.4; 0.9)와 영화 A를 위한 벡터 (1.4; 0.8)를 가진다고 하자. 여기서 두 벡터의 내적 값을 구하면 A-Ted의 점수를 구할 수 있다. 즉, 유저 Ted가 영화 A에게 줄 점수는 2.68로 예측될 것이다.

Source.

클러스터링 (Clustering)

지금까지 소개된 추천 알고리즘은 비교적 간단하고 소규모 시스템에 적합했다. 전부 지도 학습 바탕의 머신 러닝으로 구성된 추천 시스템이기 때문이다. 이제는 비지도 학습 바탕의 추천 시스템을 알아보도록 하겠다.

협업 필터링과 행렬 분해에 시간이 상대적으로 많이 들어가는 대규모의 추천 시스템을 만든다고 생각해보자. 그러면 머릿속으로 처음으로 떠오르는게 바로 클러스터링일 것이다.

비즈니스 초기에는 사용 가능한 유저 데이터가 많이 없기 때문에 클러스터링이 제일 좋은 방법일 수 있다.

하지만 실질적으로 클러스터링만을 사용해서는 효과적인 추천을 할 수 없다. 클러스터링은 유저들을 다양한 그룹으로 분류하고, 그룹 내에 모든 유저에게 같은 아이템을 추천해주는 것이 전부이기 때문이다. 물론 시작 단계에서 클러스터링을 사용하면 협업 필터링 알고리즘에서 다루는 아이템 양을 줄일 수 있다. 또한, 클러스터링을 사용함으로서 복잡한 추천 시스템의 성능도 발전시킬 수 있다.

쉽게 말하자면, 각 클러스터에 해당하는 유저의 성향에 따라서 클러스터의 성향/취향이 부여될 것이다. 그 후 각 클러스터에게 추천을 하는 시스템이다.

딥러닝 추천 시스템 (Deep learning approach for recommendations)

최근 10년 동안 신경망(neural network)은 빠르게 성장해나갔고, 이제는 전통적인 머신 러닝 방법을 대체하며 다양한 분야에서 적용되고 있다. 유튜브에서 사용하는 딥러닝 기반 추천 시스템을 소개하도록 하겠다.

당연히 큰 스케일, 다이나믹한 코퍼스(corpus), 그리고 예상하지 못한 외부 요인 때문에 유튜브 같은 서비스를 위한 추천 시스템을 만드는 것은 굉장히 복잡하다.

“Deep Neural Networks for YouTube Recommendations”의 분석에 따르면, 유튜브의 추천 시스템 알고리즘은 두개의 신경망(neural network)으로 이루어져 있다: 하나는 후보 생성(candidate generation)을 위해서, 다른 하나는 순위(ranking)를 매기기 위해서이다. 시간이 없는 분들을 아래 리서치 내용의 간단한 정리를 읽어보는 것을 추천한다.

Source.

후보 생성 네트워크(candidate generation network)는 유저의 기록을 인풋(input)으로 받은 후, 커다란 코퍼스(Corpus: 텍스트를 컴퓨터가 읽을 수 있는 형태로 모아 놓은 언어 자료) 중 관련성이 높은 영상들을 모아서 한 그룹으로 만들며 영상의 양을 현저히 줄이는 역할을 한다. 여기서 생성된 후보들이 우리가 추천해주려는 사용자와 제일 관련있다. 이 네트워크의 목표는 협업 필터링을 통해 더 폭넓은 개인화를 제공하는 것이다.

Source.

이제 후보 생성이 끝났으니 다루는 후보의 양도 훨씬 적다. 이번 단계의 목표는 순위 네트워크(ranking network)을 통해서 후보를 하나하나 더 세밀하게 분석하고 최선의 판단을 내리는 것이다. 순위 네트워크는 각각의 영상에 대한 유저 행동 데이터 분석하는 목적함수(objective function)를 만들어서, 각 영화에 대한 예측 평가 점수를 계산한다.

그리고 제일 높은 점수를 받은 영화가 유저에게 보이게 된다.

Source.

위 소개된 두 가지 단계 덕분에 이 알고리즘은 유저에게 수많은 영상 중 추천할 영상을 선정할 수 있고, 그 영상들이 유저에게 적합하고 관심가는 주제라는 것 또한 확신할 수 있다. 뿐만 아니라 딥러닝 기반 추천시스템은 다른 출처에서 생성된 영상도 혼합해서 추천할 수 있도록 설계되어있다.

Source.

이 추천 시스템은 특정 시간 t 안에 사용자(U)와 내용(C)을 기반으로 한 코퍼스(Corpus, V)에서 수백만 개의 비디오 클래스(i) 중 특정 영상 (wt)을 정확하게 분류할 수 있는 멀티 클래스 문제로 여겨진다.

추천 시스템을 만들기 전에 알아둘 점!

  • 만약 큰 데이터베이스를 토대로 온라인 추천 시스템을 개발하고 싶다면, 과정을 크게 1) 상위-N개의 후보(top-N candidates)를 고르고, 2) 순위를 매기는 것으로 나누는 것이 좋을 것이다.
  • 모델의 성능을 어떻게 확인 할 수 있을까? 표준적인 성능 측정 기준도 있지만, 추천 시스템만을 위한 측정 기준도 존재한다. 대표적으로 Recall@k and Precision@k, Average Recall@k, 그리고 Average Precision@k가 있다. 추천 시스템의 성능을 확인하는 기준에 대한 이 논문도 확인해보길 바란다.
  • 분류 알고리즘으로 추천 시스템을 만들게 되면 negative samples를 만드는 것을 추천한다. 주의할 점은, 추천된 아이템을 유저가 샀다고 해서 그 물건을 positive sample에 추가하고 나머지를 negative sample에 추가해서는 안된다.
  • 알고리즘 성능을 확인하기 위해서는 온라인 점수와 오프라인 점수를 둘 다 고려하는 게 좋다. 과거 데이터만으로 훈련된 모델은 최근 트렌드나 선호사항을 파악할 수 없기 때문에 원시적인 추천 밖에 못하기 때문이다.

--

--